CUDA Academy · Lekcja

Dynamiczna pamięć współdzielona

Ustalać rozmiar pamięci współdzielonej podczas uruchamiania.

Lekcja 4 z 413 kroki

Dynamiczna pamięć współdzielona 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.

Gdy rozmiar nie jest jeszcze znany

Czasami rozmiar tablicy współdzielonej zależy od wartości ustalanej w czasie działania programu, więc nie można go zakodować na stałe. CUDA rozwiązuje ten problem za pomocą dynamicznej pamięci współdzielonej.

Deklaracja extern

Deklaruje się ją za pomocą extern __shared__ i pustych nawiasów kwadratowych. W kodzie nie podaje się rozmiaru, więc kompilator pozostawia go nieustalonym.

extern __shared__ float sdata[];

Rozmiar ustalany przy uruchomieniu

Liczbę bajtów przekazuje się jako trzeci parametr uruchomienia, między liczbą wątków a zamykającymi nawiasami kwadratowymi. W ten sposób rozmiar jest ustalany w czasie działania programu.

kern<<<blocks, threads, n * sizeof(float)>>>();

Zawsze chodzi o bajty

Klasyczny błąd: ten trzeci argument określa rozmiar w bajtach, a nie liczbę elementów. Zawsze pomnóż liczbę elementów przez sizeof, aby uzyskać prawidłową wartość.

Domyślnie zero bajtów

Jeśli pominięto trzeci argument, CUDA rezerwuje zero bajtów dynamicznej pamięci współdzielonej. Odczyt sdata ma wtedy nieokreślone działanie, więc nigdy o nim nie zapominaj.

Pamięć statyczna i dynamiczna razem

W jednym kernelu można używać obu rodzajów pamięci. Tablice statyczne zachowują stałe rozmiary, a blok dynamiczny dopasowuje się do argumentu uruchomienia.

Jeden bufor, wiele tablic

Dynamiczna pamięć współdzielona udostępnia jeden płaski bufor. Aby przechowywać kilka tablic, należy samodzielnie podzielić go za pomocą przesunięć wskaźników. 🔪

Dzielenie za pomocą przesunięć

Wskaż drugą tablicę na odpowiednią pozycję wewnątrz bufora. Pamiętaj tylko, aby wyrównać każdy fragment, tak by float nigdy nie zaczynał się w środku słowa.

extern __shared__ float buf[];
float* a = buf;
float* b = &buf[blockDim.x];

Po co pamięć dynamiczna

Pozwala ona jednemu skompilowanemu kernelowi obsługiwać wiele rozmiarów kafelków. Rozmiar pamięci współdzielonej można dostrajać przy każdym uruchomieniu bez ponownej kompilacji.

Pamiętaj o ograniczeniu sprzętowym

Nadal nie można przekroczyć wartości maksymalnej dla bloku. Jeśli przy uruchomieniu zażądano zbyt wielu bajtów, kernel po prostu się nie uruchomi.

Zezwalanie na duże alokacje

Aby przekroczyć domyślny limit na nowszych GPU, należy jawnie włączyć tę możliwość za pomocą cudaFuncSetAttribute przed uruchomieniem. W przeciwnym razie duże żądania zostaną odrzucone.

Szybkie sprawdzenie

Sprawdźmy, jak ustala się rozmiar dynamicznej pamięci współdzielonej.

Podsumowanie

Dowiedziałeś się, że tablice extern __shared__ otrzymują rozmiar w bajtach przy uruchomieniu, można je podzielić na kilka tablic, a także obowiązuje je limit na blok. Kurs ukończony! 🎉

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 „Dynamiczna pamięć współdzielona” jest bezpłatna?

Tak — pełny tekst „Dynamiczna pamięć współdzielona” 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 „Dynamiczna pamięć współdzielona”?

Ustalać rozmiar pamięci współdzielonej podczas uruchamiania. Ć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 „Dynamiczna pamięć współdzielona”?

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. Deklarowanie tablic __shared__
  2. Synchronizowanie za pomocą __syncthreads
  3. Unikanie konfliktów banków pamięci
  4. Dynamiczna pamięć współdzielona
← Powrót do CUDA Academy