【发布时间】:2016-11-16 17:11:45
【问题描述】:
我的内核参数如下:
__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);
根据我的问题,任何人都可以就如何将其他参数传递给内核提出一些建议吗? 非常感谢!
【问题讨论】:
-
你不觉得这些问题有点笼统吗?另外,数组“私有”给谁?如果数组被传递到的模块不能访问这些内存区域,那么您将遇到麻烦。始终敏锐地了解分段寄存器设置。
标签: parallel-processing opencl gpu gpgpu