OpenCL:读取Nvidia Graphics硬件上的可用内存(OpenGL扩展?,Cuda Runtime?)

时间:2017-09-27 07:52:46

标签: opengl opencl nvidia

我在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-/之前解释这个。)

我目前的解决方案是请求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 affinity扩展名选择卡:https://www.khronos.org/registry/OpenGL/extensions/NV/WGL_NV_gpu_affinity.txt但wglGetProcAddress返回null。我认为这是因为我使用英特尔GPU作为主设备启动。 (加载其他扩展名如wglCreatePbufferARB不是问题。)

有没有办法处理这个并将wglGetProcAddress调用转发给另一个gpu / driver?

提前致谢! 最好的祝福 迈克尔

Ps。:我也尝试使用cuda运行时来获取可用内存。这没有成功。 opencl驱动程序不可靠(在使用一些cudart功能后导致一些死锁)并且返回的值不正确。

1 个答案:

答案 0 :(得分: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_EnumPhysicalGPU来枚举nvidia gpus。使用NvAPI_GPU_GetBusId,我可以获得前一个函数返回的设备的pci总线ID。如果总线ID相等,我调用NvAPI_GPU_GetMemoryInfo来获取当前可用的内存量。

到目前为止,这解决了我遇到的所有问题。意思是我可以放弃opengl和丑陋的黑客来打开一个看不见的窗口。

相关问题