Programowanie procesorów graficznych do obliczeń ogólnego przeznaczenia GPGPU

Podobne dokumenty
Programowanie akceleratorów specyfikacja OpenCL. Krzysztof Banaś Obliczenia równoległe 1

Programowanie równoległe Wprowadzenie do OpenCL. Rafał Skinderowicz

Programowanie procesorów graficznych GPGPU

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

Wstęp do OpenCL. Czyli jak wykorzystać moc drzemiącą w GPU. Marek Zając 2013r. zajacmarek.com

i3: internet - infrastruktury - innowacje

Wprowadzenie do GPGPU

Wprowadzenie do GPGPU

Moc płynąca z kart graficznych

Programowanie procesorów graficznych GPU

Programowanie w modelu równoległości danych oraz dzielonej globalnej pamięci wspólnej. Krzysztof Banaś Obliczenia równoległe 1

Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

CUDA część 1. platforma GPGPU w obliczeniach naukowych. Maciej Matyka

Programowanie procesorów graficznych GPGPU. Krzysztof Banaś Obliczenia równoległe 1

Programowanie z wykorzystaniem technologii CUDA i OpenCL Wykład 1

Przetwarzanie Równoległe i Rozproszone

OpenGL - Open Graphics Library. Programowanie grafiki komputerowej. OpenGL 3.0. OpenGL - Architektura (1)

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

Obliczenia Wysokiej Wydajności

Programowanie Równoległe Wykład, CUDA praktycznie 1. Maciej Matyka Instytut Fizyki Teoretycznej

Programowanie procesorów graficznych GPGPU. Krzysztof Banaś Obliczenia równoległe 1

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Architektury komputerów Architektury i wydajność. Tomasz Dziubich

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

Programowanie współbieżne i rozproszone

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Programowanie Równoległe wykład, CUDA, przykłady praktyczne 1. Maciej Matyka Instytut Fizyki Teoretycznej

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Programowanie kart graficznych

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Alternatywne modele programowania równoległego

Programowanie obiektowe zastosowanie języka Java SE

Raport Hurtownie Danych

Programowanie Współbieżne

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

Programowanie sterowników przemysłowych / Jerzy Kasprzyk. wyd. 2 1 dodr. (PWN). Warszawa, Spis treści

6. Algorytmy ochrony przed zagłodzeniem dla systemów Linux i Windows NT.

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Programowanie aplikacji równoległych i rozproszonych

Podstawy programowania skrót z wykładów:

ROZPROSZONY SYSTEM DO KRYPTOANALIZY SZYFRÓW OPARTYCH NA KRZYWYCH ELIPTYCZNYCH

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Tesla. Architektura Fermi

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

MMX i SSE. Zbigniew Koza. Wydział Fizyki i Astronomii Uniwersytet Wrocławski. Wrocław, 10 marca Zbigniew Koza (WFiA UWr) MMX i SSE 1 / 16

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Kompilator języka C na procesor 8051 RC51 implementacja

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

XIII International PhD Workshop OWD 2011, October 2011 REALIZACJA OBLICZEŃ W ARCHITEKTURZE MASOWO RÓWNOLEGŁEJ W HETEROGENICZNYCH SYSTEMACH

która metoda jest najlepsza

Wysokowydajna implementacja kodów nadmiarowych typu "erasure codes" z wykorzystaniem architektur wielordzeniowych

PhysX Visual Debugger. Tomasz Gańko

Wydajność obliczeń a architektura procesorów. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Szablony funkcji i szablony klas

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

GRAFIKA KOMPUTEROWA. Rozwiązania sprzętowe i programowe. Przyspieszanie sprzętowe. Synteza i obróbka obrazu

Linux Kernel III. Character devices

Programowanie w C++ Wykład 10. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 10) Programowanie w C++ 1 / 21

1 Temat: Vertex Shader

1.Wstęp. 2.Generowanie systemu w EDK

Podstawy programowania. Wykład 1 Wstęp. Krzysztof Banaś Podstawy programowania 1

Programowanie aplikacji na iphone. Wstęp do platformy ios. Łukasz Zieliński

Wstęp do programowania

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

PARADYGMATY PROGRAMOWANIA Wykład 4

Programowanie Niskopoziomowe

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

GRAFIKA KOMPUTEROWA. Rozwiązania sprzętowe i programowe. Przyspieszanie sprzętowe. Synteza dźwięku i obrazu

76.Struktura oprogramowania rozproszonego.

Programowanie w języku C++ Grażyna Koba

