CUDA Academy · Lekcja

Strumieniowe przetwarzanie kafelków dużych obrazów

Nakładanie operacji wejścia-wyjścia na obliczenia

Lekcja 3 z 413 kroki

Strumieniowe przetwarzanie kafelków dużych obrazów 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.

Gdy obraz jest zbyt duży

Ogromny obraz może nie zmieścić się w pamięci GPU, a kopiowanie go w całości może zablokować potok. Rozwiązaniem jest podzielenie go na kafelki i przetwarzanie ich po kolei. 🖼️

Podział na fragmenty

Należy podzielić obraz na pasy wierszy lub prostokątne kafelki. Każdy kafelek jest na tyle mały, by można go było przesłać, przetworzyć i pobrać bez nadmiernego obciążania pamięci urządzenia.

Trzy kroki dla każdego kafelka

Każdy kafelek przechodzi przez ten sam rytm: skopiować go na urządzenie, uruchomić kernel, a następnie skopiować wynik z powrotem. Należy powtarzać te czynności aż do przetworzenia całego obrazu.

Kafelki przetwarzane szeregowo marnują czas

Przy przetwarzaniu po jednym kafelku GPU pozostaje bezczynne podczas każdego kopiowania. Aby uzyskać lepszą wydajność, trzeba nakładać przesyłanie jednego kafelka na obliczenia dla innego.

Strumienie umożliwiają nakładanie operacji

Należy umieścić pracę dla każdego kafelka w osobnym strumieniu. Sterownik będzie wtedy mógł uruchamiać kernel jednego kafelka, gdy kopiowanie innego będzie nadal trwało.

cudaStream_t s;
cudaStreamCreate(&s);

Kopie asynchroniczne są wymagane

Zwykłe cudaMemcpy blokuje hosta i uniemożliwia nakładanie operacji. Należy użyć cudaMemcpyAsync w strumieniu, aby kopiowanie zostało dodane do kolejki bez zatrzymywania całego programu.

cudaMemcpyAsync(d_tile, h_tile, bytes, cudaMemcpyHostToDevice, s);

Przypnij bufory hosta

Transfery asynchroniczne wymagają przypiętej pamięci hosta, aby używać DMA. Bufory tymczasowe dla kafelków należy przydzielić za pomocą cudaMallocHost, w przeciwnym razie nakładanie operacji po cichu zostanie zastąpione trybem blokującym.

cudaMallocHost(&h_tile, bytes);

Zastosuj podwójne buforowanie potoku

Należy używać dwóch buforów kafelków i naprzemiennie korzystać ze strumieni. Gdy kafelek N jest przetwarzany, kafelek N+1 jest przesyłany, dzięki czemu transfery ukrywają się za pracą w płynnym potoku.

Piksele halo na krawędziach kafelków

Rozmycie przy krawędzi kafelka wymaga pikseli z sąsiedniego kafelka. Należy uwzględnić nakładający się margines halo, aby wyniki przy krawędziach pozostały prawidłowe.

Synchronizacja przed zapisaniem

Praca asynchroniczna nie kończy się w chwili powrotu z wywołania. Przed odczytaniem wyniku kafelka z powrotem na hoście należy wywołać cudaStreamSynchronize dla każdego strumienia.

cudaStreamSynchronize(s);

Duże obrazy, stabilna praca GPU

Dzięki kafelkom obsługiwanym strumieniowo i podwójnie buforowanym GPU pozostaje zajęte niezależnie od rozmiaru obrazu. Transfery znikają za obliczeniami, a przepustowość pozostaje wysoka. ⚡

Szybki test

Przesyła Pan/Pani kafelki w osobnych strumieniach, ale nie obserwuje nakładania operacji. Jaki błąd jest najbardziej prawdopodobny?

Podsumowanie

Podzielił(a) Pan/Pani duże obrazy na kafelki, użył(a) strumieni z kopiami asynchronicznymi i przypiętą pamięcią, aby nakładać operacje, zastosował(a) podwójne buforowanie potoku oraz dodał(a) halo dla prawidłowych wyników przy krawędziach. 🎯

Bezpłatny start

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 „Strumieniowe przetwarzanie kafelków dużych obrazów” jest bezpłatna?

Tak — pełny tekst „Strumieniowe przetwarzanie kafelków dużych obrazów” 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 „Strumieniowe przetwarzanie kafelków dużych obrazów”?

Nakładanie operacji wejścia-wyjścia 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 „Strumieniowe przetwarzanie kafelków dużych obrazów”?

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. Projektowanie potoku przetwarzania
  2. Łączenie filtrów w jeden kernel
  3. Strumieniowe przetwarzanie kafelków dużych obrazów
  4. Profiluj, optymalizuj, wdrażaj
← Powrót do CUDA Academy