CUDA Academy · Lekcja

Presja na rejestry i spillowanie

Równoważenie ponownego użycia i zajętości

Lekcja 4 z 413 kroki

Presja na rejestry i spillowanie to bezpłatna lekcja CUDA Academy na CoddyKit. To lekcja 4 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.

Rejestry są cenne

Rejestry to najszybsze miejsce przechowywania dostępne dla wątku, ale każdy SM ma ich ograniczoną liczbę. To, jak intensywnie kernel z nich korzysta, nazywa się register pressure.

Wspólna, stała pula

Każdy aktywny wątek korzysta z jednego register file przypisanego do SM. Im więcej rejestrów potrzebuje każdy wątek, tym mniej wątków może jednocześnie pozostać aktywnych.

Presja zmniejsza zajętość

Duże wykorzystanie rejestrów bezpośrednio ogranicza liczbę warpów mieszczących się na SM. Ten spadek occupancy może pozostawić sprzętowi zbyt mało pracy do ukrywania opóźnień.

Czym jest przepełnienie rejestrów

Gdy wątek potrzebuje więcej rejestrów, niż jest dostępnych, kompilator przenosi dodatkowe wartości poza nie. To przepełnienie jest określane jako register spill do wolniejszej pamięci.

Przepełnienia trafiają do pamięci lokalnej

Wartości wypchnięte z rejestrów trafiają do local memory, która znajduje się w pamięci DRAM poza układem. Każde takie przepełnienie zastępuje szybki dostęp do rejestru powolną podróżą tam i z powrotem.

Sprawdź liczbę rejestrów

Należy poprosić kompilator o zaraportowanie wykorzystania. Dodanie --ptxas-options=-v do nvcc wypisuje liczbę rejestrów na wątek oraz liczbę bajtów przepełnień dla każdego kernela.

nvcc --ptxas-options=-v kernel.cu

Odczytaj wartości przepełnień

Raport zawiera liczbę zapisów i odczytów przepełnień. Każda niezerowa wartość spill jest sygnałem ostrzegawczym, że kernel płaci za powolny ruch danych w pamięci lokalnej.

Ogranicz liczbę rejestrów na wątek

Limit można ustawić podczas kompilacji. Flaga --maxrregcount ogranicza liczbę rejestrów na wątek, poświęcając nieco szybkości na rzecz większej zajętości.

nvcc --maxrregcount=32 kernel.cu

Wskaż zamiar za pomocą __launch_bounds__

Wskazówka przypisana do konkretnego kernela jest często lepszym rozwiązaniem. __launch_bounds__ informuje kompilator o rozmiarze bloku, aby mógł zaplanować wykorzystanie rejestrów pod kątem oczekiwanej zajętości.

__global__ void __launch_bounds__(256)
myKernel() { /* ... */ }

Zmniejsz zbiór aktywnych wartości

Często wystarczy przechowywać jednocześnie mniej wartości. Ponowne obliczenie taniego wyniku lub zawężenie scope zmniejsza liczbę aktywnych rejestrów.

Znajdź równowagę między ponownym użyciem a zajętością

ILP i rozwijanie pętli zwiększają presję, a limity zwiększają zajętość. Sztuka polega na znalezieniu balance, przy którym program działa najszybciej — i tylko profiler może wskazać, gdzie ona występuje.

Szybkie sprawdzenie

Dokąd trafiają wartości, gdy kernelowi zabraknie rejestrów?

Podsumowanie: kontroluj presję

Dowiedział się Pan/Pani, że duża register pressure zmniejsza zajętość i może powodować przepełnienia do wolnej pamięci DRAM. Należy mierzyć wykorzystanie, ograniczać liczbę rejestrów i korzystać ze wskazówek profilera. 🎯

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 „Presja na rejestry i spillowanie” jest bezpłatna?

Tak — pełny tekst „Presja na rejestry i spillowanie” 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 „Presja na rejestry i spillowanie”?

Równoważenie ponownego użycia i zajętości Ć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 4 z 4.

Ile czasu zajmuje lekcja „Presja na rejestry i spillowanie”?

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. Równoległość na poziomie instrukcji
  2. Rozwijanie pętli za pomocą #pragma unroll
  3. Zwektoryzowane wczytywanie za pomocą float4
  4. Presja na rejestry i spillowanie
← Powrót do CUDA Academy