如何将私有数组作为参数传递给OpenCL内核?

时间:2016-07-13 23:06:21

标签: parallel-processing opencl gpu gpgpu

我的内核参数如下:

 __kernel void
codesGPU(struct stateGPU* s,
         short* lencnt,
         short* lensym,
         short* distcnt,
         short* distsym,
         __global const struct in_unit* input,
         __global struct out_unit* output,
         struct contextGPU* ctx,
         __global const short* lens,
         __global const short* lext,
         __global const short* dists,
         __global const short* dext,
         int* outsize
         )

inputoutput是"全球"因为它们包含所有工作项的输入/输出数据,这些工作项由get_global_id(0)分隔。 lens, next, dists, dext是由所有工作项共享的4个常量全局数组,因此我将它们声明为global constant。但是,其余参数对每个工作项都是私有的。其中包括outsize等标量和lencnt等数组。我在这里使用指针,因为我仍然需要在GPU计算之后将这些参数传递回CPU。

我的问题是:

  • 是否可以将私有数组传递给内核?

  • 将这些变量(每个工作项不同,仍希望返回值)传递给内核的最佳方法是什么?

  • 我应该如何编写内核代码和C代码?

内核还在.cl代码中调用两个辅助函数:

int fun1(struct stateGPU *s, short *countarr, short *symarr, __global const struct in_unit *input, int *idx, struct contextGPU* ctx, int did)

int fun2(struct stateGPU *s, int need, __global const struct in_unit* input, int *idx, struct contextGPU* ctx, int gid)

在main.c中,我为全局变量创建缓冲区对象并将它们作为

传递
cl_mem cl_lens;
cl_lens = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(lens), lens, &err);
err |= clSetKernelArg(kernel, 8, sizeof(cl_mem), (void *)&cl_lens);

根据我的问题,任何人都可以就如何将其他参数传递给内核提出一些建议吗? 非常感谢!

1 个答案:

答案 0 :(得分:3)

  

是否可以将私有数组传递给内核?

不,只有全局/常量数据可以传递给内核。设置寄存器的唯一方法是从某个地方传递它,也就是全局存储器。

  

将这些变量(每个工作项不同,仍希望返回值)传递给内核的最佳方法是什么?

简单的全局内存,因为当所有工作项需要相同的数据时,常量内存更适合。

  

我应该如何编写内核代码和C代码?

那取决于你真正想要它做什么! :)