我在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,
¤tlyAvailableMemoryInKb);
读出来,我创建一个隐藏的窗口,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特性后导致了一些死锁)并且返回的值不正确。