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
- Idea drzewa redukcji
- Eliminowanie rozbieżności warpu
- Adresowanie sekwencyjne
- Końcowa redukcja wieloblokowa