Cuda,确定SM上的最后一个块

时间:2014-10-11 04:10:29

标签: cuda

简而言之:是否可以确定某个块是否是该特定SM上的最后一个(如果是第一个)?

详细说明: 我有一个问题,每个块进行一个非常复杂的计算,这导致一个约 2K元素的数组,我想要这些元素的总结。我有 3K块。但是,如果我在每个块的末尾原子添加到全局存储器阵列,那可能会非常缓慢。 那么我想做什么:

  1. 使用共享数组对每个SM中的值进行求和
  2. 如果该块是该SM中的第一个(该特定SM上还没有任何块正在运行),则初始化共享阵列(以0清除)
  3. 进行计算,并将结果添加到共享数组
  4. 如果它是此SM中的最后一个块,则将共享数组值添加到全局数组。
  5. 这可能吗?还是其他解决方案?

1 个答案:

答案 0 :(得分:2)

这是不可能的。

共享内存分配每个块。共享存储器的生存期在块开始时开始,在块结束时结束。 SM上其他块的共享内存将是独立的,假设它们恰好位于同一位置是不合法或有效的。

每个块应该自己进行缩减,并将其值写入全局内存。如果你想避免原子,那么让每个块将它自己的值写入共享内存中的不同位置,并让网格中的最后一个块执行最终计算。这可以按照threadfence reduction sample code

中列出的方法进行

您还可以让每个块循环遍历多个数据集。在这种情况下,在将中间结果写入全局内存之前,每个块都能够将多个数据集的结果累积到共享内存中。