2013-05-10 36 views
7

Sto cercando un modo affidabile per determinare l'utilizzo corrente della memoria GPU preferibilmente in C++/C. Ho trovato molti modi per ottenere l'utilizzo, come i seguenti metodi:Utilizzo progressivo della memoria della GPU

  • diretto Disegna
  • DxDiag
  • WMI
  • DXGI
  • D3D9

Questi metodi non sono sufficientemente accurati (più di un centinaio di megabyte). Ho provato nvapi.h ma non ho visto nulla che potrei usare per interrogare per memoria. Stavo pensando solo i metodi sopra elencati erano le uniche opzioni, ma poi mi sono imbattuto in uno strumento chiamato GPU-Z che mi dà letture accurate della memoria al megabyte più vicino anche quando OpenCL gira quasi a pieno carico sul mio 580GTX. Posso verificare che sono al massimo dell'utilizzo della memoria allocando qualche altro megabyte prima che OpenCL restituisca il codice di ritorno Object_Allocation fail.

Guardando le importazioni da GPU-Z, non vedo nulla di interessante che non sia:

kernel32.dll: LoadLibraryA, GetProcAddress, VirtualAlloc, VirtualFree

La mia ipotesi è LoadLibraryA deve essere utilizzato caricare una DLL per interrogare la memoria e i sensori della GPU. Se questa DLL esiste, dove vive? Sto cercando una soluzione per AMD e NVidia se possibile (usare API diverse è ok).

+1

"più fuori le mie cento megabyte" - qual è il noto buon riferimento che si sta utilizzando? –

+0

Sto usando GPU-Z come mio riferimento poiché mi dà la precisione di cui ho bisogno. – roboto1986

+0

E cosa ti dà fiducia che GPU-Z sia giusto dove gli altri si sbagliano? –

risposta

9

cudaMemGetInfo (documentato here) non richiede altro che l'API di runtime cuda per ottenere memoria libera e memoria totale sul dispositivo corrente.

E come sottolineato da Erik, esiste una funzionalità simile in NVML.

+0

Grazie! Ci proverò. Segnerò la risposta corretta al più presto. – roboto1986

+0

L'ho provato e questo metodo mi dà la precisione che voglio senza dover installare altri sdks :) Ora, sono ancora sfortunato per le schede ATI. Se hai un'idea, per favore fammi sapere. Altrimenti, potrei semplicemente andare con i metodi DX. – roboto1986

1

Controllare la funzione nvmlDeviceGetMemoryInfo in NVIDIA Gestione Biblioteca https://developer.nvidia.com/nvidia-management-library-nvml:

"Recupera la quantità di memoria utilizzata, libero e totale disponibile sul dispositivo, in byte."

Non so se AMD ha qualcosa di equivalente.

+0

Grazie per le informazioni. Tuttavia, non ero in grado di ottenere un conteggio corretto dei dispositivi utilizzando nvmlUnitGetCount() che restituiva 0 dispositivi. Ho chiamato nvmlInit() e lo stato di ritorno è andato a buon fine e poi ho seguito con nvmlUnitGetCount() e anche il suo stato restituito ha avuto successo, ma ha restituito 0 dispositivi. Qualche idea? – roboto1986

+0

Quando OpenCL mi dà 0 dispositivi/piattaforme, reinstallo il driver dello schermo, che di solito funziona. Oltre a questo non ho suggerimenti. Scusate. –

Problemi correlati