Перейти к содержанию
  • Регистрация
  • 0
Mars M

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

Вопрос

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

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

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

 

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


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

Рекомендуемые сообщения

  • 0

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

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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 с приложением.

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 07.05.2017 в 10:00, Mars M сказал:

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

Это я этот пример выложил более года назад. Пример проверяет вашу конфигурацию на наличие разл. GPU (выдаёт их списком), инициализирует всё что необходимо на видео-акселераторе, создаёт массивы памяти на GPU, закачивает в них исходные данные из памяти CPU. Главное не забудьте, что рядом с файлом *.exe должны лежать текстовые файлы *.cpp (они при запуске передаются видеодрайверу на компиляцию). Если в них - в коде для GPU (Kernel, текстовом файле) на языке C99 есть ошибки - они будут показаны в "чёрном" окне. Потом выполняются в цикле несложные, но длительные операции.

Причём это делается и на GPU (с контролем времени), и на CPU: чтобы убедиться в корректности вычислений. Папка со словом Slow в названии - это пример использования Atomic-функций (например, если надо найти среднее по большому массиву данных). В своих научных программах Atomic-функции стараюсь избегать: замедляют расчёты, "фирменные" atomic работают только с целыми. Использую вместо них barrier.

Месяца 3 назад NVIDIA наконец-то начала переход со стандарта OpenCL1.2 на 2.0. Жаль, что такие интересные возможности OpenCL 2.0, как Pipes (трубы для обмена данными между модулями) NVIDIA (как и их любимая CUDA) пока не поддерживают... Только AMD даёт полноценную поддержку OpenCL 2.0 (только при размере видеопамяти более 2Gb!), а NVIDIA полностью совместима только с версией 1.2.

В общем, будут вопросы - пишите: работаю только в связке Delphi/OpenCL уже давно. Кстати, в среде RAD Studio очень удобно редактировать одновременно и код Delphi-pascal, и C-код для OpenCL.

 

=====

Дополню (конец декабря 2017). Внутри той же  ссылки для скачивания добавил папку:

OpenCL_Demo2017 Barrier and Local_Memory REDUCT


В ней новый пример под Delphi XE8 64bit (работает и при компиляции в Delphi под Win32, но с ограничениями, о которых будет сказано ниже). Отличия:

  1. Добавлен пример простейшей редукции с использованием barrier и LocalMemory с обилием комментариев внутри Kernel-файла ProgramGPU1.cpp
  2. Показано, как внутри Kernel создать а-ля динамический массив (стандарт языка OpenCL 1.2 этого не позволяет).
  3. Главное. На форме добавлены Gauge-компоненты, показывающие:

    • общую загрузку CPU ;
    • загрузку CPU данной задачей ;
    • загрузку GPU (общую);
    • загрузку контроллера памяти GPU ;
    • проценты использованной памяти GPU ;
    • температуру GPU (в текстовом виде).

Для определения загрузки GPU используется nvml.dll  (мануал 2017), так что последние 4 параметра определяются только для карт NVIDIA, и при компиляции в Delphi под 64bit. Эта динамич. библиотека для каждой карты NVIDIA - своя, обычно при установке драйвера карты она попадает в папку

C:\Program Files\NVIDIA Corporation\NVSMI\nvml.dll (этот путь прямо прописан в прилагаемом примере по ссылке).

Всё что связано с определением загрузки CPU-GPU находится в отдельном модуле ProcessorUsage.pas, который может быть применён и для других программ (без OpenCL).

  1. Если есть желание попробовать OpenCL не только на видеокартах, но и на процессорах INTEL, надо поставить драйвер
  2. Ещё раз напоминаю, что при запуске *.exe рядом с ним должны лежать два текстовых файла *.cpp - они будут отправлены на компиляцию драйверу видеокарты!

