CUDA Academy · leksjon

Den naive matmul-kjernen

En grunnimplementasjon med 2D-indekser og dens begrensninger

Leksjon 1 av 413 trinn

Den naive matmul-kjernen er en gratis leksjon i CUDA Academy på CoddyKit. Dette er leksjon 1 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.

Matriseprodukt på GPU-måten

Matriseprodukt er kjernen i grafikk og kunstig intelligens. I dag bygger du først en naiv GPU-versjon, og lærer deretter hvorfor den ikke utnytter all tilgjengelig hastighet.

Matematikken på én linje

Hver utgangscelle C[row][col] er et skalarprodukt: multipliser en hel rad i A med en hel kolonne i B, og summer resultatene. 🧮

C[row][col] = sum over k of A[row][k] * B[k][col]

Én tråd per utgang

Den enkleste planen gir hver tråd ett utgangselement i C. Tusenvis av celler beregnes samtidig på tvers av GPU-en.

Et 2D-rutenett med tråder

Siden C er et 2D-rutenett, starter De tråder i to dimensjoner. x-indeksen tilsvarer en kolonne, og y-indeksen tilsvarer en rad.

dim3 threads(16, 16);
dim3 blocks((N+15)/16, (N+15)/16);

Finne cellen til denne tråden

Inne i kernelen beregner hver tråd sin egen rad og kolonne ut fra blokk- og trådindeksene, akkurat som ved 1D-indeksering, men langs begge aksene.

int row = blockIdx.y*blockDim.y + threadIdx.y;
int col = blockIdx.x*blockDim.x + threadIdx.x;

Sjekk av grensene

Rutenett rundes opp, så noen tråder havner utenfor matrisen. Bruk if (row < N && col < N) som beskyttelse før De får tilgang til minnet.

if (row < N && col < N) {
  // safe to compute
}

Den indre løkken

Hver tråd kjører en løkke over k og summerer produkter i en lokal sum. Denne lokale variabelen ligger i et raskt register.

float sum = 0.0f;
for (int k = 0; k < N; ++k)
  sum += A[row*N+k] * B[k*N+col];

Skrive resultatet

Når løkken er ferdig, lagrer tråden den akkumulerte summen i C nøyaktig én gang. Én tråd, én ryddig skriving.

C[row*N + col] = sum;

Radvis utflating

Matrise er en flat 1D-tabell, så De indekserer den som row*N + col. Å få dette oppsettet riktig er halve jobben ved matrisemultiplikasjon.

Hvorfor det fungerer, men går sakte

Denne kernelen er korrekt og lett å lese, men hver tråd leser raden og kolonnen sin direkte fra globalt minne, det tregeste minneområdet.

Den skjulte kostnaden

Nabotråder leser de samme A-radene og B-kolonnene på nytt om og om igjen. Denne bortkastede minnetrafikken er nettopp det flislegging skal løse nå.

Rask kontroll

Tenk over hvordan den naive kernelen fordeler arbeidet på trådene.

Oppsummering

De koblet én tråd til én ut-celle, gikk gjennom k fra globalt minne og så de overflødige lesingene. Nå reduserer De denne trafikken med flislegging. 🚀

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 «Den naive matmul-kjernen» gratis?

Ja – hele teksten i «Den naive matmul-kjernen» 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 «Den naive matmul-kjernen»?

En grunnimplementasjon med 2D-indekser og dens begrensninger 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 1 av 4.

Hvor lang tid tar leksjonen «Den naive matmul-kjernen»?

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. Den naive matmul-kjernen
  2. Delpryd den indre multiplikasjonen i fliser
  3. Iterer gjennom flisfasene
  4. Mål ytelsesforbedringen
← Tilbake til CUDA Academy