我正在GPU上分配cl_mem缓冲区并对其进行处理,该工作正常,直到超过一定的大小。在这种情况下,分配本身成功,但执行或复制不成功。我确实想要使用设备的内存来加快操作速度,所以我分配如下:
buf = clCreateBuffer (cxGPUContext, CL_MEM_WRITE_ONLY, buf_size, NULL, &ciErrNum);
现在我不明白的是尺寸限制。我正在复制大约16 MB但应该能够使用大约128 MB(见CL_DEVICE_MAX_MEM_ALLOC_SIZE
)。
为什么这些数字差异太大?
以下是oclDeviceQuery的一些摘录:
CL_PLATFORM_NAME: NVIDIA
CL_PLATFORM_VERSION: OpenCL 1.0
OpenCL SDK Version: 4788711
CL_DEVICE_NAME: GeForce 8600 GTS
CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU
CL_DEVICE_ADDRESS_BITS: 32
CL_DEVICE_MAX_MEM_ALLOC_SIZE: 128 MByte
CL_DEVICE_GLOBAL_MEM_SIZE: 255 MByte
CL_DEVICE_LOCAL_MEM_TYPE: local
CL_DEVICE_LOCAL_MEM_SIZE: 16 KByte
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KByte
答案 0 :(得分:3)
clCreateBuffer实际上不会在设备上创建缓冲区。这是有道理的,因为在创建时驱动程序不知道哪个设备将使用缓冲区(回想一下上下文可以有多个设备)。当您将写入队列或启动以缓冲区作为参数的内核时,将在实际设备上创建缓冲区。
至于16MB限制,您使用的是最新驱动程序(195.xx)吗?如果是这样,您应该通过forums或直接联系NVIDIA。
答案 1 :(得分:2)
不要忘记您在设备上使用的其他内存(如果这也是您的显卡,则显示器正在使用的内存)。
(有没有办法获得当前可用的内存,或最大的片段,或者某些?)