c++ - 为什么我会收到 CL_MEM_OBJECT_ALLOCATION_FAILURE?

标签 c++ opencl gpgpu gpu

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

最佳答案

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

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

关于c++ - 为什么我会收到 CL_MEM_OBJECT_ALLOCATION_FAILURE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1690261/

相关文章:

c++ - 向函数添加具有默认值的参数是否会破坏 ABI?

opencl - 是否有任何OpenCL主机具有多个平台?

memory - OpenCL 内存架构和 GPU 物理内存/缓存(L1/L2...)之间的关系?

gpu - 使用 Sun Grid Engine (SGE) 调度 GPU 资源

c# - CUDA 驱动程序 API 与 CUDA 运行时

c++ - Concave GL_POLYGON不上色?

c++ - 内联类方法的寄存器优化不足

opengl - 现代图形流水线中有多少使用专用硬件?

c++ - 在宏中生成包含文件名

c++ - OpenCL 因大输入数组而崩溃