• 0
Mars M

Узнать размер видеопамяти

Вопрос

Как можно узнать размер видеопамяти под WIN?

В инете находятся решения через реестр, с помощью DX и другие, но все сообщения старые.

Может есть какой способ узнать средствами FMX?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

11 ответов на этот вопрос

  • 0

Для Cuda тут https://github.com/nicehash/NiceHashMiner/tree/master/CudaDeviceDetection , 

для OpenCL тут https://github.com/nicehash/NiceHashMiner/tree/master/AMDOpenCLDeviceDetection

код на сях, но перевести на Delphi думаю не очень сложно.

Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Спасибо, ссылки в любом случае полезные. Но, если я правильно понял, там придется SDK устанавливать на клиентском компе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
7 минут назад, Mars M сказал:

Спасибо, ссылки в любом случае полезные. Но, если я правильно понял, там придется SDK устанавливать на клиентском компе.

Нет, ни в коем случае. Если стоят драйвера на видеокарту, то все будет работать. Можете попробовать запустить у себя бинарники и проверить, они выдают JSON на стандартный вывод, вот такой примерно:

[
    {
        "DeviceID": 0,
        "VendorID": 5208,
        "VendorName": "Gigabyte",
        "DeviceName": "GeForce GTX 960",
        "SMVersionString": "5.2",
        "SM_major": 5,
        "SM_minor": 2,
        "UUID": "GPU-f4867f81-dcc8-0f28-fbc2-b350e7927c22",
        "DeviceGlobalMemory": 4294967296,
        "pciDeviceId": 335614174,
        "pciSubSystemId": 918426712,
        "SMX": 8
    }
]

Нужный параметр DeviceGlobalMemory.

Бинарники можно взять из архива https://github.com/nicehash/NiceHashMiner/releases/tag/1.7.5.10 , называются AMDOpenCLDeviceDetection.exe и CudaDeviceDetection.exe.

Если переведете код в Delphi, буду безмерно благодарен. Сейчас в нескольких проектах (мониторинг "отваливания" карт) использую внешний вызов этих exe, что несколько неудобно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 1

Вместо утреннего кофе, уперся рогом и сделал получение информации через CUDA, тесовый проект прилагаю.

В режиме отладки работает отлично, вижу размер видеопамяти, но потом вылетает с access violation (при обращении к визуальным компонентам или просто при продолжении работы). В чем дело понять не могу, сначала грешил на FMX, но проект на VCL выдает те же симптомы. Очень, очень странные дела...

Код простой, используется cudaRT.pas из CUDA wraper Паскуда https://code.google.com/archive/p/pascuda/source/default/source и cudart32_65.dll идущая вместе с драйверами NVIDIA

Var CudaDeviceProp : TCudaDeviceProp;
    hDevice: Integer;
    GPUMemorySize : Cardinal;
    LMessage : String;
begin
  hDevice:=0;
  if CudaGetDeviceProperties(CudaDeviceProp, hDevice)=ceSuccess then
  begin
    GPUMemorySize:=CudaDeviceProp.TotalGlobalMem  div 1024 div 1024;
    LMessage:=Format('GPU Memory size = %d Mb', [GPUMemorySize]);
    Memo.Lines.Add(LMessage);
  end;

 

test099 Cuda Info VCL.7z

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
6 часов назад, Евгений Корепов сказал:

Очень, очень странные дела...

Скачал с инета cudart32_41_28.dll, с ней все нормально.

Мне кажется что запись TCudaDeviceProp в разных версиях пишется по разному.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
15 минут назад, Mars M сказал:

Скачал с инета cudart32_41_28.dll, с ней все нормально.

Мне кажется что запись TCudaDeviceProp в разных версиях пишется по разному.

аналогично, все прекрасно завелось с этой либой

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
20 минут назад, Mars M сказал:

Скачал с инета cudart32_41_28.dll, с ней все нормально.

Мне кажется что запись TCudaDeviceProp в разных версиях пишется по разному.

Действительно. Мог бы я и сам догадаться - функция возвращает куда больший кусок памяти чем описано структурой, вот лишние данные и залезают в память выделенную под другие нужды.

Вот тут описание структуры http://docs.nvidia.com/cuda/cuda-runtime-api/structcudaDeviceProp.html#structcudaDeviceProp и видимо под каждую версию Cuda она своя.

Или таскать именно cudart32_41_28.dll с приложением.

Изменено пользователем Евгений Корепов
Brovin Yaroslav понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Проще таскать с собой наверное. Иначе придется отслеживать какая версия у пользователя, ну и разницу в версиях учитывать в коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Вот так вот вроде работает:

Скрытый текст

  TCudaDeviceProp = packed record
    Name: array[0..256 - 1] of AnsiChar;
    TotalGlobalMem: Cardinal;
    SharedMemPerBlock: Cardinal;
    RegsPerBlock: Integer;
    WarpSize: Integer;
    MemPitch: Cardinal;
    MaxThreadsPerBlock: Integer;
    MaxThreadsDim: array[0..3 - 1] of Integer;
    MaxGridSize: array[0..3 - 1] of Integer;
    ClockRate: Integer;
    TotalConstMem: Cardinal;
    Major: Integer;
    Minor: Integer;
    TextureAlignment: Cardinal;
    texturePitchAlignment: Cardinal;
    DeviceOverlap: Integer;
    MultiProcessorCount: Integer;
    kernelExecTimeoutEnabled: Integer;
    integrated: Integer;
    canMapHostMemory: Integer;
    computeMode: Integer;
    maxTexture1D: Integer;
    maxTexture1DMipmap: Integer;
    maxTexture1DLinear: Integer;
    maxTexture2D: array[0..2 - 1] of Integer;
    maxTexture2DMipmap: array[0..1] of integer;
    maxTexture2DLinear: array[0..3 - 1] of Integer;
    maxTexture2DGather: array[0..2 - 1] of Integer;
    maxTexture3D: array[0..3 - 1] of Integer;
    maxTexture3DAlt: array[0..2] of integer;
    maxTextureCubemap: Integer;
    maxTexture1DLayered: array[0..2 - 1] of Integer;
    maxTexture2DLayered: array[0..3 - 1] of Integer;
    maxTextureCubemapLayered: array[0..2 - 1] of Integer;
    maxSurface1D: Integer;
    maxSurface2D: array[0..2 - 1] of Integer;
    maxSurface3D: array[0..3 - 1] of Integer;
    maxSurface1DLayered: array[0..2 - 1] of Integer;
    maxSurface2DLayered: array[0..3 - 1] of Integer;
    maxSurfaceCubemap: Integer;
    maxSurfaceCubemapLayered: array[0..2 - 1] of Integer;
    surfaceAlignment: Cardinal;
    concurrentKernels: Integer;
    ECCEnabled: Integer;
    pciBusID: Integer;
    pciDeviceID: Integer;
    pciDomainID: Integer;
    tccDriver: Integer;
    asyncEngineCount: Integer;
    unifiedAddressing: Integer;
    memoryClockRate: Integer;
    memoryBusWidth: Integer;
    l2CacheSize: Integer;
    maxThreadsPerMultiProcessor: Integer;
    streamPrioritiesSupported: Integer;
    globalL1CacheSupported: Integer;
    localL1CacheSupported: Integer;
    sharedMemPerMultiprocessor: Cardinal;
    regsPerMultiprocessor: Integer;
    managedMemory: integer;
    isMultiGpuBoard: integer;
    multiGpuBoardGroupID: Integer;
  end;

 

Только нужно будет закомментировать строчку

assert(sizeof(TCudaDeviceProp) = 540, 'sizeof(TCudaDeviceProp) <> 540');

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Подтверждаю, все заработало! Круто! ;-) Хоть и не в тему топика, но хочу какие нибудь вычисления замонстрячить!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Подниму тему. CUDA конечно хорош(а?), но только для nvidia.

Наткнулся тут на работу с OpenCL в делфи http://www.delphisources.ru/forum/showthread.php?t=28188

Там по ссылке в первом сообщение в принципе все есть что нужно. Кому оттуда не удобно перезалил все файлы https://yadi.sk/d/t3mPqlJT3HnfiX

Вот пример использования https://yadi.sk/d/bmDKXZ0k3Hnfny

Проверял на картах nvidia и ati, конечно же карты должны поддерживать OpenCL.

Если в MyOpenCL.pas чего то не хватает, можно взять это в CL.pas из GLScene https://sourceforge.net/p/glscene/code/HEAD/tree/trunk/Source/ParallelAPIs/

Я например добавил константу   CL_DEVICE_LOCAL_MEM_SIZEэ

А можно использовать родные CL.pas и CL_Platform.pas, в первом архиве есть пример использования.

В 03.05.2017 в 20:29, Евгений Корепов сказал:

Хоть и не в тему топика, но хочу какие нибудь вычисления замонстрячить!

В архиве как раз есть рабочий пример вычислений :)