Julia 4D - raytracing

Jednostka GPU oraz OpenCL aplikacje

Programowanie kart graficznych

Programowanie w języku C++

Procesy pojęcia podstawowe. 1.1 Jak kod źródłowy przekształca się w proces

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

JCuda Czy Java i CUDA mogą się polubić? Konrad Szałkowski

Wprowadzenie do programowania

Przegląd architektury PlayStation 3

Programowanie współbieżne Wprowadzenie do programowania GPU. Rafał Skinderowicz

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

KARTA PRZEDMIOTU. Programowanie niskopoziomowe, C1

Karta przedmiotu. Podstawy programowania procesorów graficznych. realizowanego w ramach projektu PO WER

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

Programowanie Równoległe wykład 12. OpenGL + algorytm n ciał. Maciej Matyka Instytut Fizyki Teoretycznej

Nowoczesne technologie przetwarzania informacji

Transkrypt:

Programowanie procesorów graficznych do obliczeń ogólnego przeznaczenia GPGPU 1

GPGPU motywacja 2

GPGPU motywacja 3

Tendencje Mało dużych rdzeni rozbudowane potoki wykonanie poza kolejnością wyrafinowane przewidywanie rozgałęzień wiele jednostek funkcjonalnych Dużo małych rdzeni prostsza budowa, krótsze potoki wykonanie w kolejności proste przewidywanie rozgałęzień mniej jednostek funkcjonalnych 4

Architektura rdzeni CPU versus GPU 5

GPGPU Historia: lata 80 te popularyzacja systemów i programów z graficznym interfejsem specjalistyczne układy do przetwarzania grafiki 2D lata 90 te standaryzacja potoku przetwarzania grafiki 3D (OpenGL, DirectX) vertex shaders pixel shaders procesory graficzne 3D XXI wiek programowalne układy graficzne (programmable shaders) język Cg początek GPGPU 6

GPGPU historia 7

GPGPU historia 8

GPGPU historia 9

GPGPU Listopad 2006: architektura Tesla ujednolicona architektura, zamiast pixel shaders i vertex shaders standardowe skalarne procesory (nazywane obecnie rdzeniami CUDA CUDA cores ) procesor G80 karta graficzna NVIDIA GeForce 8800 model programowania CUDA (Compute Unified Device Architecture) środowisko programowania C for CUDA 10

TESLA architecture CUDA G80 2006 11

CUDA 12

Programowanie akceleratorów specyfikacja OpenCL 13

OpenCL OpenCL Open Computing Language język i środowisko programowania akceleratorów (procesorów wspierających standardowe CPU) Tzw. de facto standard, tworzony i wspierany przez grupę Khronos Na bazie języka C (z uwzględnieniem C++, niezależnie od standardu powstają wersje dla innych języków) Z założenia przeznaczony dla rozmaitych akceleratorów (CPU, karty Xeon Phi, GPU, procesory hybrydowe, takie jak IBM Cell) różne architektury, różni producenci 14

OpenCL Specyfikacja definiuje cztery modele : Dwa pierwsze modele dotyczą organizacji pracy Model platformy Model wykonania Model pamięci Model programowania Współpraca systemu bazowego i akceleratora Tworzenie i uruchamianie programów na akceleratorze Dwa ostatnie ujmują specyfikę programowania akceleratorów Abstrakcyjny model w ramach OpenCL Możliwość uwzględnienia specyficznych cech konkretnych akceleratorów (GPU, Cell, Xeon Phi) 15

OpenCL model platformy 16

