cuda 的 __shared__ 变量不允许使用初始化程序

Posted

技术标签:

【中文标题】cuda 的 __shared__ 变量不允许使用初始化程序【英文标题】:initializer not allowed for __shared__ variable for cuda 【发布时间】:2012-01-27 06:36:51 【问题描述】:

我正在做以下事情:

__shared__ int exForBlockLessThanP = totalElementLessThanPivotEntireBlock[blockIdx.x];

其中 totalElementLessThanPivotEntireBlock 是 GPU 上的一个数组。如问题标题中所述,编译器正在抛出错误。我真的不明白为什么这是一个问题?

【问题讨论】:

【参考方案1】:

共享变量的静态初始化在 CUDA 中是非法的。问题是每个线程应该如何处理共享内存的静态初始化的语义在编程模型中是未定义的。哪个线程应该写?如果线程之间的值不统一会发生什么?编译器应该如何为这种情况发出代码,硬件应该如何运行它?

在您的荒谬示例中,您要求块中的每个线程用一个值初始化相同的共享变量——基本上是静态编译的内存竞争。

【讨论】:

请注意。在上面,我要求块中的每个线程为 exForBlockLessThanp 分配相同的值 使用条件语句让一个线程在内核开始时进行初始化 是否共享 int p;也面临同样的问题,因为块中的每个线程都做同样的事情 不,当然不是。这只是一个声明——它不会生成任何代码。 @talonmies 您对单线程条件初始化的评论是答案中最重要的部分,并埋在 cmets 中。回答的语气也颇有攻击性和贬义。

以上是关于cuda 的 __shared__ 变量不允许使用初始化程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 clang-llvm 编译器在 CUDA 中添加对类似于 __shared__ 的内存类型的支持

不允许从 __device__ 函数调用 __host__ 函数的 cuda::cub 错误

将主机内存复制到 cuda __device__ 变量

如何修复警告:函数范围的静态 __shared__ 变量不支持动态初始化?

cuda nvcc 使 __device__ 有条件

具有动态共享内存的模板化 CUDA 内核