为什么clCreateBuffer使用主机内存?

时间:2014-06-30 09:56:25

标签: opencl gpu

我使用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)

3 个答案:

答案 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);