【问题标题】:How to pass private array to OpenCL kernel as arguments?如何将私有数组作为参数传递给 OpenCL 内核?
【发布时间】: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
         )

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);

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

【问题讨论】:

  • 你不觉得这些问题有点笼统吗?另外,数组“私有”给谁?如果数组被传递到的模块不能访问这些内存区域,那么您将遇到麻烦。始终敏锐地了解分段寄存器设置。

标签: parallel-processing opencl gpu gpgpu


【解决方案1】:

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

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

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

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

内核代码和C代码应该怎么写?

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

【讨论】:

  • 我尝试将每个内核的数据传递到全局内存中,每个内核访问它自己的部分,并且它可以工作。我问是因为每个内核只需要自己单独的数据(不是相同的数据),所以我在猜测是否可以将数据分别传递给每个内核......
  • 对于每个内核,您实际上可以将全局向量拆分为更小的向量。但是不能马上传递私有内存。
猜你喜欢
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
相关资源
最近更新 更多