2017-09-27 77 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和丑陋的黑客打开一个无形的窗口。

相关问题