OpenCL model platformy Model platformy abstrakcyjny model sprzętu Host system podstawowy (program uruchomiony na systemie hosta zarządza programami na akceleratorach Device akcelerator (urządzenie?, diwajs?) Platforma jest jednocześnie pojedynczym wybranym środowiskiem wykonania programu na akceleratorze (na jednym komputerze można zainstalować i uruchamiać wiele platform) 17

OpenCL podstawowe funkcje cl_int clgetplatformids( cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms ) cl_int clgetplatforminfo( cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret ) Parametry clgetplatforminfo: CL_PLATFORM_ PROFILE VERSION NAME VENDOR EXTENSION 18

OpenCL model platformy Akcelerator device (urządzenie z interfejsem pamięci) Składa się z compute units procesory?, rdzenie? (posiadają jednostki pobierania i dekodowania rozkazów) Każdy compute unit składa się z processing elements rdzenie?, potoki? (służą do ostatecznej realizacji rozkazów) Znaczenie pojęć compute unit (CU) i processing element (PE) może być różne dla różnych typów akceleratorów dlatego projektując oprogramowanie używać będziemy tylko określeń abstrakcyjnych CU i PE W fazie optymalizacji dla konkretnej architektury należy uwzględnić rzeczywiste znaczenie CU i PE 19

OpenCL model platformy Standardowy procesor CU = PE = rdzeń AMD Radeon CU = SIMD unit, PE = SIMD lane NVIDIA GeForce CU = SM, PE = CUDA core IBM Cell CU = PE = SPE Intel Xeon Phi CU = PE = rdzeń 20

OpenCL podstawowe funkcje cl_int clgetdeviceids ( cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices ) Podstawowe typy: CL_DEVICE_TYPE_CPU CL_DEVICE_TYPE_GPU CL_DEVICE_TYPE_ACCELERATOR + CL_DEVICE_TYPE_ALL dla wszystkich typów 21

OpenCL podstawowe funkcje cl_int clgetdeviceinfo ( cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret ) Ponad 70 możliwych parametrów, m. in.: CL_DEVICE_GLOBAL_MEM_SIZE, CL_DEVICE_LOCAL_MEM_SIZE, CL_DEVICE_MAX_COMPUTE_UNITS, CL_DEVICE_MAX_CLOCK_FREQUENCY Oraz wiele innych związanych np. z modelami pamięci i programowania 22

OpenCL model wykonania Kontekst zestaw danych wykorzystywanych do zarządzania wykonaniem programu na akceleratorach Pojedynczy kontekst istnieje w ramach konkretnej platformy i odnosi się do grupy akceleratorów (najczęściej tego samego typu) OpenCL wyróżnia 3 podstawowe typy akceleratorów: CPU GPU ACCELERATOR 23

OpenCL podstawowe funkcje cl_context clcreatecontext( const cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices, (void CL_CALLBACK *pfn_notify) ( const char *errinfo, const void *private_info, size_t cb, void *user_data), void *user_data, cl_int *errcode_ret ) 24

OpenCL podstawowe funkcje cl_context clcreatecontextfromtype( const cl_context_properties *properties, cl_device_type device_type, const cl_device_id *devices, (void CL_CALLBACK *pfn_notify) ( const char *errinfo, const void *private_info, size_t cb, void *user_data), void *user_data, cl_int *errcode_ret ) 25

OpenCL podstawowe funkcje cl_int clgetcontextinfo ( cl_context context, cl_context_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret ) Przykładowe parametry: CL_CONTEXT_NUM_DEVICES, CL_CONTEXT_DEVICES 26

OpenCL model wykonania OpenCL dopuszcza możliwość realizacji poleceń przez akceleratory w sposób asynchroniczny i w kolejności niezależnej od kolejności zlecania Polecenia zlecane do wykonania na akceleratorze ustawiane są w kolejce command queue Pojedyncza kolejka przypisana jest do pojedynczego akceleratora w ramach konkretnego kontekstu 27

OpenCL podstawowe funkcje cl_command_queue clcreatecommandqueue( cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_int *errcode_ret ) Własności: CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE CL_QUEUE_PROFILING_ENABLE 28

OpenCL model wykonania Pojedyncze polecenie zlecane do wykonania akceleratorowi jest funkcją zwaną kernelem Kod składający się z jednego lub kilku kerneli nazywany jest programem Program jest tworzony z kodu źródłowego napisanego w języku OpenCL będącym ograniczona wersją C99 Podstawowym sposobem tworzenia programu jest kompilacja w trakcie wykonania programu po stronie hosta Możliwe jest także wcześniejsze kompilowanie kodu i tworzenie programu z pliku binarnego 29

OpenCL model wykonania Podstawowym założeniem OpenCL jest przenośność kodu Poprawny kod źródłowy OpenCL powinien zostać skompilowany i uruchomiony przez dowolne środowisko wykonania dla dowolnego akceleratora Do programu zawierającego wywołania kerneli OpenCL dołącza się (linkuje) tylko bibliotekę konkretnego środowiska wykonania, która powinna poprawnie utworzyć kernele i zarządzać ich wykonaniem Procedury biblioteki OpenCL mogą odwoływać się do kompilatorów i ich bibliotek dedykowanych do konkretnego akceleratora 30

OpenCL podstawowe funkcje cl_program clcreateprogramwithsource ( cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_int *errcode_ret ) cl_program clcreateprogramwithbinary ( cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret ) 31

OpenCL podstawowe funkcje cl_int clbuildprogram ( cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify)( cl_program program, void *user_data), void *user_data ) Standard OpenCL definiuje kilkanaście opcji kompilacji, można także przesyłać opcje dla konkretnych środowisk programowania 32

