CUDA Academy · Lekcja

Ochrona przed wyjściem poza zakres

Sprawdzenie zakresu if (i < n).

Lekcja 2 z 413 kroki

Ochrona przed wyjściem poza zakres 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.

Często uruchamiasz zbyt wiele wątków

Liczba wątków wynika ze stałych rozmiarów bloków, dlatego prawie zawsze uruchamiasz kilka dodatkowych wątków poza długością tablicy. Te nadmiarowe wątki wymagają obsługi.

Co może pójść źle

Dodatkowy wątek oblicza indeks znajdujący się za końcem tablicy. Jeśli coś tam zapisze, uzyska dostęp do pamięci, która do niego nie należy, powodując cichy błąd wyjścia poza zakres.

GPU Cię nie ostrzeże

W przeciwieństwie do jednoznacznego awaryjnego zakończenia programu zapis poza zakresem może uszkodzić pobliskie dane lub odczytać przypadkowe wartości. Kernel działa dalej, więc problem pozostaje niewidoczny, dopóki wyniki nie okażą się błędne.

Naprawa zajmuje jedną linię

Zanim dowolny wątek użyje swojego indeksu, sprawdź, czy mieści się on w tablicy. To krótkie sprawdzanie zakresu jest najważniejszym nawykiem zapewniającym bezpieczeństwo w CUDA.

if (i < n) {
    out[i] = a[i] + b[i];
}

Dlaczego mniej niż, a nie mniej lub równo

Poprawne indeksy obejmują zakres od 0 do n minus 1. Ścisły warunek i < n przepuszcza ostatni rzeczywisty element i zatrzymuje pierwszy niepoprawny.

Bezczynne wątki po prostu kończą działanie

Wątek, którego indeks jest poza zakresem, po prostu pomija pracę i kończy działanie. Brak działania jest całkowicie bezpieczny i kosztuje niemal zero czasu.

Przekaż n do kernela

Kernel nie może odgadnąć długości tablicy, dlatego przekazujesz mu n jako parametr. Wtedy zabezpieczenie zawsze wie, gdzie kończą się dane.

__global__ void add(float* a, float* b, float* out, int n) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n) out[i] = a[i] + b[i];
}

Zabezpieczaj także odczyty

Chodzi nie tylko o zapisy. Odczyt a[i] poza końcem tablicy wczytuje przypadkowe dane lub powoduje błąd, dlatego ten sam warunek i < n chroni każdy dostęp.

Częsty błąd o jeden

Przypadkowe zapisanie i <= n pozwala jednemu wątkowi uzyskać dostęp do elementu n, który nie istnieje. Zawsze zachowuj ścisłe porównanie.

Tanie ubezpieczenie

Instrukcja warunkowa kosztuje niemal nic, ponieważ dodatkowych wątków jest niewiele i szybko kończą działanie. Zyskane bezpieczeństwo jest warte znacznie więcej niż ten niewielki koszt. ✅

Uczyń z tego odruch

Traktuj sprawdzanie zakresu jako część samego wzoru indeksu. Oblicz i, a następnie natychmiast je zabezpiecz, zanim zrobisz cokolwiek innego.

Szybkie sprawdzenie

Wybierz poprawne zabezpieczenie.

Podsumowanie

Wiesz już, że po obliczeniu indeksu należy dodać if (i < n). Ta jedna linia zatrzymuje odczyty i zapisy poza zakresem, przed którymi GPU nigdy Cię nie ostrzeże. 🛡️

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 „Ochrona przed wyjściem poza zakres” jest bezpłatna?

Tak — pełny tekst „Ochrona przed wyjściem poza zakres” 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 „Ochrona przed wyjściem poza zakres”?

Sprawdzenie zakresu if (i < n). Ć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 „Ochrona przed wyjściem poza zakres”?

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. Klasyczny wzór indeksu
  2. Ochrona przed wyjściem poza zakres
  3. Zaokrąglanie liczby bloków w górę
  4. Pętle z krokiem siatki
← Powrót do CUDA Academy