Redução final em vários blocos
Combine as somas parciais de cada bloco.
Redução final em vários blocos é uma aula grátis de CUDA Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de CUDA Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de CUDA Academy inclui 4 aulas no total.
Os blocos não podem se comunicar
Uma redução dentro de um bloco é fácil, mas os blocos executam de forma independente e não podem sincronizar entre si durante o núcleo. Portanto, um único lançamento não pode somar tudo.
Cada bloco produz uma soma parcial
Assim, cada bloco reduz sua própria parte a um número, uma soma parcial, e a grava em um pequeno array de saída indexado por blockIdx.
if (tid == 0)
out[blockIdx.x] = data[0];Agora você tem menos valores
Com 1000 blocos, você passa de um milhão de entradas para 1000 somas parciais. A parte difícil terminou; resta combinar apenas um array pequeno.
Estratégia um: lançar novamente
A forma mais simples de concluir é fazer um segundo lançamento do mesmo núcleo sobre as somas parciais. Repita até restar apenas um valor.
Repetir até restar um
Cada passagem reduz o array pelo tamanho do bloco. Alguns lançamentos recursivos reduzem milhões de valores a uma única soma final.
Estratégia dois: operações atômicas
Como alternativa, a thread 0 de cada bloco pode adicionar sua soma parcial diretamente a um único total global usando atomicAdd, evitando um segundo núcleo.
if (tid == 0)
atomicAdd(total, data[0]);O compromisso das operações atômicas
As operações atômicas são simples e exigem apenas um lançamento, mas muitos blocos competindo pelo mesmo endereço podem ser serializados. Com poucas somas parciais, geralmente funcionam bem.
Estratégia três: laço com passo da grade
Um laço com passo da grade permite que cada thread some primeiro muitos elementos em um registrador, reduzindo bastante o número de blocos necessários antes da etapa final.
for (int i = gid; i < n; i += gridDim.x * blockDim.x)
sum += in[i];Menos blocos, menos sobrecarga
Fazer mais trabalho por thread no início significa menos somas parciais e menos lançamentos. Isso costuma ser melhor que criar uma thread por elemento.
Zerar o total primeiro
Se usar operações atômicas, lembre-se de zerar o total global antes de iniciar, ou a soma começará com lixo deixado nessa memória.
Escolha pelo Tamanho do Problema
Entradas pequenas se beneficiam da simplicidade das operações atômicas; entradas enormes favorecem um projeto de duas passagens ou com avanço pela grade. Faça medições com seus dados para escolher.
Verificação Rápida
Pense por que uma única inicialização do núcleo não pode somar diretamente todo o vetor.
Recapitulação
Cada bloco produz uma soma parcial, e depois você as combina com uma segunda inicialização, operações atômicas ou avanço pela grade. Agora você pode reduzir vetores de qualquer tamanho. 🏁
Aprenda C++ com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 30
- Aulas
- 120
Perguntas Frequentes
A aula “Redução final em vários blocos” é grátis?
Sim — o texto completo de “Redução final em vários blocos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de CUDA Academy, atualize para CoddyKit PRO. O curso de CUDA Academy inclui 4 aulas no total.
O que vou aprender em “Redução final em vários blocos”?
Combine as somas parciais de cada bloco. Você pratica CUDA Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar CUDA Academy?
Nenhuma experiência prévia é necessária. CUDA Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Redução final em vários blocos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de CUDA Academy?
Sim. Cada aula de CUDA Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- A ideia da árvore de redução
- Elimine a divergência de warps
- Endereçamento sequencial
- Redução final em vários blocos