Transfery z hosta do urządzenia
Przesyłać dane wejściowe do GPU.
Transfery z hosta do urządzenia 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.
Dwie pamięci, jeden cel
Twoje dane zaczynają się w pamięci RAM hosta, ale GPU może wykonywać obliczenia tylko na danych znajdujących się w jego własnej pamięci urządzenia. Najpierw musisz je przesłać. 🚚
Poznaj cudaMemcpy
Funkcja cudaMemcpy działa jak samochód dostawczy: kopiuje blok bajtów z jednego adresu na drugi, niezależnie od tego, czy adres znajduje się na hoście, czy na urządzeniu.
cudaMemcpy(dst, src, bytes, kind);Kierunek przesyłania do urządzenia
Aby wysłać dane wejściowe do GPU, należy użyć cudaMemcpyHostToDevice. Źródłem jest pamięć RAM hosta, a miejscem docelowym — pamięć urządzenia.
cudaMemcpy(d_a, h_a, n*sizeof(float), cudaMemcpyHostToDevice);Kolejność argumentów ma znaczenie
Podobnie jak w przypadku memcpy, najpierw podaje się miejsce docelowe, a następnie źródło. Jeśli przypadkowo zamienią je Państwo miejscami, bufor GPU pozostanie pusty. 😬
cudaMemcpy(d_dst, h_src, bytes, cudaMemcpyHostToDevice);Liczenie bajtów, nie elementów
Argument rozmiaru jest podawany w bajtach, dlatego należy pomnożyć liczbę elementów przez rozmiar typu za pomocą sizeof.
size_t bytes = n * sizeof(float);Alokuj przed kopiowaniem
Wskaźnik urządzenia musi już wskazywać rzeczywistą pamięć GPU. Przed przesłaniem danych zawsze należy wywołać cudaMalloc dla miejsca docelowego.
cudaMalloc(&d_a, bytes);
cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);Synchroniczne oczekiwanie
Zwykłe cudaMemcpy jest blokujące: wątek CPU czeka, aż każdy bajt bezpiecznie trafi do GPU.
Następnie uruchom kernel
Najpierw przesyłanie, potem obliczenia. Gdy dane wejściowe znajdą się na urządzeniu, Państwa kernel może je odczytać i rozpocząć właściwą pracę.
cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);
myKernel<<<blocks, threads>>>(d_a, n);Rozmiary muszą się zgadzać
Należy upewnić się, że liczba przesyłanych bajtów mieści się w zaalokowanym buforze. Kopiowanie większej ilości danych niż zarezerwowano to klasyczny błąd przepełnienia.
Sprawdź kod zwracany
cudaMemcpy zwraca wartość typu cudaError_t. Należy ją sprawdzać, aby błędny wskaźnik lub rozmiar spowodował wyraźny błąd, zamiast doprowadzić do uszkodzenia działania programu.
cudaError_t err = cudaMemcpy(d_a, h_a, bytes, cudaMemcpyHostToDevice);Kopiowanie nie jest darmowe
Każde przesłanie danych odbywa się przez powolną magistralę PCIe, dlatego należy kopiować tylko te dane, które są rzeczywiście potrzebne na urządzeniu.
Szybkie sprawdzenie
Chcą Państwo wysłać tablicę wejściową z pamięci RAM CPU do GPU. Które wywołanie jest poprawne?
Podsumowanie
Nauczyli się Państwo przesyłać dane za pomocą cudaMemcpyHostToDevice: zaalokować bufor urządzenia, podać najpierw miejsce docelowe, określić rozmiar w bajtach i wykonać kopiowanie przed uruchomieniem kernela. 🎉
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 „Transfery z hosta do urządzenia” jest bezpłatna?
Tak — pełny tekst „Transfery z hosta do urządzenia” 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 „Transfery z hosta do urządzenia”?
Przesyłać dane wejściowe do GPU. Ć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 „Transfery z hosta do urządzenia”?
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
- Transfery z hosta do urządzenia
- Transfery z urządzenia do hosta
- Wyliczenie kierunku kopiowania
- Wąskie gardło transferu PCIe