nVIDIA CC 2.1 GPU warp调度程序如何一次发出2条指令进行扭曲?

时间:2012-03-27 08:39:54

标签: cuda gpu gpu-warp

注意:此问题特定于nVIDIA Compute Capability 2.1设备。以下信息可从CUDA编程指南v4.1获得:

  

在计算能力2.1设备中,每个 SM 有48 SP (核心)   用于整数和浮点运算。每个 warp 都是由   32个连续线程。每个SM都有2个 warp调度程序。在每一个   指令发布时间,一个warp调度程序选择一个准备好的warp   线程和问题 2条指令用于核心上的扭曲。

我的怀疑:

  • 一个线程将在一个核心上执行。设备如何在单个时钟周期或单个多周期操作中向线程发出2条指令?
  • 这是否意味着2条指令应该相互独立?
  • 可以在核心上并行执行2条指令,可能是因为它们在核心中使用不同的执行单元?这是否也意味着只有在完成2条指令执行之后或者在其中一条指令执行完之后,warp才会准备就绪?

1 个答案:

答案 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_Apipe_Bpipe_C。让我们说在第135周期,有两个独立的FMAD指令fmad_1fmad_2正在等待:

  • 在第135周期,指令调度程序将fmad_1的前半个warp(16个线程)发送到FMAD pipe_A,将fmad_2的前半个warp发送到FMAD {{1 }}。
  • 在第136周期,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依赖于高吞吐量的“延迟隐藏”。

相关问题