2017-09-27 78 views
0

我在OpenCL中實現了一個複雜的算法,但是我在NVidia硬件上遇到了一個問題。當我的算法被多次並行調用時,NVidia GPU上的內存不足,隨機線程的執行可能會因MemoryAllocation錯誤而停止(我曾試圖在https://devtalk.nvidia.com/default/topic/1019997/cuda-programming-and-performance/how-to-handle-cl_mem_object_allocation_failure-errors-if-amount-of-useable-memory-is-not-known-/之前解釋過這一點。)OpenCL:讀出Nvidia顯卡硬件上的可用內存(OpenGL Extension?,Cuda Runtime?)

我目前的解決方案是請求GPU上的可用內存,只有足夠的時候才允許執行。問題是讀出可用內存。

我用

#define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049 
glGetIntegerv(GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX, 
    &currentlyAvailableMemoryInKb); 

讀出來,我創建一個隱藏的窗口,OpenGL上下文記憶。現在的問題是,當NVidia gpu不是主GPU時,我必須使用gpu關係擴展選擇卡:https://www.khronos.org/registry/OpenGL/extensions/NV/WGL_NV_gpu_affinity.txt,但wglGetProcAddress返回null。我認爲這是因爲我用Intel GPU作爲主設備啓動。 (加載其他擴展,如wglCreatePbufferARB不是問題。)

有沒有辦法處理這個問題,並將wglGetProcAddress調用轉發給另一個gpu /驅動程序?

在此先感謝! 最好的問候 邁克爾

ps .:我也嘗試使用cuda運行時來獲得可用內存。這沒有奏效。 opencl驅動程序不可靠(使用某些cudart特性後導致了一些死鎖)並且返回的值不正確。

回答

1

我找到了另一種解決方案。我以前不知道NVAPI,但是這個庫解決了這個問題。

我用的OpenCL來獲得所選擇的NVIDIA顯卡的PCI ID:

#define CL_DEVICE_PCI_BUS_ID_NV 0x4008 
cl_int busId = 0; 
device.getInfo(CL_DEVICE_PCI_BUS_ID_NV, &busId); 

然後我用NvAPI_EnumPhysicalGPUs枚舉的NVIDIA GPU。使用NvAPI_GPU_GetBusId,我可以獲得前一個函數返回的設備的pci總線標識。如果總線ID相等,我調用NvAPI_GPU_GetMemoryInfo來獲取當前可用的內存量。

到目前爲止,這解決了我所有的問題。這意味着我可以放棄opengl和醜陋的黑客打開一個無形的窗口。

相關問題