CUDA Academy · leksjon

Bygg et histogram

Atomiske operasjoner med privatisering i delt minne

Leksjon 3 av 413 trinn

Bygg et histogram er en gratis leksjon i CUDA Academy på CoddyKit. Dette er leksjon 3 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.

Hva et histogram teller

Et histogram teller hvor mange inndata som faller i hver bin. Mange tråder vil forsøke å øke den samme bin-en, så dette er et problem for atomics. 📊

Den naive tilnærmingen

Hver tråd leser ett element, finner bin-en og øker den. Uten beskyttelse mister populære bin-er tellinger på grunn av kappløp.

Den globale atomiske versjonen

Den enkleste korrekte løsningen er én atomicAdd per element direkte i globalt minne. Det fungerer, men populære bin-er serialiserer trådene.

atomicAdd(&hist[bin], 1);

Problemet med konkurranse

Når dataene samler seg i noen få bin-er, samler tusenvis av tråder seg rundt samme adresse. Denne konkurransen kan gjøre globale atomics svært trege.

Privatisering redder situasjonen

Privatisering gir hver blokk sitt eget private histogram i raskt delt minne. Trådene kolliderer bare innenfor blokken sin, ikke på tvers av hele grid-et.

Deklarer det delte histogrammet

Hver blokk deklarerer en delt tabell med størrelse lik antallet bin-er. Den ligger på brikken, så atomics der er langt billigere enn globale atomics.

__shared__ int local[NBINS];

Trinn 1: Tøm bin-ene

Trådene setter det delte histogrammet til null i fellesskap og kaller deretter __syncthreads, slik at ingen teller før tømmingen er ferdig.

local[tid] = 0;
__syncthreads();

Trinn 2: Tell lokalt

Nå øker hver tråd atomisk sin bin i delt minne. Samme atomicAdd, men på den raske kopien på brikken i stedet for i globalt minne.

atomicAdd(&local[bin], 1);

Trinn 3: Slå sammen til globalt minne

Etter en barrierekall legger trådene hver delt bin til det globale histogrammet med én atomicAdd per bin. Det blir langt færre globale atomics enn tidligere.

atomicAdd(&hist[i], local[i]);

Hvorfor dette er raskere

Atomics i delt minne er raske, og de kostbare globale atomics utføres nå én gang per bin per blokk i stedet for én gang per element.

Følg med på antallet bin-er

Det private histogrammet må få plass i delt minne. Hvis det er for mange bin-er, kan du dele dem opp i flere gjennomganger eller gå tilbake til globale atomics.

Rask kontroll

Ett spørsmål om histogramsstrategien.

Oppsummering: Bygg et histogram

De bygde et histogram med globale atomics og gjorde det deretter raskere ved hjelp av privatisering i delt minne: tøm, tell lokalt, slå sammen. ✅

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 «Bygg et histogram» gratis?

Ja – hele teksten i «Bygg et histogram» 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 «Bygg et histogram»?

Atomiske operasjoner med privatisering i delt minne 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 3 av 4.

Hvor lang tid tar leksjonen «Bygg et histogram»?

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. Kappløpstilstander på GPU-en
  2. atomicAdd og beslektede funksjoner
  3. Bygg et histogram
  4. Egendefinerte atomiske operasjoner med atomicCAS
← Tilbake til CUDA Academy