注意:此问题特定于nVIDIA Compute Capability 2.1设备。以下信息可从CUDA编程指南v4.1获得:
在计算能力2.1设备中,每个 SM 有48 SP (核心) 用于整数和浮点运算。每个 warp 都是由 32个连续线程。每个SM都有2个 warp调度程序。在每一个 指令发布时间,一个warp调度程序选择一个准备好的warp 线程和问题 2条指令用于核心上的扭曲。
我的怀疑:
答案 0 :(得分:20)
这是指令级并行(ILP)。同时从经线发出的指令必须彼此独立。它们由SM指令调度程序发出,用于分隔SM中的功能单元。
例如,如果warp的指令流中有两个独立的FMAD指令准备发布,并且SM有两组可用的FMAD单元,那么它们都可以在同一个周期内发出。 (说明可以各种组合一起发布,但我没有记住它们,所以我不会在这里提供详细信息。)
SM 2.1中的FMAD / IMAD执行单元为16 SP宽。这意味着向16个宽的执行单元之一发出warp(32线程)指令需要2个周期。每个SM有多个(3个)这16个宽的执行单元(总共48个SP),以及特殊功能单元。每个warp调度程序可以在每个循环中发出两个。
假设FMAD执行单位为pipe_A
,pipe_B
和pipe_C
。让我们说在第135周期,有两个独立的FMAD指令fmad_1
和fmad_2
正在等待:
fmad_1
的前半个warp(16个线程)发送到FMAD pipe_A
,将fmad_2
的前半个warp发送到FMAD {{1 }}。 pipe_B
的上半周变形将移至FMAD fmad_1
的下一阶段,同样pipe_A
的上半周变形将移至下一阶段在FMAD fmad_2
阶段。 warp调度程序现在将pipe_B
的后半个warp发布到FMAD fmad_1
,将pipe_A
的后半个warp发布到FMAD fmad_2
。 因此从同一个warp发出2个指令需要2个周期。但是,正如OP提到的那样,有两个warp调度程序,这意味着整个过程可以同时完成另一个warp的指令(假设有足够的功能单元)。因此,最大发布率是每个周期2个扭曲指令。注意,这是程序员视角的抽象视图 - 实际的低级架构细节可能不同。
至于你关于接下来什么时候准备就绪的问题,如果有更多的指令不依赖于任何未完成的(已经发布但未退役的)指令,那么它们可以在下一个周期发布。但是,只有可用的指令依赖于飞行中的指令,经线将无法发出。然而,这是其他warp进入的地方 - SM可以为任何具有可用(非阻塞)指令的驻留warp发出指令。 warps之间的这种任意切换提供了GPU依赖于高吞吐量的“延迟隐藏”。