CUDA中不允许为__shared__变量使用初始化程序

7
我正在进行以下操作:
__shared__ int exForBlockLessThanP = totalElementLessThanPivotEntireBlock[blockIdx.x];

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

1个回答

12

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

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


请注意。在上面的代码中,我要求块中的每个线程将exForBlockLessThanp赋予相同的值。 - Programmer
1
使用条件语句,在内核开始时让一个线程执行初始化。 - talonmies
shared int p; 是否也面临着每个线程都执行相同操作的问题? - Programmer
不,当然不是。那只是一个声明 - 它不会生成任何代码。 - talonmies
5
@talonmies关于单线程条件初始化的评论是答案中最重要的部分,但被埋没在评论中。回答的语气也相当激烈和贬低人的感觉。 - kmac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接