2013-05-10 17 views
7

Poszukuję niezawodnego sposobu określenia bieżącego użycia pamięci GPU, najlepiej w C++/C. Znalazłem wiele sposobów uzyskiwania wykorzystanie podobnego następujących metod:Uzyskiwanie progresywnego wykorzystania pamięci GPU

  • Direct Draw
  • dxdiag
  • WMI
  • DXGI
  • D3D9

Metody te nie są wystarczająco dokładne (o ponad sto megabajtów). Próbowałem nvapi.h, ale nie widziałem niczego, co mógłbym użyć do zapytania o pamięć. Myślałem tylko, że powyższe metody były jedynymi opcjami, ale wtedy natknąłem się na narzędzie o nazwie GPU-Z, które daje mi dokładne odczyty w pamięci do najbliższego megabajta, nawet jeśli OpenCL uruchamia prawie pełne obciążenie mojego 580GTX. Mogę potwierdzić, że jestem u szczytu mojego użycia pamięci przez przydzielenie kilku dodatkowych megabajtów zanim OpenCL zwróci kod powrotu Object_Allocation fail.

Patrząc na import z GPU-Z, widzę nic ciekawego inne niż:

kernel32.dll: LoadLibraryA, GetProcAddress, VirtualAlloc, VirtualFree

Domyślam się LoadLibraryA należy stosować załadować bibliotekę dll w celu wysłania zapytania do pamięci GPU i czujników. Jeśli ten plik DLL istnieje, gdzie on żyje? Poszukuję rozwiązania dla AMD i NVidii, jeśli to możliwe (używanie różnych interfejsów API jest w porządku).

+1

„większość z moich stu megabajtów” - jaka jest znana dobre referencje, które używasz? –

+0

Używam GPU-Z jako punktu odniesienia, ponieważ zapewnia mi dokładność, jakiej potrzebuję. – roboto1986

+0

Co daje ci pewność, że GPU-Z jest prawidłowe tam, gdzie inni się mylą? –

Odpowiedz

9

(dokumentacja here) wymaga niczego innego niż API środowiska wykonawczego cuda w celu uzyskania wolnej pamięci i całkowitej pamięci na bieżącym urządzeniu.

Jak zauważył Erik, w NVML jest podobna funkcjonalność.

+0

Dziękujemy! Spróbuję tego. Wkrótce poprawię prawidłową odpowiedź. – roboto1986

+0

Wypróbowałem to i ta metoda zapewnia mi precyzję, jakiej potrzebuję, bez konieczności instalowania innych sdków :) Teraz wciąż nie mam szczęścia dla kart ATI. Jeśli masz pomysł, daj mi znać. Inaczej, mógłbym po prostu zastosować metody DX. – roboto1986

1

Zapoznaj się z funkcją nvmlDeviceGetMemoryInfo w NVIDIA zarządzania biblioteką https://developer.nvidia.com/nvidia-management-library-nvml:

„Pobiera ilość zastosowanego wolnej i całkowitej dostępnej pamięci w urządzeniu, w bajtach.”

Nie wiem, czy AMD ma coś podobnego.

+0

Dzięki za informacje. Jednak nie udało mi się uzyskać prawidłowej liczby urządzeń za pomocą nvmlUnitGetCount(), która zwróciła 0 urządzeń. Nazwałem nvmlInit(), a status zwracania powiodł się, a następnie podążyłem za NvmlUnitGetCount() i jego zwrócony stan również zakończył się powodzeniem, ale zwrócił 0 urządzeń. Jakieś pomysły? – roboto1986

+0

Kiedy OpenCL daje mi 0 urządzeń/platform, ponownie instaluję sterownik ekranu, który zwykle działa. Poza tym nie mam żadnych sugestii. Przepraszam. –

Powiązane problemy