Aula 8: Loops Grid-Stride e N Arbitrário
Até agora assumimos que uma thread cuida de um elemento, com if (i < n) protegendo os limites. Mas o que acontece quando n é maior que o número de threads que lançamos? Com um milhão de elementos e apenas 262.144 threads, metade do array nunca é calculada. A solução é um grid-stride loop: cada threa
Imagine 100 cadeiras para arrumar mas só 10 ajudantes. Em vez de cada um arrumar uma única cadeira e ir para casa, cada ajudante começa na sua cadeira e pula 10 cadeiras para frente a cada vez: 1, 11, 21... assim 10 pessoas cobrem as 100 cadeiras.
- grid-stride loop
- Um padrão em que cada thread trata vários elementos, pulando entre eles no tamanho do grid inteiro até o índice ultrapassar n.
- stride
- A distância que o índice pula para frente: blockDim.x * gridDim.x, o número total de threads no grid.
- gridDim
- O número de blocks no grid. gridDim.x * blockDim.x dá o total de threads ao longo de uma dimensão.
- N arbitrário
- Uma entrada de qualquer tamanho, mesmo maior que o número de threads. Um grid-stride loop cobre isso sem mudar a configuração de lançamento.