OpenCL podstawowe funkcje cl_program cllinkprogram ( cl_int clcompileprogram ( cl_context context, cl_program program, cl_uint num_devices, cl_uint num_devices, const cl_device_id *device_list, const cl_device_id *device_list, const char *options, const char *options, cl_uint num_input_programs, cl_uint num_input_headers, const cl_program *input_programs, const cl_program *input_headers, void (CL_CALLBACK *pfn_notify) ( const char **header_include_names, cl_program program, void (CL_CALLBACK *pfn_notify)( void *user_data), cl_program program, void *user_data, void *user_data), cl_int *errcode_ret void *user_data ) ) 33

OpenCL podstawowe funkcje cl_int clgetprograminfo ( cl_program program, cl_program_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret ) cl_int clgetprogrambuildinfo ( cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) Parametry clgetprograminfo: REFERENCE_COUNT CONTEXT NUM_DEVICES DEVICES BINARY_SIZES BINARIES NUM_KERNELS KERNEL_NAMES SOURCE clgetprogrambuildinfo: BUILD_STATUS BUILD_OPTIONS BUILD_LOG BINARY_TYPE 34

OpenCL podstawowe funkcje cl_kernel clcreatekernel ( cl_program program, const char *kernel_name, cl_int *errcode_ret ) cl_int clsetkernelarg ( cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value ) 35

OpenCL model wykonania OpenCL umożliwia ograniczone zarządzanie obiektami w pamięci akceleratora przez program po stronie hosta Wykorzystuje się w tym celu pojęcie obiektu pamięci memory object Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory buffers, standardowe tablice Obrazy images, obiekty o zoptymalizowanym, charakterystycznym sposobie przechowywania, których specyfikacja umożliwia zastosowanie formatów używanych przez procesory graficzne do przechowywania rzeczywistych obrazów Bufory i obrazy mogę być tworzone, niszczone, ich zawartość kopiowana z pamięci hosta do pamięci akceleratora i z pamięci akceleratora do pamięci hosta 36

Tworzenie obiektów w pamięci GPU cl_mem clcreatebuffer ( cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret); parametry typu cl_mem_flags: CL_MEM_READ_WRITE CL_MEM_WRITE_ONLY CL_MEM_READ_ONLY CL_MEM_USE_HOST_PTR CL_MEM_ALLOC_HOST_PTR CL_MEM_COPY_HOST_PTR 37

OpenCL model wykonania Program uruchomiony po stronie hosta zleca zadania do wykonania przez akcelerator Pojedyncze zlecenie jest nazywane zdarzeniem event Dzięki zdarzeniom system wykonania OpenCL może wprowadzić synchronizację realizowanych operacji Zależności między operacjami Oczekiwanie na zakończenie operacji Zdarzenia umożliwiają także pomiar czasu realizacji operacji i tworzenie profilu wykonania programu Zdarzeniami są np.: kopiowanie danych do i z pamięci akceleratora uruchomienie programu na akceleratorze 38

OpenCL podstawowe funkcje cl_int clenqueuewritebuffer ( cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t cb, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event) 39

OpenCL model wykonania Wykonanie kernela jest zlecane środowisku wykonania OpenCL poprzez wywołanie odpowiedniej funkcji, z kernelem jako jednym z jej argumentów Z tego powodu przekazanie argumentów wywoływanemu kernelowi odbywa się w sposób różny od klasycznego Argumenty przypisuje się danemu kernelowi poprzez wywołanie specjalnej funkcji, która może jednocześnie spowodować przekazanie wartości argumentów do pamięci akceleratora 40

OpenCL podstawowe funkcje cl_int clsetkernelarg ( cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value ) rozmiar danych najlepiej uzyskiwać operatorem sizeof np. sizeof(cl_mem) dla obiektów typu cl_mem tworzonych przez clcreatebuffer 41

OpenCL podstawowe funkcje cl_int clenqueuendrangekernel ( cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event ) 42

OpenCL podstawowe funkcje Po wykonaniu kernela należy zwolnić zasoby za pomocą funkcji: clreleasememobject clreleasekernel clreleaseprogram clreleasecommandqueue clreleasecontext clreleaseevent itp. 43

Sekwencja wykonania operacji OpenCL 44

OpenCL podsumowanie 45