cudaMemcpyAsync w strumieniu
Wykonywać nieblokujące transfery nakładające się na obliczenia.
cudaMemcpyAsync w strumieniu 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.
Domyślnie blokujące
Zwykłe cudaMemcpy zatrzymuje CPU do chwili zakończenia kopiowania. Wątek hosta po prostu czeka i nie wykonuje nic użytecznego, gdy bajty są przesyłane.
Asynchroniczny odpowiednik
Poznaj cudaMemcpyAsync. Funkcja umieszcza kopiowanie w kolejce i natychmiast zwraca sterowanie CPU, dzięki czemu host może pracować dalej podczas transferu.
Potrzebuje strumienia
Kopiowanie asynchroniczne wymaga dodatkowego argumentu: strumienia. Strumień to uporządkowana kolejka, w której transfer czeka na swoją kolej do wykonania.
cudaMemcpyAsync(d_data, h_data, bytes, cudaMemcpyHostToDevice, stream);Pamięć przypięta albo nic z tego
Jest jednak pewien haczyk: kopiowanie asynchroniczne działa naprawdę nieblokująco tylko z przypiętej pamięci hosta. Przekazanie bufora stronicowanego sprawia, że CUDA po cichu wraca do kopiowania blokującego.
Zwraca sterowanie, ale nie kończy pracy
Gdy wywołanie zwraca sterowanie, kopiowanie zostało dopiero zaplanowane, a nie zakończone. Dane mogą być nadal przesyłane, więc nie należy ich jeszcze odczytywać.
Kolejność w strumieniu
Praca w jednym strumieniu jest wykonywana w określonej kolejności, element po elemencie. Dlatego kopiowanie zlecone przed kernelem w tym samym strumieniu na pewno zakończy się wcześniej.
Czekaj, gdy to konieczne
Przed użyciem wyników na CPU upewnij się, że kolejka została opróżniona. Wywołaj cudaStreamSynchronize, aby zablokować wykonanie do czasu zakończenia pracy tego strumienia.
cudaStreamSynchronize(stream);Cały sens: nakładanie operacji
Kopiowanie asynchroniczne pozwala, aby transfer w jednym strumieniu odbywał się równocześnie z obliczeniami wykonywanymi przez kernel w innym strumieniu. Dzięki tej współbieżności można ukryć czas transferu.
Uważaj na domyślny strumień
Jeśli przekażesz strumień 0, czyli starszy strumień domyślny, może on szeregować wykonanie względem wszystkiego innego. Aby rzeczywiście uzyskać nakładanie operacji, używaj samodzielnie utworzonych strumieni.
Nie usuwaj zbyt wcześnie bufora
Ponieważ kopiowanie kończy się później, hostowy bufor musi pozostać ważny aż do tego momentu. Zbyt wczesne zwolnienie pamięci sprawi, że trwający transfer odczyta przypadkowe dane.
Typowy schemat
Klasyczny przepływ obejmuje asynchroniczne kopiowanie do urządzenia, uruchomienie kernela, a następnie asynchroniczne kopiowanie z urządzenia — wszystko w jednym strumieniu. Synchronizuj dopiero na samym końcu.
cudaMemcpyAsync(d_in, h_in, bytes, cudaMemcpyHostToDevice, stream);
kernel<<<grid, block, 0, stream>>>(d_in, d_out);Szybki test
Czego wymaga cudaMemcpyAsync, aby działać rzeczywiście nieblokująco?
Podsumowanie
cudaMemcpyAsync umieszcza kopiowanie w strumieniu i natychmiast zwraca sterowanie, ale do nakładania operacji wymaga przypiętej pamięci. Zsynchronizuj strumień przed odczytem wyników. ⚡
Często zadawane pytania
Czy lekcja „cudaMemcpyAsync w strumieniu” jest bezpłatna?
Tak — pełny tekst „cudaMemcpyAsync w strumieniu” 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 „cudaMemcpyAsync w strumieniu”?
Wykonywać nieblokujące transfery nakładające się na obliczenia. Ć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 „cudaMemcpyAsync w strumieniu”?
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
- Dlaczego pamięć stronicowana jest wolna
- Pamięć przypięta za pomocą cudaMallocHost
- cudaMemcpyAsync w strumieniu
- Potok z podwójnym buforowaniem