CUDA Academy · Lekcja

Projektowanie potoku przetwarzania

Etapy, bufory i przepływ danych

Lekcja 1 z 413 kroki

Projektowanie potoku przetwarzania 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.

Myśl etapami

Rzeczywisty potok przetwarzania obrazu składa się z etapów: wczytania, rozmycia, wyostrzenia, korekcji kolorów i zapisu. Każdy etap jest jedną przejrzystą transformacją, którą można analizować niezależnie. 🧩

Dane płyną w jednym kierunku

Piksele przemieszczają się przez potok do przodu: każdy etap odczytuje wynik poprzedniego i tworzy dane wejściowe dla następnego. Taki jednokierunkowy przepływ danych ułatwia zrozumienie projektu.

Bufory przechowują dane pośrednie

Między dwoma etapami potrzebne jest miejsce na przechowanie pikseli. Bufor to po prostu tablica urządzenia, do której zapisuje jedno jądro, a z której odczytuje następne. Zaplanuj jeden bufor dla każdej granicy.

float* d_stage1;
cudaMalloc(&d_stage1, width * height * sizeof(float));

Dwa bufory w układzie ping-pong

Rzadko potrzebujesz nowego bufora dla każdego etapu. Stosuj ping-pong między dwoma buforami: odczytuj z jednego, zapisuj do drugiego, a następnie zamień je rolami. Dwa bufory wystarczą dla całego łańcucha.

std::swap(d_in, d_out);

Na razie jedno jądro na etap

Zacznij od jednego jądra na każdy etap. To najbardziej przejrzysty projekt i najłatwiejszy do zweryfikowania. Później połączysz etapy, gdy każdy z nich będzie już poprawny.

Przypisz piksele do wątków

Naturalne przypisanie to jeden wątek na piksel. Dwuwymiarowa siatka obejmuje szerokość i wysokość, więc każdy wątek obsługuje dokładnie jedną pozycję (x, y).

int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;

Indeksuj z użyciem rozmiaru wiersza

Obrazy są przechowywane wierszami. Zamień (x, y) na płaski offset za pomocą indeksowania row-major, aby każdy wątek odczytywał właściwy piksel.

int idx = y * width + x;

Zabezpiecz krawędzie obrazu

Siatka jest zaokrąglana w górę, więc niektóre wątki znajdą się poza obrazem. Proste sprawdzanie zakresu uniemożliwi im dostęp do pamięci, której nie powinny dotykać.

if (x >= width || y >= height) return;

Wybierz kształt bloku 2D

Blok taki jak 16x16 lub 32x8 zapewnia dobre pokrycie i wiersze przyjazne dla warpów. Gdy to możliwe, wybierz kształt bloku 2D, który dokładnie dzieli obraz.

dim3 block(16, 16);
dim3 grid((width+15)/16, (height+15)/16);

Alokuj raz, często używaj ponownie

Alokowanie pamięci urządzenia jest kosztowne, dlatego wykonaj je raz przed pętlą. Używaj ponownie tych samych buforów dla każdej klatki zamiast za każdym razem wywoływać malloc i free.

Naszkicuj projekt przed kodowaniem

Najpierw narysuj etapy, ich bufory oraz łączące je strzałki. Przejrzysty diagram przepływu danych pozwala wykryć błędy projektowe na długo przed uruchomieniem któregokolwiek jądra. ✏️

Szybkie sprawdzenie

Masz łańcuch etapów. Jak uniknąć alokowania nowego bufora dla każdego etapu?

Podsumowanie

Zaprojektował(a) Pan/Pani potok jako jednokierunkowe etapy połączone buforami, przypisał(a) Pan/Pani po jednym wątku do każdego piksela za pomocą siatki 2D oraz nauczył(a) się przełączać bufory naprzemiennie i najpierw szkicować przepływ. 🎯

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 „Projektowanie potoku przetwarzania” jest bezpłatna?

Tak — pełny tekst „Projektowanie potoku przetwarzania” 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 „Projektowanie potoku przetwarzania”?

Etapy, bufory i przepływ danych Ć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 „Projektowanie potoku przetwarzania”?

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