我有一个 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];
}
有人可以帮忙吗,我错过了什么?