CUDA i OpenCL

Transkrypt

CUDA i OpenCL
SMOR - LABORATORIUM 4
OpenCL/ CUDA Transpozycja macierzy - od rozwiązania prostego do zoptymalizowanego, pamięć
dzielona, konflikty banków pamięci
CEL I ZADANIA
Celem laboratorium jest zapoznanie studentów z wybranymi pojęciami programowania
współbieżnego dotyczącego optymalizacji kodu kernela.
Zadanie1: Pomiar i wykonanie wykresu przepustowości pamięci GPU (GB/s) w zależności od stopnia
niełączonego dostępu do pamięci za pomocą odpowiedniego programu OpenCL.
Kod CUDA kernela tego programu jest następujący:
__global__ void stride(int* a, int s)
{
int i = (blockDim.x * blockIdx.x + threadIdx.x) * s;
a[i] = a[i] + 1;
}
Wykres należy wykonać dla s z przedziału <0 – 32>
Należy m.in. przekodować powyższy kod kernela napisać w OpenCL.
Zadanie 2: Wykonanie programów CUDA i OpenCL transpozycji macierzy 2D
Na podstawie przykładowych wzorców plików źródłowych (wzorce wymagają modyfikacji aby można
było je skompilować) cudatrans.cpp i opencltrans.cpp dokonać transpozycji macierzy MxN dla 3
algorytmów zgodnie z wykładem 9. Dla wersji CUDA wykonać pomiary liczby cykli zegarowych w
funkcji kernela. Dla wersji OpenCL wykonać pomiary efektywności pasma pamięci dla 3 algorytmów
(prosty, z pamięcią dzieloną, z eliminacją konfliktów dla pamięci dzielonej).
INFORMACJE SZCZEGÓŁOWE
Wymagania środowiska komputerowego (Windows/Linux):
1. MS Visual 2012/Visual 2013 (C++11,C++AMP) lub Code Blocks 13.12+mingw lub g++
2. CUDA 5.5 Visual C++ 2010 lub nowszy Code Blocks 13.12+mingw lub g++
W czasie testów proszę wykorzystać ok 50-90% pamięci systemu cpu/gpu o ile każdy pojedynczy
pomiar nie przekracza sekundy. Jeżeli przekracza proszę zredukować wielkość pamięci. Wyznaczenie
memory bandwidth dla każdego przypadku powinno być powtórzone kilka razy. Dla pomiarów
powinna być określona wartość średnia i odchylenie standardowe. Proszę nie przekraczać dostępnej
pamięci systemu CPU ze względu na znaczne wydłużenie czasu pomiaru i ryzyko wielokrotnego
spowolnienia działania systemu operacyjnego (praktyczny brak komunikacji użytkownika z systemem
i konieczność restartu systemu).
Dla OpenCL używamy mechanizmów GPU API cl::event do pomiaru czasu wykonania kernela . W
wersji CUDA używamy funkcji clock() wewnątrz kernela do zliczania liczby cykli zegarowych i później
dane z kernela kopiujemy do hosta.
Dla wersji CUDA należy napisać program transpozycji macierzy MxN w 3 wersjach kernela
(transpozycja prosta, z użyciem pamięci dzielonej, z eliminacja konfliktów banków pamięci dzielonej)
i użyć go dla macierzy 6x6 wypełnionej liczbami od 1-36 dla bloków 2x2 z siatką 3x3.
Należy użyć funkcji clock() dla każdego wątku do monitorowania cykli zegarowych zużywanych w
wątku. Informacje o zużytych cyklach zegarowych należy wyświetlić na ekranie. Należy także
wyświetlić zawartość pamięci dzielonej w przypadkach 2 i 3 wersji programu.
Dla wersji OpenCL należy napisać program transpozycji macierzy MxN w 3 wersjach kernela z
wykorzystaniem cl.hpp (program w C++) i użyć go dla macierzy float o wielkości 8192x8192.
Wyznaczyć efektywne pasmo pamięci i obliczyć i podać w procentach wykorzystanie pasma pamięci
dla 3 przypadków. Proszę za każdym razem weryfikować poprawność obliczeń za pomocą wykonania
tych samych obliczeń na CPU i porównania wyników. (dla std::vector istnieje operator porównania)
PRZYGOTOWANIE DO ZAJĘĆ
Wykład 9
Analiza cl.hpp – przegląd dokumentacji
http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.2.pdf
Analiza kodów źródłowych dostępnych w materiałach pomocniczych.
Ew. przygotowanie własnych kodów źródłowych CUDA i OpenCL na podstawie szkieletów kodu
podanych jako materiał pomocniczy do laboratorium
Przypomnienie podstawowych parametrów dla CPU i GPU używanych w czasie wykonywania
ćwiczenia.
SPRAWOZDANIE
W sprawozdaniu powinny być umieszczone następujące informacje:
1. Standardowe informacje dotyczące wykonanego ćwiczenia ( dane wykonującego ćwiczenie,
data godzina, używane narzędzia, warunki itp.)
2. Ch-ka systemu komputerowego CPU/GPU
3. Wykres zmierzonej przepustowości pamięci (Memory bandwidth) od liczby s <0-32> (stride)
dla wybranego wektora int *a. Program OpenCL, który posłużył do otrzymania wyników.
4. Wyniki eksperymentów CUDA z transpozycją macierzy 6x6 w tym:
a. Liczba cykli zegarowych dla poszczególnych algorytmów i części algorytmów
b. Wydruki pamięci dzielonej dla bloków obliczeniowych
c. Wnioski
d. Program CUDA który posłużył do otrzymania wyników
5. Wyniki eksperymentów czasu wykonania programu transpozycji macierzy MxN napisanej w
OpenCL wyrażonej w efektywności wykorzystania przepustowości pamięci – patrz wykład 9
Powodzenia! W razie pytań i wątpliwości proszę pytać w czasie laboratorium, czy mailowo.