This system isn’t exposed to the CUDA programmer, and there are no documented controls to provide fine-grained control over it. The criteria used to schedule blocks are not published.
The CUDA block scheduler will deposit a block of its choosing, from amongst those that are waiting, when it finds a SM that has enough available resources (e.g. warp slots, registers, shared memory, etc.) The CUDA programmer doesn’t have any direct control over it.
The key thing to keep in mind here is that the GPU has limited resources. When you launch a large (threads, shared memory, registers, etc.) kernel, it “occupies” the GPU, and the reason you don’t see overlapping execution is that there is no “space” for additional work.
Breaking a large kernel up into pieces, without other considerations, is usually not a strategy to increase performance.