• 0
Mars M

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

Вопрос

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

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

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

 

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


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

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

  • 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
Rusland, Andrey Efimov и Евгений Корепов понравилось это

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


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

Изменено пользователем Vladimir PRO
Добавка в текст
Евгений Корепов, Mars M, Rusland и 2 другим понравилось это

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


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

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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: Rustam Bikeev
      Суть проблемы следующая: после перехода с одной вкладки на другую в tabcontrol страница не отображается, фактически она переключается но на экране отображается предыдущая вкладка с которой был переход, ровно до той поры пока на что нибудь не клацнешь, нужно либо нажать на кнопку в тулбаре либо открыть multiview. После того как я первый раз с этим столкнулся я так и делал программно открывал и закрывал multiview, но не могу же я так делать постоянно, нужно решить проблему. Для подробности напишу, что есть основной tabcontrol в котором вкладки открываются из multiview, во вкладках есть вложенные tabcontrol-ы, со своими страницами в основном по 2 страницы. 
      Зря я начал делать приложения в делфи... чем дальше в лес тем больше дров.
    • Автор: Alex7wrt
      Добрый день
      Как заставить TMediaPlayer воспроизводить MPG файлы под Windows? MP4 воспроизводит, а mpg не хочет. Установлены кодеки KLite.
      Добавление строки 
      TMediaCodecManager.RegisterMediaCodecClass('.mpg', 'MPEG Video', TMediaType.Video, TWindowsMediaCodec); не помогает. 
    • Автор: x11
      Нет ли у FMX готовой функции для открытия веб-ссылок из приложения?
      А то приходится городить огород с лисапетами и кучей IFDEF.
      В итоге что у меня получилось.
      Для удобства разнес все по разным модулям.
      Модуль для Windiws
      unit uUtilsWindows; interface {$IFDEF MSWINDOWS} uses ShellApi, Variants, Windows, FMX.Types, FMX.Platform.Win; procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle); {$ENDIF} implementation {$IFDEF MSWINDOWS} procedure WindowsOpenUrl(const sUrl: string; WindowHandle: TWindowHandle); begin ShellExecute(FmxHandleToHWND(WindowHandle), 'open', PChar(VarToStr(sURL)), nil, nil, SW_NORMAL); end; {$ENDIF} end.  
      Модуль для Android
      unit uUtilsAndroid; interface {$IFDEF ANDROID} uses FMX.Helpers.Android, Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, AndroidApi.Helpers; procedure AndroidOpenUrl(const sUrl: string); {$ENDIF} implementation {$IFDEF ANDROID} procedure AndroidOpenUrl(const sUrl: string); Var Uri: Jnet_Uri; OpenLinkIntent: JIntent; begin Uri := StrToJURI(sUrl); OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri);// будем что-то смотреть OpenLinkIntent.addCategory(TJIntent.JavaClass.CATEGORY_BROWSABLE);// смотреть в браузере OpenLinkIntent.setData(Uri);// смотреть эту ссылку SharedActivity.startActivity(OpenLinkIntent);// открываем end; {$ENDIF} end.  
      теперь в основной форме:
      uses ..., ...{$IFDEF ANDROID}, vkbdhelper, uUtilsAndroid{$ENDIF} {$IFDEF MSWINDOWS}, uUtilsWindows {$ENDIF}; ... ... ... procedure TfmEditObject.actOpenUrlExecute(Sender: TObject); begin {$IFDEF ANDROID}AndroidOpenUrl(edMapsCoordUrl.Text);{$ENDIF} {$IFDEF MSWINDOWS}WindowsOpenUrl(edMapsCoordUrl.Text, Self.Handle);{$ENDIF} end;  
      А если добавлять ещё одну платформу, то ещё один модуль понадобится.
      Может есть более правильный вариант, так сказать, дизайна исходного кода?
       
    • Автор: SerhioUser
      Добрый день.
      Как в FMX при перерисовке объекта включить/отключить привязку к вертикальной синхронизации (v-sync) развертки экрана? Есть ли такая возможность в FMX? (В OpenGL и DirectX - есть)
      Например если делаем видео-плеер, то чтобы не было артефактов синхронизация нужна, а если хотим узнать реальный fps - синхронизацию выключаем.
    • Автор: Макс Войтенко
      var Keyboard: IFMXVirtualKeyboardService; begin if TPlatformServices.Current.SupportsPlatformService( IFMXVirtualKeyboardService, IInterface( Keyboard ) ) then if TVirtualKeyboardState.Visible in Keyboard.GetVirtualKeyBoardState then ShowMessage( 'клавиатура открыта' ) else ShowMessage( 'клавиатура скрыта' ); end; ТАК Я на шел для делфи. Но мне нужно для C++
    • Автор: Роман Фил
      Привет Всем уважаемые! 
      Пытаюсь сделать растягивание по содержимому компонента. Как это реализовано в мессенджерах типа WhatsApp если большой текст то растягивает (выделяется) по содержимому большое поле, если короткий то малое. 
        Text2.Text := Memo1.Lines.Strings[4];   text2.Height := canvas.TextHeight(Text2.Text); //по высоте строки меняется т.к. там и есть одна строка в TText просто переносится WordWrap визуально.   text2.Height:=canvas.TextWidth(text2.Text); //  - так чушь  Как это вообще реализовано кто нибудь сталкивался?

    • Автор: Роман Фил
      Привет ребят! Помогите кто знает, попытаюсь доходчиво объяснить - 
      имеется набор компонентов KernowSoftwareFMX - в нем использую TksTableView для вывода данных с Tmemo, в нем так же есть Image.
      В Tmemo с сервера грузится файл txt внутри которого строки с ссылками на изображения вида http://бла-бла/1.png
      Для загрузки использую FMX.Features.Bitmap.Helpers.pas - позволяет по прямой ссылке загружать изображение в TImage.
      что пытаюсь сделать?
      Нужно наполнять список TksTableView с Memo содержащий ссылки и в строках TksTableView - они же ListItem тоже самое что в ListView  и загружать в image каждой строки картинки по ссылкам memo.
       
      AItem.Image.Bitmap := Image4.MultiResBitmap.Bitmaps[1].LoadFromUrl(Memo1.Lines.Strings[i]); - так ругается [DCC Error] untMain.pas(92): E2010 Incompatible types: 'TBitmap' and 'procedure, untyped pointer or untyped parameter' AItem.Image.Bitmap := Image4.Bitmap.LoadFromUrl(Memo1.Lines.Strings[i]); - так тожн не работает Глюк в том что первым делом создаются строки . а потом грузятся по очереди картинки в Image4.
      Как заставить подгружать картинки в  TksTableView?
      Как ожидать хавершения загрузки каждой картинки в Image4 и после создавать AItem.Image.Bitmap?
       
       
       
    • Автор: Роман Фил
      Всем привет пытаюсь грузить файлы изображения с телефона Android на сервер методом post запроса. Для этого один из параметров запроса должен содержать полный путь к файлу. В ActionList есть стандартная опция TakePhotoFromLibraryAction - к с нее выдрать путь??? Куда он ей передается и передается ли вообще? я и справки толком не нахожу или я слепой?
       
      imgfile.Text:=TakePhotoFromLibraryAction1.????  
    • Автор: Роман Фил
      Привет ребят, созрел такой вопрос который меня мучает ! Вобщем пытаюсь загрузить картинку по прямой слыке с сервера. Картинка не грузится, не сохраняется не отображается. 
      Конечная платформа - Андроид. Пишу на Delphi xe 10 seatle.
      Что я делаю? при нажатии на сам компонент TImage (созданный динамически), должна грузится картинка по адресу преждевременно записанное в hint (TImage) при создании вида (http://блаблабла.jpg)
      Раньше код ниже работал сейчас нет не пойму что не так. Почему стал ковырять? потому что форма встает колом при загрузке изображений.
       
      var s: string; fs: TFileStream; begin fs := TFileStream.Create(tpath.Combine(tpath.GetDownloadsPath, 'load.jpg'), fmCreate); NetHTTPClient1.Get((Sender as TImage).Hint, fs); fs.Free; (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromFile (tpath.Combine(tpath.GetDownloadsPath, 'load.jpg')); подключал еще pas нашел на этом форуме FMX.Features.Bitmap.Helpers.pas
      (Sender as TImage).MultiResBitmap.Bitmaps[1].LoadFromUrl ((Sender as TImage).Hint); как проще сделать посоветуете чтоб и грузилось и форма не висла?
  • Сейчас на странице   0 пользователей

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