CUDA Academy · leksjon

Dynamisk delt minne

Angi størrelsen på delt minne ved oppstart

Leksjon 4 av 413 trinn

Dynamisk delt minne er en gratis leksjon i CUDA Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i CUDA Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i CUDA Academy inneholder totalt 4 leksjoner.

Når størrelsen ennå ikke er kjent

Noen ganger avhenger størrelsen på shared-arrayet av en verdi ved kjøring, slik at du ikke kan hardkode den. CUDA løser dette med dynamisk shared memory.

extern-deklarasjonen

Du deklarerer den med extern __shared__ og tomme klammeparenteser. Ingen størrelse angis i koden, så kompilatoren lar den stå åpen.

extern __shared__ float sdata[];

Størrelsen angis ved oppstart

Du sender antallet byte som den tredje oppstartsparameteren, mellom trådantallet og de avsluttende klammeparentesene. Dermed angis størrelsen ved kjøring.

kern<<<blocks, threads, n * sizeof(float)>>>();

Det er alltid byte

En klassisk feil: Det tredje argumentet er størrelsen i byte, ikke antall elementer. Multipliser alltid antallet med sizeof for å få riktig verdi.

Standardverdien er null byte

Hvis du utelater det tredje argumentet, reserverer CUDA null dynamisk shared memory. Lesing fra sdata gir da udefinert oppførsel, så ikke glem argumentet.

Statisk og dynamisk sammen

Du kan bruke begge typene i én kernel. Statiske arrayer beholder faste størrelser, mens den dynamiske blokken tilpasses oppstartsargumentet.

Én buffer, mange arrayer

Dynamisk shared memory gir deg én flat buffer. Hvis du vil lagre flere arrayer, deler du den selv opp ved hjelp av pekerforskyvninger. 🔪

Oppdeling med forskyvninger

La et annet array begynne et stykke inn i bufferen. Pass bare på å justere hver del slik at en float aldri begynner midt i et ord.

extern __shared__ float buf[];
float* a = buf;
float* b = &buf[blockDim.x];

Hvorfor bruke dynamisk minne

Det lar én kompilert kernel håndtere mange flisestørrelser. Du kan justere shared-størrelsen for hver oppstart uten å kompilere på nytt for hvert tilfelle.

Vær oppmerksom på maskinvaregrensen

Du kan fortsatt ikke overskride det maksimale per blokk. Hvis du ber om for mange byte ved oppstart, starter kernelen ganske enkelt ikke.

Aktivere store allokeringer

For å gå over standardgrensen på nyere GPU-er må du aktivere dette uttrykkelig med cudaFuncSetAttribute før oppstart. Ellers avvises store forespørsler.

Rask sjekk

La oss sjekke hvordan størrelsen på dynamisk shared memory angis.

Oppsummering

Du har lært at extern __shared__-arrayer får byte-størrelsen sin ved oppstart, kan deles opp i flere arrayer og må overholde grensen per blokk. Kurset er fullført! 🎉

Gratis å komme i gang

Lær deg C++ med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «Dynamisk delt minne» gratis?

Ja – hele teksten i «Dynamisk delt minne» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av CUDA Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i CUDA Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Dynamisk delt minne»?

Angi størrelsen på delt minne ved oppstart Du øver på CUDA Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med CUDA Academy?

Ingen tidligere erfaring er nødvendig. CUDA Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Dynamisk delt minne»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne CUDA Academy-leksjonen?

Ja. Alle CUDA Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Deklarer __shared__-tabeller
  2. Synkroniser med __syncthreads
  3. Unngå bankkonflikter
  4. Dynamisk delt minne
← Tilbake til CUDA Academy