0Pricing
CUDA Academy · Lezione

Evitare i conflitti tra banchi

Scopra perché il padding può velocizzare l'accesso condiviso.

Evitare i conflitti tra banchi è una lezione CUDA Academy gratuita su CoddyKit. Questa è la lezione 3 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.

La shared memory è divisa in bank

La shared memory è suddivisa in 32 bank, una per ogni thread del warp. Distribuire gli accessi tra queste bank permette a tutti i 32 thread di leggere alla massima velocità.

Come vengono mappati gli indirizzi

Le word consecutive da 4 byte finiscono in bank consecutive, ripartendo da capo dopo 32. La word 0 si trova quindi nella bank 0, così come la word 32.

Che cos'è un conflitto tra bank

Si verifica un conflitto tra bank quando due thread di un warp accedono alla stessa bank ma a word diverse. L'hardware deve serializzare questi accessi.

La serializzazione riduce la velocità

Un conflitto N-way trasforma un accesso veloce in N accessi lenti. Un conflitto 32-way può rendere la shared memory lenta come se gli accessi fossero completamente seriali. 🐢

Il caso ideale: stride uno

Quando ogni thread legge tile[threadIdx.x], ogni thread accede a una bank distinta. Non ci sono conflitti e si raggiunge la larghezza di banda massima.

float v = tile[threadIdx.x];

La trappola: stride pari a 32

Leggere con uno stride pari a 32 manda ogni thread nella stessa bank. È il caso peggiore: un conflitto completo 32-way.

float v = tile[threadIdx.x * 32];

Anche gli stride pari sono dannosi

Qualsiasi stride pari che abbia un fattore in comune con 32 causa conflitti parziali. Uno stride di 2, per esempio, genera un conflitto a 2 vie all'interno del warp.

L'eccezione del broadcast

Buone notizie: se tutti i thread leggono lo stesso indirizzo, l'hardware lo trasmette in un'unica operazione. Leggere la stessa parola va bene; il conflitto si verifica solo quando si accede alla stessa bank per leggere parole diverse.

Il padding viene in aiuto

Per i tile 2D, aggiunga una colonna extra con un padding di +1. In questo modo ogni riga viene traslata e gli accessi alle colonne non finiscono più tutti nella stessa bank.

__shared__ float tile[32][33];

Perché +1 funziona

La colonna extra rende la lunghezza della riga coprima con 32. Ora, scendendo lungo una colonna, si visita ogni volta una bank diversa, eliminando il conflitto.

Faccia profiling, non supposizioni

I conflitti tra bank non sono visibili nel codice sorgente. Utilizzi Nsight Compute per misurare i conflitti della shared memory prima di impegnarsi a risolverli.

Verifica rapida

Verifichiamo che cosa rende veloce l'accesso condiviso.

Riepilogo

Ha imparato che la shared memory ha 32 bank, che gli accessi a parole diverse nella stessa bank vengono serializzati e che il padding di +1 risolve i conflitti sulle colonne. Prossimo argomento: la shared memory dinamica. 🎯

Domande Frequenti

La lezione «Evitare i conflitti tra banchi» è gratuita?

Sì — il testo completo di «Evitare i conflitti tra banchi» è 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 «Evitare i conflitti tra banchi»?

Scopra perché il padding può velocizzare l'accesso condiviso. 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 3 di 4.

Quanto tempo richiede la lezione «Evitare i conflitti tra banchi»?

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

  1. Dichiarare array __shared__
  2. Sincronizzare con __syncthreads
  3. Evitare i conflitti tra banchi
  4. Memoria condivisa dinamica
← Torna a CUDA Academy