Yes. When a threadblock is deposited on a SM by the CWD/block scheduler, the warps in that threadblock are statically assigned to SMSPs (SM sub-partitions). Each sub-partition has a single warp scheduler, so this is like saying the warps are statically assigned to each of the warp schedulers. If there is only one warp scheduler, all warps will be assigned to that. If there are two warp schedulers, about half of the warps will be assigned to one (assuming the SM is empty) and about half will be assigned to the other. If there are 4 warp schedulers in the SM, and assuming an initially empty SM, then the warps will be distributed approximately 1/4 to each warp scheduler. Certain functional unit resources in a SM are also partitioned between the SMSPs. So a SM with 64 “cuda cores” and 4 warp schedulers means that each SMSP/warp scheduler actually only has 16 “cuda cores” to use or assign instructions to.
Is this still the case on consumer cards? (Most curious about Ampere, Ada and Blackwell).
If so is there any sort of order to how the warps are assigned? For example does each sub-partition get every fourth warp (or some other fixed distribution scheme) or is it affected by the amount of work already assigned to the SM? Is there any sort of typical pattern assuming the SM is initially empty? The reason I’m asking is because if there is indeed a pattern I would like to exploit it with gl_WarpIDNV to be able to find out what sub-partition a warp belongs to (which VK_NV_shader_sm_builtins doesn’t seem to expose) in order to try my hand at some dynamic work redistribution across the SM. Thanks!