Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf ·...

45
Krzysztof Banaś Obliczenia równoległe 1 Programowanie procesorów graficznych do obliczeń ogólnego przeznaczenia - GPGPU

Transcript of Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf ·...

Page 1: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 1

Programowanie procesorów graficznych do obliczeń ogólnego 

przeznaczenia ­ GPGPU

Page 2: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 2

GPGPU ­ motywacja

Page 3: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 3

GPGPU – motywacja

Page 4: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 4

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

Page 5: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 5

Architektura rdzeni – CPU versus GPU

Page 6: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 6

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

Page 7: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 7

GPGPU ­ historia

Page 8: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 8

GPGPU ­ historia

Page 9: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 9

GPGPU ­ historia

Page 10: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 10

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”

Page 11: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 11

TESLA architecture – CUDA – G80 ­ 2006

Page 12: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 12

CUDA

Page 13: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 13

Programowanie akceleratorów – specyfikacja OpenCL

Page 14: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 14

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

Page 15: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 15

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)

Page 16: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 16

OpenCL – model platformy

Page 17: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 17

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)

Page 18: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 18

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 

Page 19: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 19

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

Page 20: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 20

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ń

Page 21: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 21

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_CPUCL_DEVICE_TYPE_GPUCL_DEVICE_TYPE_ACCELERATOR+ CL_DEVICE_TYPE_ALL  ­ dla wszystkich typów

Page 22: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 22

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_FREQUENCYOraz wiele innych związanych np. z modelami pamięci i programowania

Page 23: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 23

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

Page 24: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 24

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)

Page 25: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 25

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)  

Page 26: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 26

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

Page 27: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 27

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

Page 28: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 28

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_ENABLECL_QUEUE_PROFILING_ENABLE

Page 29: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 29

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

Page 30: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 30

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 

Page 31: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 31

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)

Page 32: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 32

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

Page 33: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 33

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)

Page 34: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 34

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

Page 35: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 35

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)

Page 36: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 36

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

Page 37: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 37

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

Page 38: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 38

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

Page 39: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 39

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)

Page 40: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 40

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

Page 41: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 41

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

Page 42: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 42

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)

Page 43: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 43

OpenCL – podstawowe funkcje

➔ Po wykonaniu kernela należy zwolnić zasoby za pomocą funkcji:

clReleaseMemObject clReleaseKernel clReleaseProgram clReleaseCommandQueue clReleaseContext clReleaseEvent itp.

Page 44: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 44

Sekwencja wykonania operacji OpenCL

Page 45: Programowanie procesorów graficznych do obliczeń ogólnego ...banas/SRR/SRR_W04_OpenCL_1.pdf · Istnieją dwa podstawowe rodzaje obiektów pamięci: Bufory – buffers, standardowe

Krzysztof Banaś Obliczenia równoległe 45

OpenCL ­ podsumowanie