0Pricing
CUDA Academy · Lezione

Sincronizzare con __syncthreads

Utilizzi barriere per mantenere sincronizzati i thread.

Sincronizzare con __syncthreads è una lezione CUDA Academy gratuita su CoddyKit. Questa è la lezione 2 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 thread perdono la sincronizzazione

I thread di un blocco non procedono in lockstep. Uno potrebbe aver terminato la scrittura mentre un altro sta ancora caricando, quindi non può presumere che i dati siano già pronti.

Ecco la barriera

Una barriera è un punto del codice in cui ogni thread deve attendere finché non sono arrivati tutti. Solo allora il blocco prosegue insieme.

La chiamata __syncthreads

CUDA mette a disposizione __syncthreads() come barriera per l'intero blocco. Chiamandola, ogni thread del blocco si ferma finché non arriva anche l'ultimo. 🛑

__syncthreads();

L'ordine carica-sincronizza-usa

Il pattern fondamentale è semplice: ogni thread carica il proprio elemento nella shared memory, si esegue la sincronizzazione e poi tutti leggono in sicurezza ciò che hanno scritto gli altri.

tile[threadIdx.x] = input[i];
__syncthreads();
float left = tile[threadIdx.x - 1];

Se la salta, ottiene dati errati

Se dimentica la barriera, un thread potrebbe leggere uno slot prima che il thread vicino vi abbia scritto. È una race condition e il risultato è costituito da dati errati e non segnalati.

È anche una memory fence

La barriera rende inoltre le scritture nella shared memory visibili a tutti i thread che la superano. Dopo __syncthreads, quindi, tutti vedono i valori appena scritti.

Tutti devono raggiungerla

La regola rigorosa è questa: ogni thread del blocco deve raggiungere lo stesso __syncthreads. Se alcuni lo saltano, il blocco può rimanere bloccato per sempre.

La trappola dei rami divergenti

Non inserisca mai una barriera in un if eseguito solo da alcuni thread. I thread che seguono l'altro percorso non arriveranno e il blocco entrerà in deadlock. ⚠️

if (threadIdx.x < 64) {
    __syncthreads();
}

Ambito del blocco, non della griglia

Un limite importante: __syncthreads sincronizza solo un blocco. Non può coordinare thread appartenenti a blocchi diversi della griglia.

Sincronizzare nei cicli

Negli algoritmi basati su tile spesso si esegue la sincronizzazione due volte per fase: una volta dopo aver caricato un tile e una volta dopo il calcolo, prima di caricare quello successivo.

Economica, ma non gratuita

Una barriera costa un po' di tempo mentre i thread attendono. La usi quando serve per la correttezza, ma eviti le chiamate superflue che bloccano soltanto i thread più veloci.

Verifica rapida

Verifichiamo la sua comprensione della barriera.

Riepilogo

Ha imparato che __syncthreads() è una barriera per l'intero blocco che mantiene sincronizzati i thread e che inserirla in rami divergenti può causare un deadlock. Prossimo argomento: i conflitti tra bank. 🎯

Domande Frequenti

La lezione «Sincronizzare con __syncthreads» è gratuita?

Sì — il testo completo di «Sincronizzare con __syncthreads» è 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 «Sincronizzare con __syncthreads»?

Utilizzi barriere per mantenere sincronizzati i thread. 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 2 di 4.

Quanto tempo richiede la lezione «Sincronizzare con __syncthreads»?

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