Буду весьма признателен, если кто-то подскажет способ измерения загрузки памяти GPU от AMD (загрузку GPU, его температуру, скорость FAN и т.д. уже знаю, как программно определить и для AMD тоже: использую atiadlxx.dll . Есть похожая DLL или иной способ определения свободной/использованной памяти именно для AMD?


Всех с наступающим Новым годом!!

Изменено пользователем Vladimir PRO
Добавка в текст

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


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

Обновлённая ссылка на DEMO:
http://gofile.me/2Zesj/fbsharing-C0f3wb1o
Последняя версия в папке:
OpenCL_Demo2018 Barrier and Local_Memory REDUCT Delphi Tokyo 10.2.2 !! LAST !!

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Похожий контент

    • От Дмитрий Потапов
      Задался идеей написания IPTV приложения "для себя", в котором при желании смог бы реализовать что-то необходимое и удалить то, что не нужно.
      Собственно вопрос в другом: Я написал простое приложение, которое отлавливает коды кнопок с пульта, приложение по сути самое банальное, использует OnKeyDown и OnKeyUp (чисто для теста). И по нажатию на кнопку на пульте высылает например в Memo или ListBox Информацию о нажатой кнопке (включая ее код).
      Но суть в том, что далеко не все кнопки таким образом распознаются. Для примера:
      Кнопки громкости, назад, домой, увеличение\уменьшение громкости, стрелки(влево, вправо, вверх, вниз) и центральная кнопка (по совместительству OK).
      Цифры все определяются, как одна - 0
      Кнопки, которые не определяются (не срабатывает событие, ибо если был бы неизвестен код, то думаю, в таком случае получил бы все, кроме кода кнопки), но по нажатию кнопки, которая не определяется приложением - ничего не происходит вообще.
       
      Вопрос: Есть ли возможность как-то "научить" приложение распознавать эти кнопки? (Я где-то читал, может даже и здесь, что это все так реализовано именно на уровне самого FireMonkey, будто этих кнопок вообще не существует).
      Если эта тема уже поднималась на форуме или вопрос очень просто решается - извиняюсь)
    • От slav_z
      Показать/скрыть сенсорную клавиатуру Windows.
      unit Lib.Keyboard; interface uses Winapi.Windows, Winapi.ActiveX, System.Win.ComObj, FMX.Forms, FMX.Platform.Win; procedure ToggleSensorKeyboard(Form: TCommonCustomForm); implementation const CLSID_UIHostNoLaunch: TGUID = '{4CE576FA-83DC-4F88-951C-9D0782B4E376}'; type ITipInvocation = interface ['{37C994E7-432B-4834-A2F7-DCE1F13B834B}'] procedure Toggle(WND: HWND); safecall; end; procedure ToggleSensorKeyboard(Form: TCommonCustomForm); var TipInvocation: ITipInvocation; begin OleCheck(CoCreateInstance( CLSID_UIHostNoLaunch,nil,CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, ITipInvocation,TipInvocation)); TipInvocation.Toggle(FormToHWND(Form)); end; end. C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe - Сенсорная клавиатура Windows. В Windows 10 простой запуск уже не работает.
      Кто как делал? Очень интересны примеры кода.
       
    • От genakust
      добрый день,
      у меня есть несколько TabItems in FMX- TabControl (как на вложенной картинке) один из которых заполняется динамически:
      FindAndDeleteItemContext; frameIndex:= GetFrameIndexByText(item); {factory} FFramesFactory:= TFramesFactory.DefaultFactory; {Index-> Frame} aktFrame:= FFramesFactory.GetFrame(frameIndex); {add to layout} aktFrame.Parent:= LyContent; aktFrame.Align:= TAlignLayout.Client; LyContent.AddObject(aktFrame); {open tab} ActionToContentTabExecute(Sender); я пытаюсь найти фрейм и удалить его только из TabItem но не как Object обследующим способом:
      procedure Txxx.FindAndDeleteItemContext; var   i: Integer; begin   for i:= 0 to Pred(LyContent.ComponentCount) do   begin     if LyContent.Controls.Items[i] is TFrame then       LyContent.RemoveObject(i);   end; end но почему- то LyContent.ComponentCount всегда равен 0.
      Подскажите пожалуйста что неправильно?
      Спасибо.

    • От genakust
      Здравствуйте,
      я создал свой ListBoxItem (FMX) который выглядит следующим образом:

      затем я добавил Items динамически в ListBox и получилось следующее:

      Когда я запускаю программу на Windows 10 и выбираю мышкой Item он селектируется, а если запускаю на Андроид- таблете, то я не могу выбрать (селектировать) Item.
      Подскажите пожалуйста, какие могут быть причины длы такого поведения.
      Заранее спасибо.
       
    • От Mohamed BEN AMMAR
      hello 
      i'm using delphi fmx for building android App
      i have this code for Activating The WI-FI icon from android device:
      This could be found here .
      =========== code ==================
      uses
        Androidapi.Helpers,
        Androidapi.JNI.JavaTypes,
        Androidapi.JNI.GraphicsContentViewText,
        Androidapi.JNIBridge,
        Androidapi.JNI.WifiManager;
        procedure SetWifiEnabled (AEnable: Boolean); var   Obj: JObject;   WifiManager: JWifiManager; begin   Obj: = SharedActivityContext.getSystemService (TJContext.JavaClass.WIFI_SERVICE);   if Obj = nil then     Exit;     WifiManager: = TJWifiManager.Wrap ((Obj as ILocalObject) .GetObjectID);   WifiManager.setWifiEnabled (AEnable); end; 
       
       My question is About Activating Android location:
        Is it possible to activate the service location icon from android device
       programatically without using the Location or TLocationSensor component ....?
      however I know exactly that google has been Deactivate this API since android "4" just for security reasons .....
      but i have seen many apps in playstore can activate the service without using 
      this code here ask the user for activate the location manually .... procedure TForm1.GPSSettings; {$IFDEF ANDROID} var Intent: JIntent; {$ENDIF} begin {$IFDEF ANDROID} Intent := TJIntent.Create; Intent := TJIntent.JavaClass.init(TJSettings.JavaClass.ACTION_LOCATION_SOURCE_SETTINGS); TAndroidHelper.Activity.startActivity(Intent); {$ENDIF} end; in other versions like lolipopup can show just the Allow Permission system dialog timer ....( Asking the user for Allowing this App to Activate the service location ......) 
      I have an android device with lolipopup version and i try to execute the location EMBARCADERO sample but 
      this one can not activate the service location ICON even  my device show me the Allow permission dialog where i choose yes allow
      with never ASK....
      Finally ,  I like the WI-FI code above .....
      and i'm wondering if someone here can do this task for me (i need a unit as the WI-FI code above which can offer me
      the option to activate the Service Location ICON )
      I'm ready to paid for that task .....
       
      Sincerelly: Brave.
    • От PavelS
      Здравствуйте! Начал изучать FireMonkey  и столкнулся с тем, что TBitmap не поддерживает размер изображения больше 8132, кажется. Т.е. большие размеры рисунка он грузит, но за счёт потери качества, размер пиксела растёт, а размер рисунка по оси всё равно не превышает 8132. В то же время в простом дельфи можно грузить и работать с гораздо большими размерами, например, один из файлов имеет размер 61216 х 1486 точек. Подскажите пожалуйста, есть ли возможность работать с большими файлами в FireMоnkey и как это можно организовать? Программа создаётся для работы только в Windows.
    • От SIARHEI RAHOUSKI
      Создал проект там куча компонентов. Но разворачивании формы на весь экран компоненты размер не меняют:
      Прочитал про свойства align Но как только я выставлю Group box например left другим right все сбивается в кучу и поправить это не могу. 
      Как настроить align ?

    • От SIARHEI RAHOUSKI
      Как сделать форму с компонентами под все разрешения?

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...