Dynamiskt delat minne
Bestäm storleken på delat minne vid start.
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! 🎉
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
- Deklarera __shared__-arrayer
- Synkronisera med __syncthreads
- Undvik bankkonflikter
- Dynamiskt delat minne