CUDA Academy · Lekcja

Rozwijanie pętli za pomocą #pragma unroll

Ograniczać narzut pętli i ujawniać ILP.

Lekcja 2 z 413 kroki

Rozwijanie pętli za pomocą #pragma unroll 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.

Pętle mają ukryte koszty

Każda iteracja pętli wykonuje pracę związaną z licznikiem, porównaniem i skokiem. Ta księgowość to narzut pętli, który sumuje się w często wykonywanych pętlach wewnętrznych.

Co robi rozwijanie pętli

Loop unrolling kopiuje treść pętli kilka razy w każdej iteracji, dzięki czemu pętla wykonuje się mniejszą liczbę razy. Ta sama praca wymaga mniej zliczania i skoków.

for (int i = 0; i < n; i += 2) {
    out[i]     = in[i]     * 2;
    out[i + 1] = in[i + 1] * 2;
}

Pozwól kompilatorowi to zrobić

CUDA udostępnia wskazówkę, dzięki której nie trzeba ręcznie kopiować kodu. Umieść #pragma unroll bezpośrednio przed pętlą, a kompilator rozwinie ją za Pana.

#pragma unroll
for (int i = 0; i < 4; i++)
    sum += a[i];

Wybierz konkretny stopień rozwinięcia

Można zażądać dokładnej wartości, wpisując liczbę po dyrektywie pragma. #pragma unroll 4 rozwija pętlę po cztery iteracje naraz.

#pragma unroll 4
for (int i = 0; i < n; i++)
    acc += w[i] * x[i];

Wyłączanie rozwijania

Czasami pełne rozwinięcie nadmiernie zwiększa kod lub zużywa rejestry. Zapis #pragma unroll 1 mówi kompilatorowi, aby pozostawił pętlę zwiniętą dokładnie tak, jak została napisana.

#pragma unroll 1
for (int i = 0; i < n; i++)
    process(i);

Stała liczba iteracji pomaga

Rozwijanie działa najlepiej, gdy liczba iteracji jest znana w czasie kompilacji. Stała trip count pozwala kompilatorowi całkowicie rozwinąć pętlę do kodu liniowego.

Rozwijanie ujawnia ILP

Skopiowane iteracje często nie zależą od siebie. Daje to schedulerowi więcej niezależnych instrukcji, które można wykonywać równolegle, ukrywając opóźnienia bez dodatkowego kosztu.

Mniej skoków, szybsza ścieżka

Po rozwinięciu pętli sprzęt rzadziej sprawdza warunek zakończenia. Mniejsza liczba skoków oznacza płynniejszy i bardziej przewidywalny strumień instrukcji.

Kompromis dotyczący rejestrów

Więcej aktywnych wartości w każdej iteracji oznacza większe zużycie rejestrów. Agresywne rozwijanie może spowodować spillowanie rejestrów i faktycznie zmniejszyć occupancy, więc nie zawsze się opłaca.

Rozmiar kodu również rośnie

Każda rozwinięta kopia powiększa kernel. Większy kod może zwiększyć presję na instruction cache, dlatego pełne rozwijanie ogromnych pętli może w rzeczywistym sprzęcie przynieść odwrotny skutek.

Zmierz, zanim zaufasz

Rozwijanie jest sugestią, a nie magią. Zawsze pozwól, aby profiler potwierdził, że wybrany stopień rozwinięcia rzeczywiście przyspiesza działanie danego kernela na danym GPU.

Szybkie sprawdzenie

Chce Pan, aby kompilator całkowicie rozwinął małą pętlę o stałej liczbie iteracji. Co należy napisać?

Podsumowanie: zamiana zliczania na szybkość

Dowiedział się Pan, że #pragma unroll zmniejsza narzut pętli i ujawnia ILP, ale zwiększa zużycie rejestrów oraz rozmiar kodu. Należy zmierzyć każdy stopień rozwinięcia, aby mieć pewność. 🧩

Bezpłatny start

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 „Rozwijanie pętli za pomocą #pragma unroll” jest bezpłatna?

Tak — pełny tekst „Rozwijanie pętli za pomocą #pragma unroll” 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 „Rozwijanie pętli za pomocą #pragma unroll”?

Ograniczać narzut pętli i ujawniać ILP. Ć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 „Rozwijanie pętli za pomocą #pragma unroll”?

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. Równoległość na poziomie instrukcji
  2. Rozwijanie pętli za pomocą #pragma unroll
  3. Zwektoryzowane wczytywanie za pomocą float4
  4. Presja na rejestry i spillowanie
← Powrót do CUDA Academy