OpenCL:读取Nvidia图形硬件上的可用内存(OpenGL扩展?、Cuda运行时?)
我正在OpenCL中实现一个复杂的算法,但我在NVidia硬件上遇到了一个问题。当我的算法被并行调用多次时,英伟达GPU上的内存不够,随机线程的执行可能会由于内存分配错误而停止(我以前试图解释这个问题)。 我目前的解决方案是请求GPU上的可用内存,并且只有在有足够的内存时才允许执行。问题是读取可用内存 我用OpenCL:读取Nvidia图形硬件上的可用内存(OpenGL扩展?、Cuda运行时?),opengl,opencl,nvidia,Opengl,Opencl,Nvidia,我正在OpenCL中实现一个复杂的算法,但我在NVidia硬件上遇到了一个问题。当我的算法被并行调用多次时,英伟达GPU上的内存不够,随机线程的执行可能会由于内存分配错误而停止(我以前试图解释这个问题)。 我目前的解决方案是请求GPU上的可用内存,并且只有在有足够的内存时才允许执行。问题是读取可用内存 我用 #define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049 glGetIntegerv(GL_GPU_MEM_INFO_CURRENT_
#define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049
glGetIntegerv(GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX,
¤tlyAvailableMemoryInKb);
为了读取内存,我创建了一个带有OpenGL上下文的隐藏窗口。现在的问题是,当英伟达GPU不是主要的GPU时,我必须使用GPU亲和扩展来选择卡:但是WGLGETPROCENT返回null。我想这是因为我是以英特尔GPU作为主设备启动的。(加载wglCreatePbufferARB等其他扩展不是问题。)
是否有办法处理此问题并将wglGetProcAddress调用转发给另一个gpu/驱动程序
提前谢谢!
顺致敬意,
迈克尔
注:我还尝试使用cuda运行时获取可用内存。这是行不通的。opencl驱动程序不可靠(使用某些cudart功能后导致一些死锁),返回的值不正确。我找到了另一个解决方案。我以前不知道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);
然后使用英伟达枚举NVIDIA GPU来枚举Nvidia GPU。使用NvAPI_GPU_GetBusId,我可以获取上一个函数返回的设备的pci总线id。如果总线ID相等,我将调用NvAPI_GPU_GetMemoryInfo以获取当前可用的内存量
到目前为止,这解决了我所有的问题。这意味着我可以放弃opengl和丑陋的黑客来打开一个不可见的窗口。我找到了另一个解决方案。我以前不知道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);
然后使用英伟达枚举NVIDIA GPU来枚举Nvidia GPU。使用NvAPI_GPU_GetBusId,我可以获取上一个函数返回的设备的pci总线id。如果总线ID相等,我将调用NvAPI_GPU_GetMemoryInfo以获取当前可用的内存量
到目前为止,这解决了我所有的问题。这意味着我可以放弃opengl和丑陋的黑客打开一个看不见的窗口