我的内核参数如下:
__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
)
input
和output
是"全球"因为它们包含所有工作项的输入/输出数据,这些工作项由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);
根据我的问题,任何人都可以就如何将其他参数传递给内核提出一些建议吗? 非常感谢!
答案 0 :(得分:3)
是否可以将私有数组传递给内核?
不,只有全局/常量数据可以传递给内核。设置寄存器的唯一方法是从某个地方传递它,也就是全局存储器。
将这些变量(每个工作项不同,仍希望返回值)传递给内核的最佳方法是什么?
简单的全局内存,因为当所有工作项需要相同的数据时,常量内存更适合。
我应该如何编写内核代码和C代码?
那取决于你真正想要它做什么! :)