CUDA Academy · Lezione

Srotolare i cicli con #pragma unroll

Riduca l'overhead dei cicli ed esponga l'ILP.

Lezione 2 di 413 passaggi

Srotolare i cicli con #pragma unroll è 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 cicli hanno costi nascosti

Ogni iterazione del ciclo dedica lavoro al contatore, al confronto e al salto. Questa gestione è chiamata loop overhead e si accumula nei cicli interni più eseguiti.

Che cosa fa l'unrolling

Loop unrolling copia il corpo più volte in ogni iterazione, così il ciclo viene eseguito meno volte. Si esegue lo stesso lavoro con meno conteggi e salti.

for (int i = 0; i < n; i += 2) {
    out[i]     = in[i]     * 2;
    out[i + 1] = in[i + 1] * 2;
}

Lasciare fare al compilatore

CUDA offre un suggerimento per evitare di copiare manualmente il codice. Inserisca #pragma unroll subito prima di un ciclo e il compilatore lo srotolerà automaticamente.

#pragma unroll
for (int i = 0; i < 4; i++)
    sum += a[i];

Scegliere un fattore specifico

Può richiedere un numero preciso scrivendo un valore dopo la pragma. #pragma unroll 4 srotola il ciclo quattro iterazioni alla volta.

#pragma unroll 4
for (int i = 0; i < n; i++)
    acc += w[i] * x[i];

Disattivare l'unrolling

A volte lo srotolamento completo gonfia il codice o consuma registri. Scrivere #pragma unroll 1 indica al compilatore di lasciare il ciclo esattamente com'è.

#pragma unroll 1
for (int i = 0; i < n; i++)
    process(i);

I conteggi costanti delle iterazioni aiutano

L'unrolling funziona meglio quando il numero di iterazioni è noto in fase di compilazione. Un trip count fisso consente al compilatore di espandere completamente il ciclo in codice lineare.

L'unrolling espone l'ILP

Le iterazioni copiate spesso non hanno dipendenze tra loro. Questo fornisce allo scheduler più istruzioni independent da sovrapporre, nascondendo la latenza senza costi aggiuntivi.

Meno salti, percorso più veloce

Con il ciclo srotolato, l'hardware verifica la condition di uscita meno spesso. Meno salti significano un flusso di istruzioni più regolare e prevedibile.

Il compromesso dei registri

Più valori attivi per iterazione significano un maggiore uso dei register. Un unrolling aggressivo può causare spill dei registri e ridurre effettivamente l'occupancy, quindi non è sempre vantaggioso.

Aumenta anche la dimensione del codice

Ogni copia srotolata aumenta le dimensioni del kernel. Un codice più grande può mettere sotto pressione la instruction cache, quindi srotolare completamente cicli enormi può essere controproducente sull'hardware reale.

Misurare prima di fidarsi

L'unrolling è un suggerimento, non una magia. Lasci sempre che il profiler confermi che il fattore scelto esegua davvero il kernel più velocemente sulla propria GPU.

Verifica rapida

Vuole che il compilatore srotoli completamente un piccolo ciclo con numero fisso di iterazioni. Che cosa scrive?

Riepilogo: sostituire i conteggi con la velocità

Ha imparato che #pragma unroll riduce il costo dei cicli ed espone l'ILP, ma deve tener conto del costo in registri e dimensioni del codice. Misuri ogni fattore per verificarne l'efficacia. 🧩

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 «Srotolare i cicli con #pragma unroll» è gratuita?

Sì — il testo completo di «Srotolare i cicli con #pragma unroll» è 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 «Srotolare i cicli con #pragma unroll»?

Riduca l'overhead dei cicli ed esponga l'ILP. 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 «Srotolare i cicli con #pragma unroll»?

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. Parallelismo a livello di istruzione
  2. Srotolare i cicli con #pragma unroll
  3. Caricamenti vettorializzati con float4
  4. Pressione sui registri e spill
← Torna a CUDA Academy