CUDA Academy · Lekcja

Wykrywanie wycieków za pomocą memcheck

Wyjście poza zakres i nieprawidłowe wskaźniki urządzenia

Lekcja 2 z 413 kroki

Wykrywanie wycieków za pomocą memcheck 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.

Dlaczego istnieje memcheck

Błędy pamięci GPU rzadko powodują wyraźne awarie, dlatego compute-sanitizer z narzędziem memcheck obserwuje każdy dostęp i zgłasza problemy za Ciebie. 🛡️

Nowoczesne polecenie

Uruchom program za pomocą narzędzia memcheck, poprzedzając jego polecenie poleceniem compute-sanitizer — to nowoczesny zamiennik dawnego cuda-memcheck.

compute-sanitizer --tool memcheck ./vecadd

Odczyty poza zakresem

Klasycznym błędem wykrywanym przez memcheck jest dostęp poza zakresem, gdy wątek odczytuje dane z tablicy urządzenia lub zapisuje je za jej końcem.

Brak sprawdzania zakresu

Zapomnienie o zabezpieczeniu pozwala dodatkowym wątkom działać bez ograniczeń, więc ten indeks może wyjść poza n i spowodować nieprawidłowy zapis globalny.

int i = blockIdx.x * blockDim.x + threadIdx.x;
out[i] = a[i] + b[i];

Odczytywanie raportu

memcheck wyświetla rodzaj błędu, nieprawidłowy adres oraz wątek, który go spowodował, wskazując bezpośrednio błędny dostęp.

Uzyskaj numery wierszy

Skompiluj program z opcją -lineinfo, aby memcheck mógł powiązać każdy błąd z dokładnym wierszem kodu źródłowego zamiast z samym adresem.

nvcc -lineinfo vecadd.cu -o vecadd

Wykrywanie wycieków

Włącz opcję --leak-check, a memcheck zgłosi każdą pamięć urządzenia, którą zaalokowano, ale której nie zwolniono przed zakończeniem programu.

compute-sanitizer --leak-check full ./vecadd

Klasyczny wyciek

Alokacja bez odpowiadającego jej wywołania free powoduje wyciek bufora, a po wielu iteracjach stopniowo wyczerpuje pamięć urządzenia.

cudaMalloc(&d_a, bytes);
// ...used, but cudaFree(d_a) is missing

Nieprawidłowe wskaźniki urządzenia

memcheck wykrywa także przekazanie wskaźnika hosta tam, gdzie jądro oczekuje wskaźnika urządzenia — błąd ten może po cichu zniekształcać wyniki.

Nieprawidłowe wyrównanie dostępu

Niektóre operacje odczytu wymagają wyrównanych adresów, dlatego memcheck ostrzega o dostępie niewyrównanym, który w przeciwnym razie mógłby zwrócić bezwartościowe dane lub spowodować błąd.

Napraw i uruchom ponownie

Po każdej poprawce ponownie uruchamiaj memcheck, aż zgłosi zero błędów. Czyste uruchomienie oznacza, że błędy pamięci zostały usunięte.

Szybkie sprawdzenie

Jaki rodzaj błędów ma przede wszystkim wykrywać narzędzie memcheck?

Podsumowanie

Uruchomiłeś memcheck, dodałeś -lineinfo, aby uzyskać wiersze kodu źródłowego, włączyłeś sprawdzanie wycieków i poznałeś typowe rodzaje błędów. Czyste uruchomienia oznaczają bezpieczne użycie pamięci. ✅

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 „Wykrywanie wycieków za pomocą memcheck” jest bezpłatna?

Tak — pełny tekst „Wykrywanie wycieków za pomocą memcheck” 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 „Wykrywanie wycieków za pomocą memcheck”?

Wyjście poza zakres i nieprawidłowe wskaźniki urządzenia Ć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 „Wykrywanie wycieków za pomocą memcheck”?

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. Krokowe wykonywanie kernelów w cuda-gdb
  2. Wykrywanie wycieków za pomocą memcheck
  3. Wykrywanie race conditions za pomocą racecheck
  4. Wykrywanie błędów synchronizacji za pomocą synccheck
← Powrót do CUDA Academy