CUDA Academy · Lekcja

Naiwny kernel mnożenia macierzy

Podstawa indeksowana dwuwymiarowo i jej ograniczenia.

Lekcja 1 z 413 kroki

Naiwny kernel mnożenia macierzy to bezpłatna lekcja CUDA Academy na CoddyKit. To lekcja 1 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.

Mnożenie macierzy w stylu GPU

Mnożenie macierzy jest podstawą grafiki i sztucznej inteligencji. Najpierw zbudujesz dziś naiwną wersję na GPU, a następnie dowiesz się, dlaczego nie wykorzystuje ona całego potencjału wydajności.

Matematyka w jednym wierszu

Każda komórka wynikowa C[row][col] jest iloczynem skalarnym: należy pomnożyć cały wiersz A przez całą kolumnę B i zsumować wyniki. 🧮

C[row][col] = sum over k of A[row][k] * B[k][col]

Jeden wątek na wynik

Najprostszy plan przypisuje każdemu wątkowi jeden element wynikowy C. Tysiące komórek jest obliczanych jednocześnie w całym GPU.

Dwuwymiarowa siatka wątków

Ponieważ C jest siatką 2D, uruchamiają Państwo wątki w dwóch wymiarach. Indeks x wskazuje kolumnę, a indeks y wskazuje wiersz.

dim3 threads(16, 16);
dim3 blocks((N+15)/16, (N+15)/16);

Określanie komórki wątku

Wewnątrz kernela każdy wątek oblicza własny wiersz i kolumnę na podstawie indeksu bloku i wątku, tak jak przy indeksowaniu 1D, ale dla obu osi.

int row = blockIdx.y*blockDim.y + threadIdx.y;
int col = blockIdx.x*blockDim.x + threadIdx.x;

Sprawdzanie zakresu

Siatki są zaokrąglane w górę, więc niektóre wątki znajdą się poza macierzą. Przed uzyskaniem dostępu do pamięci należy zastosować warunek if (row < N && col < N).

if (row < N && col < N) {
  // safe to compute
}

Pętla wewnętrzna

Każdy wątek wykonuje pętlę po k, dodając iloczyny do lokalnej sumy. Ta zmienna lokalna jest przechowywana w szybkim rejestrze.

float sum = 0.0f;
for (int k = 0; k < N; ++k)
  sum += A[row*N+k] * B[k*N+col];

Zapisywanie wyniku

Po zakończeniu pętli wątek zapisuje obliczoną sumę do C dokładnie raz. Jeden wątek, jeden uporządkowany zapis.

C[row*N + col] = sum;

Spłaszczanie wierszami

Macierz jest płaską tablicą 1D, dlatego indeksuje się ją jako row*N + col. Poprawne odwzorowanie tego układu to połowa sukcesu w mnożeniu macierzy.

Dlaczego działa, ale wolno

Ten kernel jest poprawny i łatwy do odczytania, ale każdy wątek odczytuje swój wiersz i kolumnę bezpośrednio z pamięci globalnej, czyli najwolniejszej przestrzeni.

Ukryty koszt

Sąsiadujące wątki wielokrotnie odczytują te same wiersze A i kolumny B. To niepotrzebne przesyłanie danych w pamięci zostanie właśnie wyeliminowane przez kafelkowanie.

Szybkie sprawdzenie

Zastanów się, jak naiwny kernel przypisuje pracę wątkom.

Podsumowanie

Przypisali Państwo jeden wątek do jednej komórki wyniku, wykonali pętlę po k, odczytując dane z pamięci globalnej, i zauważyli powtarzające się odczyty. Następnie ograniczą Państwo ten ruch danych za pomocą kafelkowania. 🚀

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 „Naiwny kernel mnożenia macierzy” jest bezpłatna?

Tak — pełny tekst „Naiwny kernel mnożenia macierzy” 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 „Naiwny kernel mnożenia macierzy”?

Podstawa indeksowana dwuwymiarowo i jej ograniczenia. Ć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 1 z 4.

Ile czasu zajmuje lekcja „Naiwny kernel mnożenia macierzy”?

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. Naiwny kernel mnożenia macierzy
  2. Kafelkowanie iloczynu skalarnego
  3. Iterowanie po fazach kafelków
  4. Pomiar przyspieszenia
← Powrót do CUDA Academy