Изменено пользователем Mars M
Andrey Efimov, Rusland и Евгений Корепов понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: hryasch
      Добрый день. Существует одна проблема, с которой уже несколько недель не могу справиться. Есть старый код под WinAPI, его нужно переделать под Android через firemonkey. И главная проблема - есть код, который из собственного формата делает HBITMAP из WinAPI. Фактически это структура, где последнее поле - указатели на биты. Это переделать легко, создав собственную копию такой структуры. Но теперь мне нужно перевести ее в TBitmap, и я не очень понимаю как это сделать.
       
    • Автор: Pax Beach
      Мне нужно сделать снимок экрана из своего приложения в приложении DirectX (в игре).
      По-быстрому накидал приложение, исходники здесь: MakeScreenshot-Forum.zip

      1. по нажатию единственной кнопки будет выполнена серия из 16 снимков экрана. Если запущен Скайп, то фотографироваться будет содержимое его окна.
      2. По нажатии CTRL+ALT+F9 будет сделан единичный снимок
      3. Label внизу показывает сколько миллисекунд затрачено на вывод снимка
      4. В комментах так же вы найдете, как работать со снимками через буфер обмена.
       
      Работа выполняется через GetDC(NULL);
      Windows 10 x64. Снимки делаются. И DirectX тоже нормально фотографируется.
      НО! только в оконных приложениях.
      Если приложение DirectX полноэкранное, то на всех снимках одна и та же картинка с первого снимка.
      То есть изменение буфера экрана в приложении ни как не отражается на снимках.
       
      Что нужно? Необходимо делать снимки конкретного приложения через интерфейс DirectX, а точнее, я так понимаю, через DirectShow. Тогда не будет разницы в окне оно или на полный экран.
      Помогите плиз, знающие люди, с решением этой задачи.
      Гарантирую вам от сообщества большой почет, от меня огромный респект, если это принесет доход, то еще и очень приятный бонус.
       
      Ссылки теме:
      1. DIRECTX FOR DELPHI
      2. unofficial version of DelphiX
      3. DirectX для начинающих
      4. MinHook - The Minimalistic x86/x64 API Hooking Library
      5. Various methods for capturing the screen
      6. Вывод графики на рабочий стол Windows с использованием оверлеев DirectX
      7. Project JEDI
      8. Реализация перехвата вызовов API — исчерпывающе про внедрение DLL, если разобраться, + это на Delphi
      UPD:
      9. Серия видео уроков Пишем D3D-хук — все понятно, только в Delphi перенести нужно.
      UPD 2:
      Научился рисовать в Direct3D и ловить интерфейс IDirect3DDevice9. Теперь делаю DLL ловушку для реализации снимков.
       
    • Автор: Pax Beach
      Привожу пример готового FMX приложения, которое рисует на форме с помощью интерфейса IDirect3DDevice9.
      В примере реализован вызов анонимного метода Present() интерфейса IDirect3DDevice9, имея ссылку на интерфейс и порядковый номер метода.
      Данная реализация пригодится при установке ловушек (Hooks).
       
      Вкратце, суть реализации такая:
      Объявляю процедурный тип нужного метода
      type   TPresent9 = function(pSourceRect, pDestRect: PRect; hDestWindowOverride: HWND; pDirtyRegion: PRgnData): HResult of object; stdcall; Объявляю переменную этого типа
      var   PPresent: TPresent9; begin   ...   IntRefToMethPtr(d3d9Dev, PPresent, 17);   PPresent(nil, nil, DParametrs.D3DPP.hDeviceWindow, nil); Реализую процедуру получения метода интерфейса по номеру
      procedure IntRefToMethPtr(const IntRef; var MethPtr; MethNo: Integer); type   TVtable  = array [0 .. 999] of Pointer;   PVtable  = ^TVtable;   PPVtable = ^PVtable; begin   // QI=0, AddRef=1, Release=2, etc   TMethod(MethPtr).Code := PPVtable(IntRef)^^[MethNo];   TMethod(MethPtr).Data := Pointer(IntRef); end; А теперь получаем метод интерфейса по его порядковому номеру и вызываем его
        IntRefToMethPtr(d3d9Dev, PPresent, 17);   PPresent(nil, nil, DParametrs.D3DPP.hDeviceWindow, nil); Благодарю за оценку этого решения на StackOverflow.
       
      Скачать пример: D3DDemo.zip
    • Автор: msp888
      Если Wi-Fi на телефоне работает в режиме клиента (подключается к внешней точке доступа), то как с ним работать понятно.
      Если же Wi-Fi на телефоне (ОС Android) работает в режиме персональной точки доступа, то как из программы получить свой ip-адрес и другие параметры сети.
      Кто знает, помогите, желательно исходный код на Delphi.
    • Автор: msp888
      Если Wi-Fi на телефоне работает в режиме клиента (подключается к внешней точке доступа), то как с ним работать понятно.
      Если же Wi-Fi на телефоне (ОС Android) работает в режиме персональной точки доступа, то как из программы получить свой ip-адрес и другие параметры сети.
      Кто знает, помогите, желательно исходный код на Delphi.
       
    • Автор: Равиль Зарипов (ZuBy)
      Ссылка: http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html
      Автор: Зарипов Равиль @ZuBy
      Описание: Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]
      В предыдущей  части , я рассказывал как сделать настройку пуш уведомления в консоли Firebase, в этой я покажу код на Delphi и серверную часть на PHP
      https://github.com/rzaripov1990/PUSHTestFCM
    • Автор: denprox
      Доброго времени суток! Подскажите, как узнать оригинальный размер картинки, загруженной в TImage ?
    • Автор: AliZairov
      Привет. Я сделал macos установку web installer с Delphi Berlin.

      Программа дает .bpl ошибка открытия файла.

    • Автор: denprox
      Доброго времени суток! Пытаюсь сделать мини аналог Paint'a с помощью FMX. Необходимо реализовать всего 2 компонента: Кисть и Заливка. С кистью вроде пока сложностей нет, а вот с заливкой не ясно. В VCL было как-то так: 
      .Canvas.FloodFill(x, y, bmp.Canvas.Pixels[x,y], fsSurface); В документации нашел описание различных видов заливок, но все они заливают какую то заданную область. Мне же необходимо заливать область одного цвета.  
      Есть ли у кого примеры реализации подобной задачи ?
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу