0Pricing
CUDA Academy · Lekcja

Dlaczego pamięć stronicowana jest wolna

Poznać bufory pośrednie używane za zwykłym malloc.

Dlaczego pamięć stronicowana jest wolna to bezpłatna lekcja CUDA Academy na CoddyKit. To lekcja 1 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.

Gdzie znajdują się dane

Standardowe bufory C++ utworzone przez malloc znajdują się w stronicowanej pamięci hosta. Wydaje się to darmowe, ale GPU nie może kopiować z niej bezpośrednio, a ten drobny szczegół obniża wydajność.

Co oznacza stronicowanie

Pamięć jest stronicowana, gdy system operacyjny może w dowolnym momencie przenosić jej strony lub zapisywać je na dysku. To zapewnia elastyczność, ale utrudnia pracę sprzętowi, który potrzebuje stałych adresów.

GPU używa DMA

GPU pobiera dane za pomocą DMA — bezpośredniego transferu sprzętowego, który wymaga adresu fizycznego, który się nie zmieni. Strony stronicowane nie spełniają tego warunku, więc nie można ich używać bezpośrednio.

Ukryty etap buforowania

Aby obejść ten problem, sterownik najpierw kopiuje stronicowany bufor do ukrytego bufora pośredniego, a dopiero potem przesyła go do GPU. Płacisz za dodatkowe kopiowanie, którego nie zleciłeś. 😮

Dwie kopie zamiast jednej

Pojedyncze cudaMemcpy ze stronicowanej pamięci w rzeczywistości oznacza dwie kopie: z hosta do bufora pośredniego, a następnie z bufora pośredniego do urządzenia. Ta podwójna praca dokładnie wyjaśnia, dlaczego transfery ze stronicowanej pamięci są powolne.

Zwykły malloc

Oto bufor, po który każdy sięga w pierwszej kolejności. Działa, ale każdy transfer z h_data po cichu przechodzi przez tę okrężną drogę z buforem pośrednim.

float* h_data = (float*)malloc(N * sizeof(float));
cudaMemcpy(d_data, h_data, bytes, cudaMemcpyHostToDevice);

Dlaczego system operacyjny ma to na uwadze

System operacyjny utrzymuje pamięć jako stronicowaną, aby móc nadmiernie przydzielać pamięć RAM i obsługiwać wiele programów jednocześnie. Ta wygoda uniemożliwia GPU bezpośredni odczyt stron.

Utracona przepustowość

Transfery ze stronicowanej pamięci często osiągają zaledwie połowę szczytowej przepustowości łącza. Kopiowanie pośrednie zużywa cykle CPU i przepustowość pamięci, które mogłyby zostać wykorzystane przez właściwe transfery.

Blokuje również nakładanie pracy

Ponieważ kopiowanie pośrednie jest synchroniczne, transfery ze stronicowanej pamięci nie mogą naprawdę nakładać się na kernele. Tracisz asynchroniczne możliwości, dzięki którym strumienie mają sens.

Kiedy nadal to boli

Przy jednym małym kopiowaniu nikt tego nie zauważy. Jednak w pętli, która przesyła dane przy każdej iteracji, koszt kopiowania pośredniego narasta i po cichu dominuje nad czasem wykonania.

Nadchodzi rozwiązanie

Rozwiązaniem jest poproszenie CUDA o bufor, którego nie można przenieść do pamięci stronicowanej — tak zwaną pamięć przypiętą. GPU odczytuje ją bezpośrednio, bez bufora pośredniego i bez podwójnego kopiowania.

Szybki test

Dlaczego transfer ze zwykłej pamięci stronicowanej jest wolniejszy, niż powinien?

Podsumowanie

Bufory stronicowane można przenosić, więc GPU nie może bezpośrednio używać ich przez DMA. Sterownik najpierw kopiuje je do bufora pośredniego, podwajając kopiowanie. Rozwiązaniem jest pamięć przypięta. 🚀

Często zadawane pytania

Czy lekcja „Dlaczego pamięć stronicowana jest wolna” jest bezpłatna?

Tak — pełny tekst „Dlaczego pamięć stronicowana jest wolna” 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 „Dlaczego pamięć stronicowana jest wolna”?

Poznać bufory pośrednie używane za zwykłym malloc. Ć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 1 z 4.

Ile czasu zajmuje lekcja „Dlaczego pamięć stronicowana jest wolna”?

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. Dlaczego pamięć stronicowana jest wolna
  2. Pamięć przypięta za pomocą cudaMallocHost
  3. cudaMemcpyAsync w strumieniu
  4. Potok z podwójnym buforowaniem
← Powrót do CUDA Academy