【问题标题】:Cuda, determine the last block on SMCuda,确定 SM 上的最后一个块
【发布时间】:2014-12-06 07:18:54
【问题描述】:

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

详情: 我有一个问题,每个块都进行了非常复杂的计算,这导致了一个大约 2K 元素的数组,我想对这些元素求和。我有大约 3K 块。但是如果我 atomic add 在每个块的末尾添加到全局内存数组,这可能会严重减慢。 所以我想做什么:

  1. 使用共享数组对每个 SM 中的值求和
  2. 如果该块是该 SM 中的第一个块(该特定 SM 上尚未运行任何块),则初始化共享数组(用 0 清除)
  3. 进行计算,并将结果添加到共享数组中
  4. 如果是此 SM 中的最后一个块,则将共享数组值原子添加到全局数组中。

这可能吗?还是其他解决方案?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    这是不可能的。

    共享内存分配每个块。共享内存的生命周期从块开始时开始,到块结束时结束。 SM 上其他块的共享内存将是分开的,假设它们碰巧在同一个地方是不合法或无效的。

    每个块都应该进行自己的归约,并将其值写入全局内存。如果您想避免原子操作,则让每个块将其自己的值写入共享内存中的不同位置,并让网格中的最后一个块执行最终计算。这可以按照threadfence reduction sample code中概述的方法进行

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 2014-01-13
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多