Wykrywanie wycieków za pomocą memcheck
Wyjście poza zakres i nieprawidłowe wskaźniki urządzenia
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 ./vecaddOdczyty 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 vecaddWykrywanie 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 ./vecaddKlasyczny 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 missingNieprawidł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. ✅
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
- Krokowe wykonywanie kernelów w cuda-gdb
- Wykrywanie wycieków za pomocą memcheck
- Wykrywanie race conditions za pomocą racecheck
- Wykrywanie błędów synchronizacji za pomocą synccheck