如何从OpenCL设备写入/读取单个浮点值(缓冲区)
关于如何从设备读取数组有很多问题,但我只想从设备读取单个浮点值。或者它只能从设备读取数组如何从OpenCL设备写入/读取单个浮点值(缓冲区),c,opencl,hpc,C,Opencl,Hpc,关于如何从设备读取数组有很多问题,但我只想从设备读取单个浮点值。或者它只能从设备读取数组 float result = 0.f; err = clEnqueueReadBuffer(queue, ocl.sum, CL_TRUE, 0, 1, &result, 0, NULL, NULL); print(result); 我为(浮动)和创建一个缓冲区,如下所示 ocl.sum = clCreateBuffer(context, CL_MEM_READ_WRITE, 1, NULL,
float result = 0.f;
err = clEnqueueReadBuffer(queue, ocl.sum, CL_TRUE, 0, 1, &result, 0, NULL, NULL);
print(result);
我为(浮动)和创建一个缓冲区,如下所示
ocl.sum = clCreateBuffer(context, CL_MEM_READ_WRITE, 1, NULL, &err);
像这样设置arg
clSetKernelArg(kernel, 0, sizeof(cl_mem), &ocl.arr);
clSetKernelArg(kernel, 1, sizeof(cl_float), &ocl.sum);
在内核中,我计算总和
kernel calculate(global arr, float sum)
{
...
sum = 100.0f;
}
我怎样才能从设备中得到总数
float result = 0.f;
err = clEnqueueReadBuffer(queue, ocl.sum, CL_TRUE, 0, 1, &result, 0, NULL, NULL);
print(result);
从设备读取数据,无论是单个值还是数组,都必须通过全局内存。因此内核签名必须是
内核计算(…,全局浮点*和)
。然后,您可以按照您发布的方式从设备上阅读,方法是将&result
传递到clenqueueradbuffer
谢谢您的回答!我刚试过你的解决办法。很抱歉,我也是C新手,所以不确定我哪里做错了。根据您的建议,我将kernel calculate(…,float sum)
更改为kernel calculate(…,global float*sum)
。我做了float x*总和+=x代码>在内核函数中。然后我得到了一个错误,OpenCL在“设置arg2”期间出错。
。我这样设置argclSetKernelArg(kernel,1,sizeof(cl_float),&ocl.sum)
,有什么问题吗?我将sum
定义为cl\u mem
,并将其缓冲区创建为1
,对吗?我只得到0.0000E+00
return..@LinFeng对于缓冲区参数,您必须在clSetKernelArg
调用中设置size参数,以sizeof
内存对象,即sizeof(ocl.sum)
,而不是缓冲区的长度。我不确定“将其缓冲区创建为1”是什么意思,但如果您指的是创建缓冲区时指定的字节大小,则需要使用sizeof(cl\u float)
,因为缓冲区只关心字节。@pmdj我现在知道了。非常感谢你!我还想对内核做一个缩减,比如[这个]()问题。但是,我认为传递单个值比传递组和[]更高的性能。不是吗?可能吗?