Riduzione finale su più blocchi
Combini le somme parziali di ciascun blocco.
Riduzione finale su più blocchi è una lezione CUDA Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento CUDA Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso CUDA Academy include 4 lezioni in totale.
I blocchi non possono comunicare
Una riduzione all'interno di un blocco è semplice, ma i blocchi vengono eseguiti indipendentemente e non possono sincronizzarsi tra loro durante l'esecuzione del kernel. Perciò un singolo lancio non può sommare tutto.
Ogni blocco produce un parziale
Ogni blocco riduce quindi il proprio segmento a un solo numero, una somma parziale, e la scrive in un piccolo array di output indicizzato da blockIdx.
if (tid == 0)
out[blockIdx.x] = data[0];Ora avete meno valori
Con 1000 blocchi si passa da un milione di input a 1000 somme parziali. La parte difficile è terminata: resta solo un piccolo array da combinare.
Strategia uno: eseguite un altro lancio
Il modo più semplice per concludere consiste in un secondo lancio dello stesso kernel sulle somme parziali. Ripetete l'operazione finché non rimane un solo valore.
Ricorsione fino a un solo valore
A ogni passaggio l'array si riduce della dimensione del blocco. Alcuni lanci ricorsivi riducono milioni di valori a un'unica somma finale.
Strategia due: operazioni atomiche
In alternativa, il thread 0 di ogni blocco può aggiungere direttamente il proprio parziale a un unico totale globale usando atomicAdd, evitando un secondo kernel.
if (tid == 0)
atomicAdd(total, data[0]);Il compromesso delle operazioni atomiche
Le operazioni atomiche sono semplici e richiedono un solo lancio, ma molti blocchi in contesa sullo stesso indirizzo possono essere serializzati. Con pochi parziali, di solito funzionano bene.
Strategia tre: grid-stride
Un ciclo grid-stride consente innanzitutto a ogni thread di sommare molti elementi in un registro, così prima del passaggio finale servono molti meno blocchi.
for (int i = gid; i < n; i += gridDim.x * blockDim.x)
sum += in[i];Meno blocchi, meno overhead
Eseguire più lavoro per thread all'inizio significa avere meno parziali e meno lanci. Spesso è più efficiente che creare un thread per ogni elemento.
Azzerate prima il totale
Se usate operazioni atomiche, ricordatevi di azzerare il totale globale prima del lancio; altrimenti la somma partirà dai dati residui presenti in quella memoria.
Scegliete in base alla dimensione del problema
Per gli input piccoli, le operazioni atomiche sono vantaggiose per la loro semplicità; per quelli enormi è preferibile un design a due passaggi o grid-stride. Misurate le prestazioni sui vostri dati per scegliere.
Verifica rapida
Riflettete sul motivo per cui un singolo lancio del kernel non può sommare direttamente l'intero array.
Riepilogo
Ogni blocco produce una somma parziale, che poi combinate con un secondo lancio, con operazioni atomiche oppure con un approccio grid-stride. Ora potete ridurre array di qualsiasi dimensione. 🏁
Domande Frequenti
La lezione «Riduzione finale su più blocchi» è gratuita?
Sì — il testo completo di «Riduzione finale su più blocchi» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso CUDA Academy, passa a CoddyKit PRO. Il corso CUDA Academy include 4 lezioni in totale.
Cosa imparerò in «Riduzione finale su più blocchi»?
Combini le somme parziali di ciascun blocco. Eserciti CUDA Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare CUDA Academy?
Non è richiesta alcuna esperienza precedente. CUDA Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Riduzione finale su più blocchi»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione CUDA Academy?
Sì. Ogni lezione CUDA Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- L'idea dell'albero di riduzione
- Eliminare la divergenza dei warp
- Indirizzamento sequenziale
- Riduzione finale su più blocchi