OpenCL-动态共享内存分配

OpenCL-动态共享内存分配,opencl,shared-memory,Opencl,Shared Memory,我正在尝试将一些现有的CUDA内核转换为OpenCL,问题是我必须使用OpenCL 1.2,因此不可能使用大小,这意味着我应该让enqueueNDRangeKernel决定本地工作组大小(以避免不可分割的工作组大小w.r.t.全局工作大小) 如前所述,我使用\uu local int*作为共享内存指针,其大小在主机代码中使用.setArg定义 在一些CUDA内核中,我分配了动态共享内存,其大小取决于线程块或本地工作组的大小。当我尝试将这些内核转换为OpenCL时,我不知道如何获取本地工作组大小,

我正在尝试将一些现有的CUDA内核转换为OpenCL,问题是我必须使用OpenCL 1.2,因此不可能使用大小,这意味着我应该让
enqueueNDRangeKernel
决定本地工作组大小(以避免不可分割的工作组大小w.r.t.全局工作大小)

如前所述,我使用
\uu local int*
作为共享内存指针,其大小在主机代码中使用
.setArg
定义

在一些CUDA内核中,我分配了动态共享内存,其大小取决于线程块或本地工作组的大小。当我尝试将这些内核转换为OpenCL时,我不知道如何获取本地工作组大小,该大小由
enqueueNDRangeKernel
local
参数传递空值来自动确定本地工作组大小

为了更清楚,我只想将这段CUDA代码翻译成OpenCL:

dim3 block_size, grid_size;
unsigned int smem_size;

block_size.x = 10;
block_size.y = 10;
block_size.z = 2;

// smem_size is depandant on ThreadBlock size.
smem_size = (block_size.x * block_size.y * block_size.z) * 5; 

myCudaKernel<<< grid_size, block_size, smem_size >>>(...);
dim3块大小、网格大小;
无符号整数smem_大小;
块大小x=10;
块大小y=10;
块大小z=2;
//smem_尺寸取决于螺纹块尺寸。
smem_大小=(块大小.x*块大小.y*块大小.z)*5;
myCudaKernel>(…);
*顺便说一句,我需要一个通用的解决方案,也适用于三维工作组


*我有一个Nvidia图形卡。

我认为这是不可能的,但我对它不是很熟悉。您不能手动为您的全球规模计算“合适”的本地工作规模吗?(当然,这可能有一些奇怪的情况——希望全局大小不是质数,否则必须引入填充:-/)。但也许有人知道一个合适/更好的解决方案。为什么不将10x10x2作为本地工作组的大小?然后您的代码可以硬编码大小,您可以使用固定大小的本地内存。只需确保全局大小是本地大小的倍数。如果您的实际工作量小于此值,请输入实际大小并检查全局_id()是否小于实际大小。因此,我想填充工作组是一种方法,谢谢大家