5

我在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
4

2 回答 2

3

clCreateBuffer 实际上不会在设备上创建缓冲区。这是有道理的,因为在创建时驱动程序不知道哪个设备将使用缓冲区(回想一下,上下文可以有多个设备)。当您将写入排队或启动将缓冲区作为参数的内核时,将在实际设备上创建缓冲区。

至于16MB的限制,你用的是最新的驱动(195.xx)吗?如果是这样,您应该通过论坛或直接联系 NVIDIA。

于 2009-11-25T16:01:40.343 回答
2

不要忘记您碰巧在设备上使用过的任何其他内存(如果这也是您的显卡,那么您的显示器正在使用的内存)。

(有没有办法获得当前可用的内存,或最大的片段,或类似的东西?)

于 2009-12-11T14:41:29.370 回答