Łączenie filtrów w jeden kernel
Ograniczanie liczby uruchomień i ruchu w pamięci globalnej
Łą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. ✅
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
- Projektowanie potoku przetwarzania
- Łączenie filtrów w jeden kernel
- Strumieniowe przetwarzanie kafelków dużych obrazów
- Profiluj, optymalizuj, wdrażaj