Iterowanie po fazach kafelków
Gromadzić sumy częściowe z kolejnych kafelków.
Iterowanie po fazach kafelkó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.
Iloczyn skalarny zostaje podzielony
Pełny wiersz pomnożony przez pełną kolumnę jest zbyt duży dla jednego kafelka. Dlatego długą sumę dzieli się na fragmenty o szerokości TILE, po jednym fragmencie na każdą fazę.
Zliczanie faz
Jeśli macierze mają szerokość N, a kafelki szerokość TILE, potrzeba N / TILE faz, aby objąć cały wymiar wewnętrzny.
int numPhases = (N + TILE - 1) / TILE;Zewnętrzna pętla faz
Umieść kroki wczytywania, synchronizacji i obliczeń w pętli po phase. Każde wykonanie przesuwa okno kafelka dalej wzdłuż wiersza A i kolumny B.
for (int phase = 0; phase < numPhases; ++phase) {
// load, sync, compute, sync
}Sumowanie w kolejnych fazach
Lokalna zmienna sum znajduje się poza pętlą, więc jej wartość stale rośnie. Każda faza dodaje swój fragment iloczynu skalarnego do bieżącej sumy.
float sum = 0.0f;
for (int phase = 0; phase < numPhases; ++phase) { ... }Przesunięcie kafelka w każdej fazie
W każdej fazie kolumna odczytywana z A i wiersz odczytywany z B przesuwają się o phase * TILE. W ten sposób przesuwa się okno.
As[ty][tx] = A[row*N + phase*TILE + tx];
Bs[ty][tx] = B[(phase*TILE + ty)*N + col];Synchronizacja po wczytaniu
Tak jak wcześniej, wywołaj __syncthreads() po wczytaniu danych, aby kafelek był kompletny, zanim którykolwiek wątek zacznie na nim obliczenia.
__syncthreads();Obliczanie fragmentu bieżącej fazy
Pętla wewnętrzna dodaje TILE iloczynów do sumy, korzystając wyłącznie ze świeżo wczytanego kafelka. Wnosi ona jeden fragment do końcowego iloczynu skalarnego.
for (int k = 0; k < TILE; ++k)
sum += As[ty][k] * Bs[k][tx];Druga bariera
Każdą fazę zakończ kolejnym wywołaniem __syncthreads(), aby żaden wątek nie nadpisał kafelka, gdy wolniejszy wątek nadal go odczytuje. 🚧
__syncthreads(); // before the next phase loadsDlaczego potrzebne są dwie synchronizacje
Jedna bariera chroni odczyty wykonywane po wczytaniu, a druga chroni wczytywanie wykonywane po odczytach. Razem utrzymują każdy wątek w synchronizacji podczas kolejnych faz.
Zapisywanie końcowej sumy
Po zakończeniu wszystkich faz bieżąca suma jest pełnym iloczynem skalarnym. Zapisz ją do C raz, zabezpieczając zapis sprawdzeniem zakresu.
if (row < N && col < N)
C[row*N + col] = sum;Obsługa rozmiarów niepodzielnych
Gdy N nie jest całkowitą wielokrotnością TILE, dla elementów spoza zakresu wczytaj zero, aby dodatkowe iloczyny nic nie dodały do sumy.
Szybkie sprawdzenie
Zastanów się, gdzie znajduje się bieżąca suma podczas pętli faz.
Podsumowanie
Wykonali Państwo pętlę po fazach, przesuwając kafelki, synchronizując wątki dwukrotnie i dodając sumy częściowe do jednej wartości. Teraz zmierzą Państwo, o ile rozwiązanie działa szybciej. 📈
Często zadawane pytania
Czy lekcja „Iterowanie po fazach kafelków” jest bezpłatna?
Tak — pełny tekst „Iterowanie po fazach kafelkó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 „Iterowanie po fazach kafelków”?
Gromadzić sumy częściowe z kolejnych kafelków. Ć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 „Iterowanie po fazach kafelkó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
- Naiwny kernel mnożenia macierzy
- Kafelkowanie iloczynu skalarnego
- Iterowanie po fazach kafelków
- Pomiar przyspieszenia