【问题标题】:Conversion from block dimensions to warps in CUDA [duplicate]CUDA中从块尺寸到扭曲的转换[重复]
【发布时间】:2015-07-07 21:22:05
【问题描述】:

我对某些维度的块如何映射到大小为 32 的扭曲有点困惑。

我已经阅读并亲身体验了块的内部尺寸是 32 的倍数可以提高性能。

假设我创建了一个尺寸为 16x16 的块。 经线是否可以包含来自两个不同 y 维度的线程,例如1和2?

为什么内部维度为 32 会提高性能,即使从技术上讲有足够多的线程可以调度到 warp?

【问题讨论】:

  • 映射公式在the documentation中详细说明。有许多类似的问题可以解释从 2D 线程块到扭曲的映射,例如 thisthis。 32 的内部维度可能对性能有帮助,也可能无济于事,这取决于实际的访问模式和基础数据的排列。例如,对于许多大型 2D 代码,16,16 和 32,8 线程块之间没有太大的性能差异。

标签: cuda


【解决方案1】:

About warp and threadsHow are CUDA threads divided into warps? 已经回答了您最大的问题。所以,我把这个答案集中在为什么

CUDA 中的块大小始终是扭曲大小的倍数。 warp 大小由实现定义,numbe 32 主要与共享内存组织、数据访问模式和数据流控制有关 [1]。

因此,块大小为 32 的倍数并不会提高性能,而是意味着所有线程都将用于某事。请注意,用于某事取决于您对块中的线程执行的操作。

块大小不是 32 的倍数,即使您请求更少的线程,也会向上舍入到最接近的倍数。请参阅 NVIDIA 的 Cliff Woolley 的 GPU 优化基础演示 开发者技术组有关于性能的有趣提示。

另外,内存操作和指令是每个warp执行的,所以你可以理解这个数字的重要性。我认为它是 32 而不是 16 或 64 的原因是无证的。所以我喜欢把经线大小记住为“生命、宇宙和一切终极问题的答案”[2]。

[1] David B Kirk 和 W Hwu Wen-mei。大规模并行处理器编程:实践方法。爱思唯尔,2010 年。

[2] 银河系漫游指南。

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 2013-02-16
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2015-12-25
    • 2011-08-08
    • 2019-05-27
    • 2014-07-09
    相关资源
    最近更新 更多