CUDA Academy · Lezione

Condizioni di gara sulla GPU

Scopra perché le scritture concorrenti corrompono i dati.

Lezione 1 di 413 passaggi

Condizioni di gara sulla GPU è una lezione CUDA Academy gratuita su CoddyKit. Questa è la lezione 1 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.

Molte mani, un solo contatore

Sulla GPU, migliaia di thread possono accedere contemporaneamente alla stessa memoria. Quando diversi thread scrivono insieme nello stesso punto, si verifica una condizione di competizione. 🏁

Che cos'è davvero una race

Una condizione di competizione si verifica quando il risultato finale dipende dall'ordine imprevedibile in cui vengono eseguiti i thread. Stesso codice, risultato diverso a ogni lancio.

Lettura-modifica-scrittura

Incrementare un contatore consiste in realtà in tre passaggi: leggere il valore, aggiungere uno e riscriverlo. È in questa sequenza di lettura-modifica-scrittura che si verificano i problemi.

counter = counter + 1;

Come si intercalano i passaggi

Due thread leggono entrambi 5, calcolano entrambi 6 e scrivono entrambi 6. Vi aspettavate 7, ma ottenete 6. Un incremento è scomparso senza lasciare traccia.

L'aggiornamento perso

Quell'incremento scomparso si chiama aggiornamento perso. Con migliaia di thread in competizione, decine o centinaia di aggiornamenti possono scomparire contemporaneamente.

Un kernel che sembra corretto

Questo kernel sembra corretto, ma ogni thread è in competizione sullo stesso indirizzo. Il conteggio finale sarà errato e varierà tra un'esecuzione e l'altra.

__global__ void count(int* total) {
    *total = *total + 1;
}

Perché è non deterministico

L'hardware non garantisce mai un ordine di esecuzione dei thread. Perciò un kernel soggetto a race è non deterministico: può persino funzionare con input piccoli e fallire con quelli grandi.

Le sole letture sono sicure

È perfettamente sicuro che molti thread leggano lo stesso valore. I problemi iniziano solo quando almeno un thread scrive mentre gli altri leggono o scrivono.

Anche le scritture su posizioni distinte sono sicure

Se ogni thread scrive nella propria posizione univoca, come out[i], non c'è alcun conflitto. Perché si verifichi una race, i thread devono puntare alla stessa posizione.

out[i] = a[i] + b[i];

Anticipazione della soluzione

La soluzione consiste nel fare in modo che la lettura-modifica-scrittura avvenga come un unico passaggio indivisibile. Si tratta di un'operazione atomica, che vedrete nella prossima lezione. ⚛️

Individuare le race durante la revisione

Quando revisionate un kernel, chiedetevi: due thread scrivono allo stesso indirizzo senza protezione? In caso affermativo, quasi certamente avete una race sui dati.

Verifica rapida

Assicuriamoci che il concetto di race sia chiaro.

Riepilogo: le race sulla GPU

Avete imparato che una lettura-modifica-scrittura non protetta su dati condivisi causa condizioni di competizione e aggiornamenti persi. Le operazioni atomiche, che vedrete tra poco, rendono questi passaggi indivisibili. ✅

Gratis per iniziare

Impara C++ con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
30
Lezioni
120

Domande Frequenti

La lezione «Condizioni di gara sulla GPU» è gratuita?

Sì — il testo completo di «Condizioni di gara sulla GPU» è 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 «Condizioni di gara sulla GPU»?

Scopra perché le scritture concorrenti corrompono i dati. 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 1 di 4.

Quanto tempo richiede la lezione «Condizioni di gara sulla GPU»?

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. Condizioni di gara sulla GPU
  2. atomicAdd e funzioni correlate
  3. Costruire un istogramma
  4. Atomici personalizzati con atomicCAS
← Torna a CUDA Academy