我一直认为warp调度程序将一次执行一个warp,具体取决于哪个warp就绪,而这个warp可以来自多处理器中的任何一个线程块。但是,在其中一个Nvidia webminar幻灯片中,表示“占用率=在多处理器上同时运行的warp数除以可以同时运行的最大warp数”。那么一次可以运行多个warp?这是如何工作的?
谢谢。
答案 0 :(得分:9)
“正在运行”可能更好地解释为“在SM和/或管道中的指令上具有状态”。 GPU硬件调度尽可能多的块或者适合SM的资源(以较小者为准),为它们包含的每个warp(即寄存器文件和本地内存)分配状态,然后开始调度warp以便执行。指令管道似乎长约21-24个周期,因此在任何给定时间都有很多线程处于“运行”的各个阶段。
前两代支持CUDA的GPU(因此G80 / 90和G200)仅在每四个时钟周期从单个warp中退出指令。每两个时钟周期从两个warp计算2.0设备双发出指令,因此每个时钟有两个warp退休指令。 Compute 2.1通过允许有效的乱序执行来扩展这一点 - 每个时钟仍然只有两个warp,但可能同时来自同一warp的两个指令。因此,每个SM额外的16个内核用于指令级并行,仍然是从同一个共享调度程序发出的。