Memoria condivisa dinamica
Dimensioni la memoria condivisa al momento dell'avvio.
Memoria condivisa dinamica è una lezione CUDA Academy gratuita su CoddyKit. Questa è la lezione 4 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.
Quando la dimensione non è ancora nota
A volte la dimensione dell'array condiviso dipende da un valore determinato a runtime, quindi non è possibile impostarla direttamente nel codice. CUDA risolve il problema con la shared memory dinamica.
La dichiarazione extern
La si dichiara con extern __shared__ e parentesi quadre vuote. Nel codice non viene specificata alcuna dimensione, quindi il compilatore la lascia aperta.
extern __shared__ float sdata[];Dimensione impostata al lancio
Si passa il numero di byte come terzo parametro del lancio, tra il numero di thread e le parentesi quadre di chiusura. In questo modo la dimensione viene impostata a runtime.
kern<<<blocks, threads, n * sizeof(float)>>>();È sempre espressa in byte
Un errore classico: il terzo argomento indica la dimensione in byte, non in elementi. Moltiplichi sempre il numero di elementi per sizeof per ottenere il valore corretto.
Il valore predefinito è zero byte
Se si omette il terzo argomento, CUDA riserva zero byte di shared memory dinamica. Leggere sdata costituisce quindi un comportamento non definito: non lo dimentichi mai.
Statico e dinamico insieme
È possibile usare entrambi i tipi nello stesso kernel. Gli array statici mantengono dimensioni fisse, mentre il blocco dinamico si adatta all'argomento del lancio.
Un buffer, molti array
La shared memory dinamica fornisce un unico buffer piatto. Per contenere diversi array, deve suddividerlo manualmente usando offset di puntatori. 🔪
Suddividere con gli offset
Faccia iniziare un secondo array a una certa distanza dall'inizio del buffer. Presti però attenzione ad allineare ogni parte, in modo che un float non inizi a metà di una parola.
extern __shared__ float buf[];
float* a = buf;
float* b = &buf[blockDim.x];Perché usare la memoria dinamica
Consente a un unico kernel compilato di gestire molte dimensioni di tile. Può regolare la dimensione della shared memory a ogni lancio senza ricompilare per ogni caso.
Attenzione al limite hardware
Non è comunque possibile superare il massimo previsto per blocco. Se al lancio si richiedono troppi byte, il kernel semplicemente non viene avviato.
Abilitare allocazioni di grandi dimensioni
Per superare il limite predefinito sulle GPU più recenti, è necessario abilitare esplicitamente questa possibilità con cudaFuncSetAttribute prima del lancio. In caso contrario, le richieste di grandi dimensioni vengono rifiutate.
Verifica rapida
Verifichiamo come viene determinata la dimensione della shared memory dinamica.
Riepilogo
Ha imparato che gli array extern __shared__ ricevono la propria dimensione in byte al momento del lancio, possono essere suddivisi in diversi array e rispettano il limite per blocco. Corso completato! 🎉
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 «Memoria condivisa dinamica» è gratuita?
Sì — il testo completo di «Memoria condivisa dinamica» è 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 «Memoria condivisa dinamica»?
Dimensioni la memoria condivisa al momento dell'avvio. 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 4 di 4.
Quanto tempo richiede la lezione «Memoria condivisa dinamica»?
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
- Dichiarare array __shared__
- Sincronizzare con __syncthreads
- Evitare i conflitti tra banchi
- Memoria condivisa dinamica