Registri e memoria locale
La memoria per thread più veloce e i relativi spill.
Registri e memoria locale è 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.
La memoria più veloce a disposizione
Ogni thread dispone dei propri registri privati, l'archiviazione più veloce del chip. Si trovano proprio accanto alle unità di calcolo, quindi le letture hanno un costo quasi nullo.
Le variabili normali diventano registri
Quando scrive una normale variabile locale in un kernel, il compilatore solitamente la mantiene in un registro. Non serve alcuna sintassi speciale. 🙂
__global__ void k() {
int x = 5; // x lives in a register
float y = x * 2.0f;
}Privato di un solo thread
Il valore di un registro appartiene esattamente a un thread. Il thread 7 non può vedere il registro del thread 8, ed è per questo che il lavoro per thread rimane nettamente separato.
I registri sono un pool condiviso
Ogni streaming multiprocessor dispone di un register file di dimensioni fisse. Tutti i thread residenti lo suddividono, quindi usare meno registri per thread consente l'esecuzione simultanea di più thread.
Quando finiscono
Se un kernel richiede più registri di quelli disponibili, i valori aggiuntivi vengono spostati altrove. Questo evento si chiama register spill.
Dove finiscono gli spill: memoria locale
I valori soggetti a spill finiscono nella memoria locale, che, nonostante il nome, non si trova sul chip. In realtà risiede nella lenta DRAM esterna al chip.
Locale significa comunque per-thread
La memoria locale è privata di ogni thread, proprio come i registri. La differenza riguarda esclusivamente la velocità, poiché la memoria locale è molto più lenta da raggiungere.
Gli array locali grandi causano spill
Dichiarare un array grande per thread spesso lo forza nella memoria locale, perché semplicemente non ci sono abbastanza registri per contenere ogni elemento.
__global__ void k() {
float buf[64]; // likely lives in local memory
}Gli spill danneggiano le prestazioni
Ogni spill trasforma un accesso gratuito a un registro in un lento viaggio verso la DRAM. Ridurre la pressione sui registri è una delle ottimizzazioni più semplici ed efficaci che si possano applicare.
Visualizzare il numero di registri
Può chiedere al compilatore di riportare il numero di registri per thread. Passi --ptxas-options=-v a nvcc: verrà stampato l'utilizzo per ogni kernel.
nvcc --ptxas-options=-v kernel.cuLimitare intenzionalmente i registri
Il qualificatore __launch_bounds__ suggerisce al compilatore di limitare i registri, scambiando una parte della velocità per thread con un numero maggiore di thread eseguiti insieme.
__global__ void __launch_bounds__(256)
myKernel() { /* ... */ }Verifica rapida
Ha dichiarato un array grande per thread e le prestazioni sono diminuite. Che cosa è probabilmente successo?
Riepilogo: veloci e privati
Ha imparato che i registri sono l'archiviazione per-thread più veloce, che il pool è limitato e che l'eccedenza viene spostata nella lenta memoria locale. Mantenga bassa la pressione sui registri. 🎯
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 «Registri e memoria locale» è gratuita?
Sì — il testo completo di «Registri e memoria locale» è 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 «Registri e memoria locale»?
La memoria per thread più veloce e i relativi spill. 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 «Registri e memoria locale»?
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
- Registri e memoria locale
- Compromessi della memoria globale
- Memoria costante e relativa cache
- Un modello mentale della gerarchia