CUDA Academy · Lektion

Dynamisk shared memory

Angiv størrelsen på shared memory ved start.

Lektion 4 af 413 trin

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! 🎉

Gratis at komme i gang

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

  1. Deklarér __shared__-arrays
  2. Synkronisér med __syncthreads
  3. Undgå bankkonflikter
  4. Dynamisk shared memory
← Tilbage til CUDA Academy