0Pricing
CUDA Academy · Lekcja

Oddzielne przestrzenie adresowe

Zrozumieć, dlaczego wskaźnik hosta jest nieprawidłowy na urządzeniu.

Oddzielne przestrzenie adresowe to bezpłatna lekcja CUDA Academy na CoddyKit. To lekcja 3 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.

Dwie oddzielne pamięci

CPU i GPU mają własne pamięci RAM. Nie współdzielą jednej przestrzeni adresowej, a ten fakt wpływa na całą platformę CUDA. 🧠

Znaczenie adresu

Wskaźnik to po prostu liczba wskazująca miejsce w pamięci. To miejsce ma sens wyłącznie w przestrzeni adresowej, w której zostało utworzone.

Wskaźniki hosta są lokalne

Wskaźnik zwrócony przez malloc wskazuje pamięć hosta. GPU nie ma takiego miejsca, więc przekazanie go do kernela prowadzi donikąd.

int* h = (int*)malloc(n * sizeof(int));

Wskaźniki urządzenia też są lokalne

Wskaźnik zwrócony przez cudaMalloc wskazuje pamięć urządzenia. CPU nie może odczytać jej bezpośrednio; dereferencja na hoście powoduje awarię.

int* d;
cudaMalloc(&d, n * sizeof(int));

Klasyczny błąd

Przekazanie wskaźnika hosta do kernela kompiluje się poprawnie, ale kończy błędem w czasie działania. Liczba jest prawidłowa, lecz wskazywana przez nią pamięć nie znajduje się na GPU.

Dlaczego mimo to się kompiluje

Oba wskaźniki wyglądają dla C++ jak ten sam typ, więc kompilator milczy. Niezgodność ujawnia się dopiero, gdy GPU użyje tego adresu.

Łączenie przez cudaMemcpy

Aby przenosić dane między przestrzeniami, trzeba jawnie skopiować je za pomocą cudaMemcpy. Nie ma automatycznego współdzielenia danych między tymi obszarami.

cudaMemcpy(d, h, bytes, cudaMemcpyHostToDevice);

Konwencja nazewnicza pomaga

Wielu programistów poprzedza wskaźniki hosta przedrostkiem h_, a wskaźniki urządzenia — d_. To nawyk, który zapobiega bolesnym pomyłkom.

float *h_a, *d_a;

Kernele widzą przestrzeń urządzenia

Wewnątrz kernela każdy dereferencjonowany wskaźnik musi wskazywać pamięć urządzenia. To jedyna przestrzeń dostępna dla wątków GPU.

Wskazówka dotycząca unified memory

Później pozna Pan/Pani unified memory — jeden wskaźnik prawidłowy po obu stronach. Na razie należy bezwzględnie rozdzielać wskaźniki hosta i urządzenia.

Model mentalny

Wyobraź sobie dwa pokoje bez wspólnych półek. Aby użyć danych z drugiego pokoju, trzeba przenieść kopię, a nie tylko wskazać miejsce po drugiej stronie.

Szybkie sprawdzenie

Upewnijmy się, że rozumie Pan/Pani oddzielne przestrzenie adresowe.

Podsumowanie

Dowiedział(a) się Pan/Pani, że host i urządzenie działają w oddzielnych przestrzeniach adresowych, wskaźniki nie są wzajemnie wymienne, a cudaMemcpy służy do przenoszenia danych między nimi. ✅

Często zadawane pytania

Czy lekcja „Oddzielne przestrzenie adresowe” jest bezpłatna?

Tak — pełny tekst „Oddzielne przestrzenie adresowe” 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 „Oddzielne przestrzenie adresowe”?

Zrozumieć, dlaczego wskaźnik hosta jest nieprawidłowy na urządzeniu. Ć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 3 z 4.

Ile czasu zajmuje lekcja „Oddzielne przestrzenie adresowe”?

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. Kwalifikator funkcji __global__
  2. Funkcje __device__ i __host__
  3. Oddzielne przestrzenie adresowe
  4. Cykl życia programu CUDA
← Powrót do CUDA Academy