Aula 11: Divergência de Warp
Um warp é um grupo de 32 threads que executam a mesma instrução juntas (lockstep) no modelo SIMT. Enquanto toda thread do warp segue o mesmo caminho de código, o hardware as executa juntas em um único passo. Mas o que acontece quando um if/else manda algumas threads para o ramo if e outras para o el
Imagine um coral de 32 cantores que precisam cantar a mesma nota a cada momento. Se metade precisa cantar 'lá' e metade 'dó', o regente primeiro deixa todos os cantores do 'lá' cantarem (os demais ficam em silêncio) e depois todos os do 'dó'. Isso leva o dobro do tempo. Mas se um coral inteiro canta 'lá' e um segundo coral inteiro canta 'dó', os dois cantam ao mesmo tempo sem desperdício.
- divergência de warp
- Quando threads do mesmo warp tomam ramos if/else diferentes, o hardware executa os caminhos em série — o tempo é a soma dos caminhos.
- lockstep
- Todas as 32 threads de um warp executam a mesma instrução no mesmo passo. Essa é a base do SIMT.
- predication
- Quando só algumas threads de um ramo estão ativas, as demais ficam mascaradas: elas executam a mesma instrução, mas não escrevem nenhum resultado.
- ramo uniforme
- Uma condição que todas as threads de um warp avaliam da mesma forma (por exemplo, por warpId), então não há divergência nem penalidade.