Synchronizowanie za pomocą __syncthreads
Używać barier, które utrzymują wątki w tym samym kroku.
Synchronizowanie za pomocą __syncthreads to bezpłatna lekcja CUDA Academy na CoddyKit. To lekcja 2 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.
Wątki tracą synchronizację
Wątki w bloku nie działają krok w krok. Jeden może zakończyć zapis, gdy inny wciąż odczytuje dane, więc nie można zakładać, że dane są już gotowe.
Poznaj barierę
Bariera to miejsce w kodzie, w którym każdy wątek musi czekać, aż dotrą do niego wszystkie pozostałe. Dopiero wtedy blok przechodzi dalej wspólnie.
Wywołanie __syncthreads
CUDA udostępnia __syncthreads() jako barierę obejmującą cały blok. Wywołaj ją, a każdy wątek w bloku zatrzyma się do chwili przybycia ostatniego wątku. 🛑
__syncthreads();Kolejność: załaduj, zsynchronizuj, użyj
Podstawowy wzorzec jest prosty: każdy wątek ładuje swój fragment do pamięci współdzielonej, następuje synchronizacja, a potem wszyscy bezpiecznie odczytują dane zapisane przez pozostałe wątki.
tile[threadIdx.x] = input[i];
__syncthreads();
float left = tile[threadIdx.x - 1];Pomiń ją, a otrzymasz śmieci
Bez bariery wątek może odczytać element, zanim sąsiedni wątek go zapisze. To wyścig danych, którego wynikiem są ciche, błędne dane.
To także bariera pamięci
Bariera sprawia również, że zapisy do pamięci współdzielonej stają się widoczne dla wszystkich wątków po jej przekroczeniu. Po przejściu przez __syncthreads wszyscy widzą więc świeżo zapisane wartości.
Muszą dotrzeć wszyscy albo nikt
Ścisła zasada brzmi: każdy wątek w bloku musi dotrzeć do tego samego __syncthreads. Jeśli niektóre wątki je pominą, blok może zawiesić się na zawsze.
Pułapka rozgałęzienia
Nigdy nie umieszczaj bariery wewnątrz instrukcji if, do której wchodzą tylko niektóre wątki. Wątki wybierające drugą ścieżkę nigdy nie dotrą do bariery, a blok zakleszczy się. ⚠️
if (threadIdx.x < 64) {
__syncthreads();
}Zakres bloku, nie całej siatki
Ważne ograniczenie: __syncthreads synchronizuje tylko jeden blok. Nie może koordynować wątków z różnych bloków siatki.
Synchronizacja wewnątrz pętli
W algorytmach kafelkowych często synchronizujesz wątki dwa razy na fazę: raz po załadowaniu kafelka i raz po obliczeniach, przed załadowaniem następnego.
Tania, ale nie bezpłatna
Bariera kosztuje trochę czasu, ponieważ wątki muszą czekać. Używaj jej tam, gdzie wymaga tego poprawność, ale unikaj zbędnych wywołań, które tylko zatrzymują szybsze wątki.
Szybki test
Sprawdźmy, czy rozumiesz działanie bariery.
Podsumowanie
Dowiedziałeś się, że __syncthreads() to bariera obejmująca cały blok, która utrzymuje synchronizację wątków, a umieszczenie jej w rozbieżnych gałęziach może prowadzić do zakleszczenia. Dalej: konflikty banków. 🎯
Ucz się C++ dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 30
- Lekcje
- 120
Często zadawane pytania
Czy lekcja „Synchronizowanie za pomocą __syncthreads” jest bezpłatna?
Tak — pełny tekst „Synchronizowanie za pomocą __syncthreads” 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 „Synchronizowanie za pomocą __syncthreads”?
Używać barier, które utrzymują wątki w tym samym kroku. Ć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 2 z 4.
Ile czasu zajmuje lekcja „Synchronizowanie za pomocą __syncthreads”?
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
- Deklarowanie tablic __shared__
- Synchronizowanie za pomocą __syncthreads
- Unikanie konfliktów banków pamięci
- Dynamiczna pamięć współdzielona