Programowanie akceleratorów specyfikacja OpenCL Krzysztof Banaś Obliczenia równoległe 1
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 Krzysztof Banaś Obliczenia równoległe 2
OpenCL Specyfikacja definiuje cztery modele : Model platformy Model wykonania Model pamięci Model programowania Dwa pierwsze modele dotyczą organizacji pracy 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 Krzysztof Banaś Obliczenia równoległe 3
OpenCL model platformy Krzysztof Banaś Obliczenia równoległe 4
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 Krzysztof Banaś Obliczenia równoległe 5
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 Krzysztof Banaś Obliczenia równoległe 6
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 Krzysztof Banaś Obliczenia równoległe 7
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ń Krzysztof Banaś Obliczenia równoległe 8
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 Krzysztof Banaś Obliczenia równoległe 9
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 Krzysztof Banaś Obliczenia równoległe 10
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 Krzysztof Banaś Obliczenia równoległe 11
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 Krzysztof Banaś Obliczenia równoległe 12
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 Krzysztof Banaś Obliczenia równoległe 13
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 Krzysztof Banaś Obliczenia równoległe 14
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 Krzysztof Banaś Obliczenia równoległe 15
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 Krzysztof Banaś Obliczenia równoległe 16
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 Krzysztof Banaś Obliczenia równoległe 17
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 Krzysztof Banaś Obliczenia równoległe 18
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 Krzysztof Banaś Obliczenia równoległe 19
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 Krzysztof Banaś Obliczenia równoległe 20
OpenCL podstawowe funkcje cl_int clcompileprogram ( cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, cl_uint num_input_headers, const cl_program *input_headers, const char **header_include_names, void (CL_CALLBACK *pfn_notify( cl_program program, void *user_data, void *user_data cl_program cllinkprogram ( cl_context context, cl_uint num_devices, const cl_device_id *device_list, const char *options, cl_uint num_input_programs, const cl_program *input_programs, void (CL_CALLBACK *pfn_notify ( cl_program program, void *user_data, void *user_data, cl_int *errcode_ret Krzysztof Banaś Obliczenia równoległe 21
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 Krzysztof Banaś Obliczenia równoległe 22
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 Krzysztof Banaś Obliczenia równoległe 23
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 Krzysztof Banaś Obliczenia równoległe 24
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 Krzysztof Banaś Obliczenia równoległe 25
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 Krzysztof Banaś Obliczenia równoległe 26
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 Krzysztof Banaś Obliczenia równoległe 27
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 Krzysztof Banaś Obliczenia równoległe 28
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 Krzysztof Banaś Obliczenia równoległe 29
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 Krzysztof Banaś Obliczenia równoległe 30
OpenCL podstawowe funkcje Po wykonaniu kernela należy zwolnić zasoby za pomocą funkcji: clreleasememobject clreleasekernel clreleaseprogram clreleasecommandqueue clreleasecontext clreleaseevent itp. Krzysztof Banaś Obliczenia równoległe 31
Sekwencja wykonania operacji OpenCL Krzysztof Banaś Obliczenia równoległe 32
OpenCL podsumowanie Krzysztof Banaś Obliczenia równoległe 33
Krzysztof Banaś Obliczenia równoległe 34