CUDA Academy · Lekcja

Łączenie filtrów w jeden kernel

Ograniczanie liczby uruchomień i ruchu w pamięci globalnej

Lekcja 2 z 413 kroki

Łączenie filtrów w jeden kernel to bezpłatna lekcja CUDA Academy na CoddyKit. To lekcja 2 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.

Po co w ogóle scalać

Uruchomienie pięciu kerneli oznacza pięć uruchomień i pięć podróży tam i z powrotem do pamięci globalnej. Scalanie filtrów w jeden kernel ogranicza oba te koszty, często zapewniając znaczne przyspieszenie. 🚀

Koszt uruchomień się sumuje

Każde uruchomienie kernela kosztuje kilka mikrosekund. W przypadku małego obrazu ten stały narzut uruchomienia może być większy niż rzeczywista praca, dlatego mniejsza liczba uruchomień oznacza więcej czasu na użyteczne obliczenia.

Ruch w pamięci globalnej jest problemem

Oddzielne etapy zapisują piksel w pamięci globalnej, a następnie od razu go odczytują. Scalanie pozwala przechować tę wartość w rejestrze, całkowicie eliminując niepotrzebną podróż tam i z powrotem.

Jeden odczyt na wątek

W scalonym kernelu każdy wątek odczytuje swój piksel tylko raz. Ten jeden odczyt zasila następnie po kolei wszystkie filtry, bez ponownego dostępu do pamięci globalnej.

float v = input[idx];

Łączenie operacji w rejestrach

Każdy filtr należy zastosować do wartości, którą ma Pan/Pani już w ręku. Piksel przechodzi przez jasność, gammę i kontrast jako zwykłe działania matematyczne, przechowywane w szybkich rejestrach.

v = v * brightness;
v = powf(v, gamma);
v = (v - 0.5f) * contrast + 0.5f;

Jeden zapis na końcu

Po wykonaniu całego łańcucha należy zapisać końcowy wynik. Jeden zapis zastępuje wiele zapisów wykonywanych przez oddzielne kernele.

output[idx] = v;

Filtry punktowe łatwo scalać

Filtry, które dotyczą tylko jednego piksela, są punktowe i można je scalać bez większych trudności. Zmiany jasności, gammy i kolorów najłatwiej połączyć.

Filtry sąsiedztwa są trudniejsze

Rozmycie odczytuje pobliskie piksele, dlatego jego scalenie wymaga kafelków w pamięci współdzielonej, a nie tylko rejestrów. Etapy punktowe można scalać swobodnie, ale do stencilów należy podchodzić ostrożniej.

Uwaga na presję rejestrów

Duży scalony kernel wykorzystuje więcej rejestrów na wątek. Ich nadmiar obniża obłożenie albo powoduje przenoszenie wartości do pamięci, dlatego warto scalać agresywnie, ale trzeba kontrolować związany z tym koszt.

Weryfikacja po scaleniu

Scalanie zmienia kolejność wykonywania pracy, dlatego zawsze należy porównać wynik scalonej wersji z wersją etapową. Szybki diff potwierdzi, że obliczenia nadal dają ten sam wynik, zanim zacznie się Pan/Pani cieszyć z przyspieszenia.

Jeden kernel, wiele filtrów

Korzyść jest rzeczywista: jedno uruchomienie odczytuje, przekształca i zapisuje każdy piksel dokładnie raz. To istota dobrze dostrojonego, scalonego kernela obrazu.

Szybki test

Połączył(a) Pan/Pani trzy filtry punktowe w jeden kernel. Na czym polega główna korzyść wydajnościowa?

Podsumowanie

Nauczył(a) się Pan/Pani scalać filtry: wykonać jeden odczyt, połączyć punktowe działania matematyczne w rejestrach i wykonać jeden zapis. Ogranicza to liczbę uruchomień oraz ruch w pamięci globalnej, ale należy uważać na presję rejestrów i weryfikować wynik. ✅

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 „Łączenie filtrów w jeden kernel” jest bezpłatna?

Tak — pełny tekst „Łączenie filtrów w jeden kernel” 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 „Łączenie filtrów w jeden kernel”?

Ograniczanie liczby uruchomień i ruchu w pamięci globalnej Ć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 2 z 4.

Ile czasu zajmuje lekcja „Łączenie filtrów w jeden kernel”?

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