作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 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/
我是一名优秀的程序员,十分优秀!