线程调度严格来说是一个实现概念。因此,它必须在特定硬件实现的背景下进行讨论。在迄今为止的大多数实现中,分配给SM的块被进一步分为32个称为warps的线程单元。warps的大小是特定于实现的。warps不是CUDA规范的一部分;然而,了解warps有助于理解和优化特定代CUDA设备上CUDA应用程序的性能。warps的大小是CUDA设备的属性,位于设备查询变量(在本例中为dev_prop)的warpSize字段中。
warp是SM中线程调度的单位。图3.13显示了在实现中将块划分为warp。每个warp经由32个连续的线程ldx值组成:线程0到31形成第一个warp,32到63第二个warp等。在本例中,三个块——第1块、第2块和第3块被分配给一个SM。出于调度目的,这三个区块中的每一个都进一步分为warp。
我们可以计算给定块大小和分配给每个SM的给定块数的驻留在SM中的warps。在图3.13中,如果每个块有256个线程,我们可以确定每个块有256/32或8个warps。每个SM有三个块,每个SM有8×3=24个warps。
SM旨在按照单指令、多数据(SIMD)模型执行warp中的所有线程,即在任何时候,都会为warp中的所有线程获取并执行一条指令。这种情况如图3.13所示,在SM中的执行单元(SP)之间共享单个指令获取/调度。这些线程将对数据的不同部分应用相同的指令。因此,warp中的所有线程将始终具有相同的执行时间。
图3.13还显示了一些实际执行指令的硬件流处理器(SPÿ