为什么CUDA Occupancy是以活跃warp数量除以最大支持的warp数量来定义的?

7

占用率被定义为一个流多处理器上活动线程束数与最大支持线程束数之比。假设我在一个流多处理器上运行了4个块,每个块有320个线程,即10个线程束,因此一个流多处理器上有40个线程束。假设一个流多处理器上最大支持的线程束数为48(CC 2.x),则占用率为40/48。

但是总共有320 * 4个线程在一个流多处理器上运行,而一个流多处理器只有48个CUDA核心。为什么占用率不是100%?我正在使用所有CUDA核心...

我很确定我漏掉了什么...


2
机器需要每个核心多个线程以隐藏延迟并以全速运行。这就是为什么在一个SM上同时打开多个warp的可能性。占用包括正在执行的warp和所有准备执行的warp。顺便说一下,许多CC 2.x SM具有32个核心,而不是48个。您可能需要仔细阅读硬件多线程架构的此描述 - Robert Crovella
谢谢。我看了一下编程指南。所以,warp的执行可以在核心上交错进行。单个warp不能充分利用核心。这就是为什么我们以这种方式定义占用率的原因。 - szli
根据架构不同,单个warp(或在双发射架构中的两个)可以“充分利用”给定SM上的核心。但它不能在每个时钟周期都这样做。这就是为什么需要许多warp以及为什么占用率与每个SM上的warp数量有关。 - talonmies
1个回答

10
因为占用率与核心数无关。CUDA是一种流水线SIMD风格的架构。你的48个核心从管道(实际上是双指令)中每个warp指令中获取。你需要大量的warp来保持指令管道充满,否则所有核心都会停滞。这就是为什么占用率是衡量给定内核提供足够并行工作以实现合理性能能力的有些有用的指标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接