0

我有一个 uint8_t 数组。数组的大小约为 2.000.000。我需要对这些值进行一些计算,但是在我调用内核并将修改后的值复制回来之后,它只返回零。

我正在创建数组,“行”和“列”是 int。

uint8_t arrayIn[rows * columns];
uint8_t arrayOut[rows * columns];

我正在创建 cl_mem 对象并将数组数据复制到其中。

arrayInMem = clCreateBuffer(context, CL_MEM_READ_ONLY, rows * columns * sizeof(uint8_t), NULL, &err);
arrayOutMem = clCreateBuffer(context, CL_MEM_WRITE_ONLY, rows * columns * sizeof(uint8_t), NULL, &err);
err = clEnqueueWriteBuffer(img_cmd_queue, arrayInMem, CL_TRUE, 0, rows * columns * sizeof(uint8_t), arrayIn, 0, NULL, NULL);

像这样设置内核参数。

err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&arrayInMem);
err = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&arrayOutMem);

将修改后的数组读回主机。

err = clEnqueueReadBuffer(img_cmd_queue, arrayOutMem, CL_TRUE, 0, MEM_SIZE * sizeof(uint8_t), arrayOut, 0, NULL, NULL);

内核签名如下所示:

__kernel void calculate(__global uchar * arrayInKernel, __global uchar * arrayOutKernel){
//do some calculation like this eg. 
//int gid = get_global_id(0);
//arrayOutKernel[gid] = 2 * arrayInKernel[gid];
}

有人可以帮忙吗,我错过了什么?

4

1 回答 1

0

你的代码很好,假设MEM_SIZE = rows * columns. 中的参数顺序clEnqueueReadBuffer也是正确的。

我可以想象你在检查结果clFinish(img_cmd_queue);之后clEnqueueWriteBuffer和之前忘记clEnqueueNDRangeKernel打电话了。所有这些命令最终都在一个队列中,并且在您检查结果后可能会执行没有队列的命令。clEnqueueReadBufferarrayOutclFinish

于 2020-11-07T08:19:13.293 回答