Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从OpenCL设备写入/读取单个浮点值(缓冲区)_C_Opencl_Hpc - Fatal编程技术网

如何从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”期间出错。
。我这样设置arg
clSetKernelArg(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我现在知道了。非常感谢你!我还想对内核做一个缩减,比如[这个]()问题。但是,我认为传递单个值比传递组和[]更高的性能。不是吗?可能吗?