Kafelkowanie iloczynu skalarnego
Wczytywać podkafelki A i B w poszczególnych fazach.
Kafelkowanie iloczynu skalarnego 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.
Idea kafelkowania
Kafelkowanie dzieli macierze na małe kwadratowe kafelki, które mieszczą się w szybkiej pamięci układowej. Wątki współpracują, aby raz wczytać kafelek i wielokrotnie go wykorzystać.
Dlaczego pamięć współdzielona
Kafelek znajduje się w pamięci __shared__, widocznej dla każdego wątku w bloku. Odczyt z niej jest znacznie szybszy niż wielokrotne odwoływanie się do pamięci globalnej. ⚡
__shared__ float As[TILE][TILE];
__shared__ float Bs[TILE][TILE];Jeden blok, jeden kafelek wyniku
Każdy blok odpowiada za jeden fragment wyniku C o rozmiarze TILE na TILE. Jego wątki wspólnie obliczają cały ten fragment.
Rozmiar kafelka odpowiada blokowi
Wybierają Państwo TILE równe szerokości bloku, najczęściej 16 lub 32. Dzięki temu każdy wątek wczytuje dokładnie jeden element każdego kafelka.
#define TILE 16
dim3 threads(TILE, TILE);Przypisywanie wątku do pozycji w kafelku
Wewnątrz kafelka pozycję wątku określa po prostu jego threadIdx. Globalny wiersz i kolumna nadal wynikają z indeksów bloku i wątku.
int ty = threadIdx.y, tx = threadIdx.x;
int row = blockIdx.y*TILE + ty;
int col = blockIdx.x*TILE + tx;Wczytywanie kafelka A
Każdy wątek kopiuje jeden element bieżącego kafelka A do pamięci współdzielonej. Wspólnie cały blok wczytuje fragment A o rozmiarze TILE na TILE.
As[ty][tx] = A[row*N + (phase*TILE + tx)];Wczytywanie kafelka B
W tym samym czasie każdy wątek wczytuje jeden element kafelka B. Teraz oba kafelki znajdują się w pamięci układowej i są gotowe do szybkich, wielokrotnych odczytów.
Bs[ty][tx] = B[(phase*TILE + ty)*N + col];Synchronizacja przed obliczeniami
Wywołaj __syncthreads(), aby każdy wątek zakończył wczytywanie, zanim którykolwiek zacznie odczytywać kafelek. Pominięcie tego kroku prowadzi do błędnych wyników.
__syncthreads();Obliczenia na kafelku
Teraz każdy wątek wykonuje krótką pętlę po kafelku, odczytując wyłącznie pamięć współdzieloną. Te odczyty są znacznie tańsze niż odczyty z pamięci globalnej.
for (int k = 0; k < TILE; ++k)
sum += As[ty][k] * Bs[k][tx];Korzyść z ponownego użycia
Każda wczytana wartość jest używana przez TILE wątków zamiast przez jeden. To ponowne użycie danych jest głównym powodem, dla którego mnożenie macierzy z kafelkowaniem działa tak szybko.
Jeden kafelek nie wystarczy
Pojedynczy kafelek obejmuje tylko część iloczynu skalarnego. Należy powtórzyć kroki wczytywania, synchronizacji i obliczeń w wielu fazach, czym zajmie się następna lekcja.
Szybkie sprawdzenie
Przypomnij sobie kolejność kroków podczas pracy ze współdzielonym kafelkiem.
Podsumowanie
Umieścili Państwo kafelki A i B w pamięci współdzielonej, wykonali synchronizację, a następnie obliczenia z użyciem tanich odczytów z pamięci układowej. Zysk wynika z ponownego użycia. Następne są fazy. 🧱
Często zadawane pytania
Czy lekcja „Kafelkowanie iloczynu skalarnego” jest bezpłatna?
Tak — pełny tekst „Kafelkowanie iloczynu skalarnego” 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 „Kafelkowanie iloczynu skalarnego”?
Wczytywać podkafelki A i B w poszczególnych fazach. Ć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 „Kafelkowanie iloczynu skalarnego”?
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