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.