如何将私有数组作为参数传递给 OpenCL 内核?
How to pass private array to OpenCL kernel as arguments?
我的内核参数如下:
__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
是 "global",因为它们包含所有工作项的 input/output 数据,由 get_global_id(0)
分隔。 lens, next, dists, dext
是所有工作项共享的 4 个常量全局数组,因此我将它们声明为 global constant
。但是,其余参数对于每个工作项都是私有的。这些包括像 outsize
这样的标量和像 lencnt
这样的数组。我在这里使用指针是因为我仍然需要在 GPU 计算之后将这些参数传回 CPU。
我的问题是:
是否可以将私有数组传递给内核?
将这些变量(每个工作项不同,但仍然希望 return 值)传递给内核的最佳方法是什么?
内核代码和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);
任何人都可以根据我的问题就如何将其他参数传递给内核提出一些建议吗?
非常感谢!
Is it possible to pass private arrays to kernels?
不可以,只有 global/constant 数据可以传递给内核。设置寄存器的唯一方法是从某个地方传递它,也就是全局内存。
What's the best way to pass these variables (different for each work-item, and still want to return the value) to kernel?
简单的全局内存,因为常量内存更适合所有工作项都需要相同数据的情况。
How should I write the kernel code and C code?
好吧,这取决于您实际想要它做什么! :)
我的内核参数如下:
__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
是 "global",因为它们包含所有工作项的 input/output 数据,由 get_global_id(0)
分隔。 lens, next, dists, dext
是所有工作项共享的 4 个常量全局数组,因此我将它们声明为 global constant
。但是,其余参数对于每个工作项都是私有的。这些包括像 outsize
这样的标量和像 lencnt
这样的数组。我在这里使用指针是因为我仍然需要在 GPU 计算之后将这些参数传回 CPU。
我的问题是:
是否可以将私有数组传递给内核?
将这些变量(每个工作项不同,但仍然希望 return 值)传递给内核的最佳方法是什么?
内核代码和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);
任何人都可以根据我的问题就如何将其他参数传递给内核提出一些建议吗? 非常感谢!
Is it possible to pass private arrays to kernels?
不可以,只有 global/constant 数据可以传递给内核。设置寄存器的唯一方法是从某个地方传递它,也就是全局内存。
What's the best way to pass these variables (different for each work-item, and still want to return the value) to kernel?
简单的全局内存,因为常量内存更适合所有工作项都需要相同数据的情况。
How should I write the kernel code and C code?
好吧,这取决于您实际想要它做什么! :)