OpenCL - 从缓冲区读取时CL_INVALID_VALUE

OpenCL - CL_INVALID_VALUE while reading from Buffer

本文关键字:CL INVALID VALUE 读取 缓冲区 OpenCL      更新时间:2023-10-16

因为代码相当长,所以我尝试发布重要的东西。

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

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

读取部分工作得很好,数组中的值不是我预期的(所有随机数,除非我的内核代码明确定义它(。

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

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

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