如何将大数组复制到内存并在OpenCL内核中使用它?

时间:2020-11-06 14:37:33

标签: c++ arrays opencl opencl-c++

我有一个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];
}

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

1 个答案:

答案 0 :(得分:0)

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

我可以想象您忘记在clFinish(img_cmd_queue);clEnqueueWriteBufferclEnqueueNDRangeKernel之后以及在clEnqueueReadBuffer中检查结果之前致电arrayOut。所有这些命令最终都排在队列中,没有clFinish的队列可能会在检查结果后执行。

相关问题