Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCL:读取Nvidia图形硬件上的可用内存(OpenGL扩展?、Cuda运行时?)_Opengl_Opencl_Nvidia - Fatal编程技术网

OpenCL:读取Nvidia图形硬件上的可用内存(OpenGL扩展?、Cuda运行时?)

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_

我正在OpenCL中实现一个复杂的算法,但我在NVidia硬件上遇到了一个问题。当我的算法被并行调用多次时,英伟达GPU上的内存不够,随机线程的执行可能会由于内存分配错误而停止(我以前试图解释这个问题)。 我目前的解决方案是请求GPU上的可用内存,并且只有在有足够的内存时才允许执行。问题是读取可用内存

我用

#define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049
glGetIntegerv(GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX,
    &currentlyAvailableMemoryInKb);
为了读取内存,我创建了一个带有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和丑陋的黑客打开一个看不见的窗口