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

我正在做以下事情:

__shared__ int exForBlockLessThanP = totalElementLessThanPivotEntireBlock[blockIdx.x];

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

【问题讨论】:

    标签: cuda gpgpu nvidia


    【解决方案1】:

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

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

    【讨论】:

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