简而言之:是否可以确定某个块是否是该特定SM上的最后一个(如果是第一个)?
详细说明: 我有一个问题,每个块进行一个非常复杂的计算,这导致一个约 2K元素的数组,我想要这些元素的总结。我有 3K块。但是,如果我在每个块的末尾原子添加到全局存储器阵列,那可能会非常缓慢。 那么我想做什么:
这可能吗?还是其他解决方案?
答案 0 :(得分:2)
这是不可能的。
共享内存分配每个块。共享存储器的生存期在块开始时开始,在块结束时结束。 SM上其他块的共享内存将是独立的,假设它们恰好位于同一位置是不合法或有效的。
每个块应该自己进行缩减,并将其值写入全局内存。如果你想避免原子,那么让每个块将它自己的值写入共享内存中的不同位置,并让网格中的最后一个块执行最终计算。这可以按照threadfence reduction sample code
中列出的方法进行您还可以让每个块循环遍历多个数据集。在这种情况下,在将中间结果写入全局内存之前,每个块都能够将多个数据集的结果累积到共享内存中。