我使用C ++包装器并使用以下代码创建缓冲区:
cl_int err(0);
unsigned int size;
void *data = GetData(/*out*/ size);
cl::Buffer buf(m_ctx, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR,
size, data, &err);
free(data);
之后,我的应用程序的工作集增加了size
个字节。由于我有32位应用程序,我总共不能分配超过1.5 Gb,但GPU有3 Gb。
是否可以分配更多缓冲区?
PS。 size
小于128 Mb。
更新:我只使用1个设备而且是GPU。 (GeForce GTX 780 GPU NVIDIA Corporation 337.88)
答案 0 :(得分:0)
部分回答您的问题。内存块的最大大小,可以分配:
cl_ulong max_buffer_size = 0;
cl_int ret_code = clGetDeviceInfo(Device, CL_DEVICE_MAX_MEM_ALLOC_SIZE,
sizeof(cl_ulong), &max_buffer_size, NULL);
if(ret_code != CL_SUCCESS){
fprintf(stderr, "Error %d happened \n", ret_code);
}
通常,OpenCL API不允许分配大(超过几百MB)内存对象。
答案 1 :(得分:0)
DarkZeros在评论中是对的。它似乎是依赖于实现的,当我使用clEnqueueWriteBuffer()
而不是标记CL_MEM_COPY_HOST_PTR
时,它解决了问题。
答案 2 :(得分:0)
我不知道问题发生的确切原因,可能是某些潜在的驱动程序行为。
然而,禁用特殊标志似乎解决了nVIDIA平台,也可能是AMD的解决方案。所以我正在写一个正确的答案。
cl_int err(0);
unsigned int size;
void *data = GetData(/*out*/ size);
cl::Buffer buffer = cl::Buffer buf(m_ctx, CL_MEM_READ_WRITE,
size, NULL, &err);
err = queue.EnqueueWriteBuffer(buffer, CL_TRUE, NULL, size, data);
free(data);