【问题标题】:How to write/read a single float value(buffer) from OpenCL device如何从 OpenCL 设备写入/读取单个浮点值(缓冲区)
【发布时间】:2019-03-29 02:33:16
【问题描述】:

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

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

ocl.sum = clCreateBuffer(context, CL_MEM_READ_WRITE, 1, NULL, &err);

像这样设置参数。

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

【问题讨论】:

标签: c opencl hpc


【解决方案1】:

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

【讨论】:

  • 感谢您的回答!我现在刚刚尝试了您的解决方案。对不起,我也是 C 的新手,所以不确定我在哪里做错了。根据您的建议,我将kernel calculate(..., float sum) 更改为kernel calculate(..., global float *sum)。我在内核函数中做了float x; *sum += x; 。然后我得到了OpenCL error during 'setting arg 2' 的错误。我这样设置 arg clSetKernelArg(kernel, 1, sizeof(cl_float), &ocl.sum); ,有什么问题吗?
  • 我将sum 定义为cl_mem 并将其缓冲区创建为1,对吗?我只得到0.0000E+00 return..
  • @LinFeng 对于缓冲区参数,您必须将clSetKernelArg 调用中的大小参数设置为内存对象sizeof,即sizeof(ocl.sum),而不是缓冲区的长度。我不确定“将其缓冲区创建为 1”是什么意思,但如果您指的是创建缓冲区时指定的字节大小,则需要使用 sizeof(cl_float),因为缓冲区只关心 bytes i>.
  • @pmdj 我现在明白了。非常感谢!
猜你喜欢
  • 2019-05-05
  • 2014-08-22
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多