如何在内核中传递数组,做一些事情然后返回它 - OpenCL

时间:2013-12-23 20:39:25

标签: c++ opencl

我正在尝试将数组传递给OpenCL内核,然后对它做一些事情并将其传递回主机。我在此tutorial修改了代码。

这只是确定OpenCL实际工作方式的核心。我希望这会从array1的第一个元素中减去2并将其存储到array2的第一个元素中:

__kernel void test(global int* array1, global int* array2) {
    array2[0] = array1[0] - 2;
}

在main中我有两个数组,一个(host1)有一些数字,第二个(host2)初始化为零。 比起创建我使用的内存缓冲区:

memobj = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, MEM_SIZE * sizeof(int), &host1, &ret);
memobj2 = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, MEM_SIZE * sizeof(int), &host2, &ret);

在构建程序后,我设置了参数:

ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), &host1);
ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), &host2);

然后在执行后我尝试恢复该阵列。

ret = clEnqueueReadBuffer(command_queue, memobj2, CL_TRUE, 0, MEM_SIZE * sizeof(int), host2, 0, NULL, NULL);

如果我将memobj2更改为memobj,则host2将包含host1的值,否则它将保持不变。我想这不是一个人将如何返回数组。

我现在陷入困境。

1 个答案:

答案 0 :(得分:5)

您对clSetKernelArg()的调用无效 - 您应该传递OpenCL缓冲区,而不是主机指针。例如:

ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memobj);
ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memobj2);

正如已经指出的那样,您应该检查每个OpenCL运行时API调用的返回码。这会很快指出你的错误。