我正在尝试将数组传递给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的值,否则它将保持不变。我想这不是一个人将如何返回数组。
我现在陷入困境。
答案 0 :(得分:5)
您对clSetKernelArg()
的调用无效 - 您应该传递OpenCL缓冲区,而不是主机指针。例如:
ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), &memobj);
ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), &memobj2);
正如已经指出的那样,您应该检查每个OpenCL运行时API调用的返回码。这会很快指出你的错误。