如果我们为一个 SM 配置了 256 个线程/块,那么总共将是 3 个块/SM(考虑最大 768 个线程/SM)。现在总经线/块将是 256/32 = 8,因此 8*3 = 24 经线/SM。那么,这 8 个块中的扭曲将按顺序执行还是并行执行,而 SM 中的 24 个扭曲将按顺序执行还是并行执行?正如已经明确的那样,SM(并行)可以随时执行 3 个块。
问问题
505 次
1 回答
2
@robot,我将讨论移至答案以获得更好的可读性。如果你愿意,你也可以接受。
不同的块可以映射到不同的 SM,因此可以并行执行。但是,在内部,块由warp 组成,这些warp 被安排在一个SM 上一次执行一个(在1.x 设备上)。但是,图形硬件可以以 0 开销(由于静态寄存器分配)在不同的扭曲之间切换。因此,通常来自不同扭曲(可能来自不同块)的指令存在于 SM 的流水线中的不同阶段。
活动扭曲是那些准备好执行的扭曲,即不等待屏障、内存访问并且没有寄存器依赖关系(如写入后读取)。我不确定硬件如何选择下一个要执行的扭曲。可能扭曲按“年龄”(等待时间)和其他因素优先考虑,以防止饥饿。
关于您的问题:
- 在 1.x 设备上,每个 SM 最多可以有 768 个线程,即 24 个 warp/SM。在 2.x 及更高版本上,每个 SM 最多有 1536 个线程/48 个扭曲(取决于寄存器使用情况)
- 如果每个 GPU 有 10 个 SM,并且您有足够的寄存器/共享内存来每个 SM 运行 24 个扭曲,那么每个 GPU 最多可以有 24*10 个活动扭曲。但是,很少有所有 warp 同时处于活动状态的情况,因为它们中的大多数将等待内存访问/寄存器依赖项或障碍,具体取决于您的程序逻辑。请注意,一条指令的实际执行(不是调度!)在 1.x 设备上最多可能需要 22 个周期,因此在指令完成之前,warp 将处于非活动状态。
于 2012-11-23T08:51:26.987 回答