从缓冲区读取时OpenCL - CL_INVALID_VALUE

时间:2018-04-17 21:59:08

标签: c++ opencl

因为代码相当长,所以我尝试发布重要内容。

我分配了一个数组,创建缓冲区,像这样传递给内核。

cl_mem correspondenceRes= NULL;
int size_correspondence_result = model_voxelized->size()*3*num_angle_steps*num_shift_steps;
float* correspondence_result = new float[size_correspondence_result];
correspondenceRes = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(size_correspondence_result),correspondence_result,&ret);
ret = clSetKernelArg(kernel,6,sizeof(correspondenceRes), &correspondenceRes);

稍后从缓冲区读回来:

ret =  clEnqueueReadBuffer(command_queue,correspondenceRes,CL_TRUE,0,sizeof(correspondence_result), &correspondence_result[0],0,NULL,NULL);

然后我得到代码-30,说CL_INVALID_VALUE,也可能意味着我在ClEnqueueReadBuffer中放入了错误的对象大小。同时对于另一个论点,我创建并阅读如下:

cl_mem corr_result = NULL;
cl_int* corr_result_count = new cl_int[prod];
corr_result= clCreateBuffer(context, CL_MEM_READ_WRITE| CL_MEM_COPY_HOST_PTR, sizeof(corr_result_count),corr_result_count,&ret);
ret=clSetKernelArg(kernel,7,sizeof(corr_result),&corr_result);

稍后从缓冲区读取它:

ret = clEnqueueReadBuffer(command_queue,corr_result,CL_TRUE,0,sizeof(corr_result_count), &corr_result_count[0],0,NULL,NULL);

读取部分工作正常,但是数组内部的值不是我所期望的(所有随机数,除非我的内核代码明确定义)。

请注意,我不在内核中进行任何计算,只需传递并读回。

1 个答案:

答案 0 :(得分:1)

对于第一个问题,在创建缓冲区时使用的是错误的大小。 sizeof(size_correspondence_result)应为sizeof(float) * size_correspondence_result,否则等同于sizeof(int)。在阅读时也需要使用相同的尺寸。我强烈建议您阅读how sizeof() works,以便了解它返回的价值。

至于第二个问题,您正在分配内存,然后立即创建一个CL_MEM_COPY_HOST_PTR的缓冲区,将未初始化的内存复制到缓冲区中。没有理由这样做;要么首先初始化内存,要么只想在设备本身上进行写/读的未初始化内存,不要使用CL_MEM_COPY_HOST_PTR(并假设内核中的内存未初始化)。