0Pricing
CUDA Academy · Lekcja

Adresowanie sekwencyjne

Stosować pozbawione konfliktów kroki w pamięci współdzielonej.

Adresowanie sekwencyjne to bezpłatna lekcja CUDA Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej CUDA Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs CUDA Academy zawiera 4 lekcji w sumie.

Pamięć współdzielona ma banki

Pamięć współdzielona jest podzielona na 32 banki, po jednym na każdą ścieżkę warpa. Gdy 32 wątki odwołują się do 32 różnych banków, wszystkie odczyty odbywają się w jednym szybkim cyklu.

Konflikty banków spowalniają działanie

Jeśli dwa wątki warpa odwołują się do tego samego banku, mamy konflikt banku. Sprzęt wykonuje takie dostępy szeregowo, co kosztuje dodatkowe cykle.

Adresowanie przeplatane

W poprzedniej redukcji użyto adresowania przeplatanego: krok zaczyna się od małej wartości i podwaja się, więc elementy partnerskie leżą blisko siebie w pamięci współdzielonej.

int index = 2 * s * tid;
data[index] += data[index + s];

Dlaczego przeplatanie powoduje konflikty

Przy małych, podwajanych krokach kilka ścieżek warpa trafia do tego samego banku. Takie dostępy nie mogą już odbyć się w jednym cyklu.

Odwróć kolejność kroków

Adresowanie sekwencyjne zaczyna od dużego kroku i zmniejsza go o połowę w każdym kroku — odwrotnie niż adresowanie przeplatane. Ta jedna zmiana usuwa konflikty.

for (int s = blockDim.x / 2; s > 0; s >>= 1) {
  if (tid < s)
    data[tid] += data[tid + s];
  __syncthreads();
}

Duży krok, brak konfliktów banków

Duży krok rozdziela adresy elementów partnerskich, więc każda ścieżka trafia do własnego banku. Warp odczytuje dane bez konfliktów w jednym cyklu.

Warunek tid < s

W każdym kroku pracuje tylko dolna połowa wątków, co zapisuje się jako tid < s. Dzięki temu aktywne wątki są ciągłe, a warpy również nie doświadczają rozbieżności.

Dwie korzyści naraz

Adresowanie sekwencyjne eliminuje konflikty banków i unika rozbieżności warpów w tym samym kernelu. Jedna zmiana układu rozwiązuje dwa problemy z wydajnością.

Nadal synchronizuj każdy krok

Nadal potrzebują Państwo wywołania __syncthreads po każdym kroku. Wątki muszą zobaczyć zapisy z poprzedniego poziomu, zanim odczytają dane dla następnego.

Wynik trafia pod indeks 0

Gdy krok zmniejsza się o połowę i zbliża do zera, wszystkie sumy częściowe składają się w data[0]. Następnie wątek 0 zapisuje wynik tego bloku z powrotem do pamięci globalnej.

Klasyczna optymalizacja

Ten wzorzec pochodzi wprost ze słynnego przewodnika NVIDIA dotyczącego redukcji. Adresowanie sekwencyjne to podręcznikowy krok w stronę kernela bez konfliktów.

Szybkie sprawdzenie

Proszę zastanowić się, dlaczego duży krok zmniejszany o połowę jest lepszy od małego kroku podwajanego.

Podsumowanie

Zamienili Państwo adresowanie przeplatane na adresowanie sekwencyjne: krok zaczyna się od dużej wartości i zmniejsza o połowę, eliminując jednocześnie konflikty banków i rozbieżność. Następne: sumy dla wielu bloków. ✨

Często zadawane pytania

Czy lekcja „Adresowanie sekwencyjne” jest bezpłatna?

Tak — pełny tekst „Adresowanie sekwencyjne” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu CUDA Academy, przejdź na CoddyKit PRO. Kurs CUDA Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Adresowanie sekwencyjne”?

Stosować pozbawione konfliktów kroki w pamięci współdzielonej. Ćwiczysz CUDA Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć CUDA Academy?

Nie wymagamy żadnego doświadczenia. CUDA Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Adresowanie sekwencyjne”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji CUDA Academy?

Tak. Każda lekcja CUDA Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Idea drzewa redukcji
  2. Eliminowanie rozbieżności warpu
  3. Adresowanie sekwencyjne
  4. Końcowa redukcja wieloblokowa
← Powrót do CUDA Academy