CUDA Academy · Lektion

Dynamiskt delat minne

Bestäm storleken på delat minne vid start.

Lektion 4 av 413 steg

Dynamiskt delat minne är en gratis lektion i CUDA Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för CUDA Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i CUDA Academy innehåller totalt 4 lektioner.

När storleken ännu inte är känd

Ibland beror storleken på den delade arrayen på ett värde vid körning, så du kan inte hårdkoda den. CUDA löser detta med dynamiskt delat minne.

Deklarationen extern

Du deklarerar det med extern __shared__ och tomma hakparenteser. Ingen storlek anges i koden, så kompilatorn lämnar den öppen.

extern __shared__ float sdata[];

Storleken anges vid start

Du skickar antalet byte som den tredje startparametern, mellan trådantalet och de avslutande hakparenteserna. Då anges storleken vid körning.

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

Det anges alltid i byte

Ett klassiskt fel: det tredje argumentet anger storleken i byte, inte antalet element. Multiplicera alltid antalet med sizeof för att få rätt värde.

Standardvärdet är noll byte

Om du utelämnar det tredje argumentet reserverar CUDA noll byte dynamiskt delat minne. Att läsa sdata innebär då odefinierat beteende, så glöm det aldrig.

Statiskt och dynamiskt tillsammans

Du kan använda båda typerna i samma kernel. Statiska arrayer behåller fasta storlekar, medan det dynamiska blocket anpassas efter startargumentet.

En buffer, flera arrayer

Dynamiskt delat minne ger dig en linjär buffer. Om du vill lagra flera arrayer delar du själv upp den med pekarförskjutningar. 🔪

Dela upp med förskjutningar

Låt en andra array börja en bit in i bufferten. Var bara noga med att justera varje del så att en float aldrig börjar mitt i ett ord.

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

Varför använda dynamiskt minne

Det gör att en kompilerad kernel kan hantera många tile-storlekar. Du justerar storleken på det delade minnet vid varje start utan att kompilera om för varje fall.

Håll koll på maskinvarugränsen

Du kan fortfarande inte överskrida det maximala värdet per block. Om du begär för många byte vid start misslyckas kerneln helt enkelt med att starta.

Aktivera stora allokeringar

För att överskrida standardgränsen på nyare GPU:er måste du aktivera stödet med cudaFuncSetAttribute före starten. Annars avvisas stora begäranden.

Snabb kontroll

Låt oss kontrollera hur storleken på dynamiskt delat minne anges.

Sammanfattning

Du har lärt dig att arrayer med extern __shared__ får sin storlek i byte vid start, kan delas upp i flera arrayer och omfattas av gränsen per block. Kursen är slutförd! 🎉

Gratis att börja

Lär dig C++ med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”Dynamiskt delat minne” gratis?

Ja – hela texten till ”Dynamiskt delat minne” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i CUDA Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i CUDA Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Dynamiskt delat minne”?

Bestäm storleken på delat minne vid start. Ni övar på CUDA Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig CUDA Academy?

Du behöver inga förkunskaper. Utbildningen i CUDA Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Dynamiskt delat minne”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här CUDA Academy-lektionen?

Ja. Varje CUDA Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Deklarera __shared__-arrayer
  2. Synkronisera med __syncthreads
  3. Undvik bankkonflikter
  4. Dynamiskt delat minne
← Tillbaka till CUDA Academy