Dynamisk shared memory
Angiv størrelsen på shared memory ved start.
Dynamisk shared memory er en gratis CUDA Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i CUDA Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. CUDA Academy-kurset indeholder 4 lektioner i alt.
Når størrelsen endnu ikke er kendt
Nogle gange afhænger størrelsen på det delte array af en værdi ved kørsel, så du kan ikke fastkode den. CUDA løser dette med dynamisk delt hukommelse.
extern-deklarationen
Du deklarerer den med extern __shared__ og tomme kantede parenteser. Der angives ingen størrelse i koden, så compileren lader den stå åben.
extern __shared__ float sdata[];Størrelsen sættes ved start
Du angiver byteantallet som den tredje startparameter, mellem trådantallet og de afsluttende kantede parenteser. Det sætter størrelsen ved kørsel.
kern<<<blocks, threads, n * sizeof(float)>>>();Det er altid i bytes
En klassisk fejl: Det tredje argument er størrelsen i bytes, ikke antallet af elementer. Gang altid dit antal med sizeof for at få det rigtigt.
Standardværdien er nul bytes
Hvis du udelader det tredje argument, reserverer CUDA nul dynamiske bytes til delt hukommelse. Læsning af sdata giver derefter udefineret opførsel, så glem det aldrig.
Statisk og dynamisk sammen
Du kan bruge begge slags i den samme kernel. Statiske arrays beholder faste størrelser, mens den dynamiske blok tilpasser sig startargumentet.
Én buffer, mange arrays
Dynamisk delt hukommelse giver dig én flad buffer. Hvis du vil have plads til flere arrays, opdeler du den selv ved hjælp af pointerforskydninger. 🔪
Opdeling med forskydninger
Placér et array nummer to et stykke inde i bufferen. Sørg blot for at justere hvert stykke, så en float aldrig starter midt i et ord.
extern __shared__ float buf[];
float* a = buf;
float* b = &buf[blockDim.x];Hvorfor bruge dynamisk hukommelse
Det lader én kompileret kernel håndtere mange tile-størrelser. Du kan justere den delte størrelse ved hver start uden at kompilere igen for hvert tilfælde.
Vær opmærksom på hardwaregrænsen
Du kan stadig ikke overskride det maksimale antal pr. blok. Beder du om for mange bytes ved start, kan kernen ganske enkelt ikke starte.
Tillad store allokeringer
Hvis du vil overskride standardgrænsen på nyere GPU'er, skal du tilvælge det med cudaFuncSetAttribute før starten. Ellers afvises store anmodninger.
Hurtigt tjek
Lad os tjekke, hvordan størrelsen på dynamisk delt hukommelse bestemmes.
Opsummering
Du har lært, at arrays med extern __shared__ får deres størrelse i bytes ved start, kan opdeles i flere arrays og overholder grænsen pr. blok. Kurset er gennemført! 🎉
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “Dynamisk shared memory” gratis?
Ja — hele teksten til “Dynamisk shared memory” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af CUDA Academy-kurset, skal du opgradere til CoddyKit PRO. CUDA Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Dynamisk shared memory”?
Angiv størrelsen på shared memory ved start. Du øver dig i CUDA Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på CUDA Academy?
Der kræves ingen tidligere erfaring. CUDA Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Dynamisk shared memory”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne CUDA Academy-lektion?
Ja. Alle CUDA Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Deklarér __shared__-arrays
- Synkronisér med __syncthreads
- Undgå bankkonflikter
- Dynamisk shared memory