我有一个uint8_t数组。数组的大小约为2.000.000。我需要对这些值进行一些计算,但是在调用内核并将已修改的值复制回之后,它仅返回零。
我正在创建数组,“行”和“列”是整数。
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);
这样设置内核arg。
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];
}
有人可以帮忙吗,我错过了什么?
答案 0 :(得分:0)
假设MEM_SIZE = rows * columns
,则您的代码很好。 clEnqueueReadBuffer
中的参数顺序也正确。
我可以想象您忘记在clFinish(img_cmd_queue);
,clEnqueueWriteBuffer
和clEnqueueNDRangeKernel
之后以及在clEnqueueReadBuffer
中检查结果之前致电arrayOut
。所有这些命令最终都排在队列中,没有clFinish
的队列可能会在检查结果后执行。