如何 write/read 来自 OpenCL 设备的单个浮点值(缓冲区)

How to write/read a single float value(buffer) from OpenCL device

有很多关于如何从设备读取数组的问题,但我只想从设备读取单个浮点值。还是只能从设备读取数组?

我为 (float) 总和创建了一个缓冲区,如下所示。

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

从设备读取,无论是单个值还是数组都必须通过全局内存。所以内核签名必须是kernel calculate(..., global float *sum)。然后你按照你发布的方式从设备上读取它 - 通过将 &result 传递给 clEnqueueReadBuffer.