![Page 1: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/1.jpg)
(py)OpenCL na kartach graficznych:
Wprowadzeniedo GPGPU
kolodziejj.info
![Page 2: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/2.jpg)
● wyszukiwanie obiektów na zdjęciu● CPU-bound● 32 MPix
● implementacje:● Matlab: 6 godzin● Python + OpenCL: 1 minuta
● Tak, słownie: jedna minuta. 360 x szybciej.
![Page 3: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/3.jpg)
![Page 4: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/4.jpg)
Agenda● zastosowanie● co muszę umieć?● rys historyczny● sprzęt● terminologia● omówienie przykładowego kodu● co dalej?
![Page 5: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/5.jpg)
GPGPU
General-Purposecomputing on GPU
![Page 6: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/6.jpg)
Zastosowanie● strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób
● obrazy, video● kryptografia● fizyka (od astrofizyki do fizyki kwantowej)
● biologia, medycyna● bazy danych● ...
![Page 7: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/7.jpg)
Co przyda się z C● funkcje● podstawowe typy danych ([unsigned] integer, float, double)
● tablice● wskaźniki● umiejętność rozrzucania wszędzie tych dziwnych znaczków { } ;
![Page 8: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/8.jpg)
Historia● programowalne shadery, obsługa floatów● programowanie via OpenGL, DirectX
● pierwsze dedykowane platformy● Sh/RapidMind, Brook, Accelerator
![Page 9: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/9.jpg)
Platformy GPGPU● nVidia CUDA
● i nadal mają się nieźle● MicroSoft's F# + DirectCompute● AMD's FireStream● C++ AMP● OpenACC● …
![Page 10: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/10.jpg)
![Page 11: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/11.jpg)
![Page 12: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/12.jpg)
Tylko takie GPU?
@ CSIRO
![Page 13: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/13.jpg)
Tylko takie GPU?
@ nVidia
![Page 14: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/14.jpg)
@ nVidia
@ benchmark.pl
![Page 15: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/15.jpg)
„Zrównoleglalny” przykład
Dodawanie wektorów!
![Page 16: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/16.jpg)
„Zrównoleglalny” przykład
A[0]
A[1]
A[2]
A[n-1]
B[0]
B[1]
B[2]
B[n-1]
+ =
C[0]
C[1]
C[2]
C[n-1]
= A[0] + B[0]
= A[1] + B[1]
= A[2] + B[2]
= A[n-1] + B[n-1]
![Page 17: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/17.jpg)
„Zrównoleglalny” przykład
void add(float * a, float * b, unsigned int n, float * c) { for (int i = 0; i < n; ++i) { c[i] = a[i] + b[i]; }}
![Page 18: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/18.jpg)
CPU, szeregowo
CPU opsN ops
![Page 19: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/19.jpg)
„Zrównoleglalny” przykład
A[0]
A[1]
A[2]
A[n-1]
B[0]
B[1]
B[2]
B[n-1]
+ =
C[0]
C[1]
C[2]
C[n-1]
= A[0] + B[0]
= A[1] + B[1]
= A[2] + B[2]
= A[n-1] + B[n-1]
![Page 20: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/20.jpg)
„Zrównoleglalny” przykład
A[i] B[i]+ = C[i] = A[i] + B[i]
![Page 21: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/21.jpg)
CPU, równolegle
CPU opsN ops / 4
![Page 22: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/22.jpg)
Trochę liczbDodawanie:● N = 24, jeden wątek – 24 kroki● N = 24, 4 wątki – 6 kroków● N = 220, 4 wątki – 218 kroków● potrzebujemy więcej wątków!
![Page 23: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/23.jpg)
GPGPU● massive parallelism - setki-tysiące wątków na raz
![Page 24: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/24.jpg)
GPGPUOptymalizowanie:
● maksymalnego wykorzystania jednostek obliczeniowych w GPU
● vs. maksymalną przepustowość przesyłania danych
![Page 25: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/25.jpg)
GPGPUMetryka:
● „przepustowość” obliczeń [MB/s]
![Page 26: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/26.jpg)
OpenCL● kernele● work items● work groups● model pamięci
![Page 27: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/27.jpg)
Kernele
z grubsza funkcje w Cz keyword'em __global
__global void add(__global const float * a, __global const float * b, const unsigned int n, __global float * c) { int gid = get_global_id(0);
if (gid < n) { c[gid] = a[gid] + b[gid]; }}
![Page 28: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/28.jpg)
Kernele
z grubsza funkcje w Cz keyword'em __global
__global void add(__global const float * a, __global const float * b, const unsigned int n, __global float * c) { int gid = get_global_id(0);
if (gid < n) { c[gid] = a[gid] + b[gid]; }}
![Page 29: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/29.jpg)
Work items● „instancje” kerneli● bardzo ograniczona prywatna pamięć (rzędu KB)
● powinny żyć bardzo krótko● ale może ich być bardzo dużo
![Page 30: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/30.jpg)
A[0]
A[1]
A[2]
A[n-1]
B[0]
B[1]
B[2]
B[n-1]
+ =
C[0]
C[1]
C[2]
C[n-1]
= A[0] + B[0]
= A[1] + B[1]
= A[2] + B[2]
= A[n-1] + B[n-1]
Work items
![Page 31: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/31.jpg)
C[0]
C[1]
C[2]
C[n-1]
= A[0] + B[0]
= A[1] + B[1]
= A[2] + B[2]
= A[n-1] + B[n-1]
Work items
![Page 32: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/32.jpg)
C[2] = A[2] + B[2]
Work items
![Page 33: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/33.jpg)
Work groups
● grupy work items● wielkość grupy – local work size● maksymalna wielkość zależy od urządzenia
● pamięć lokalna
![Page 34: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/34.jpg)
C[0]
C[1]
C[2]
C[n-1]
= A[0] + B[0]
= A[1] + B[1]
= A[2] + B[2]
= A[n-1] + B[n-1]
Work groups
![Page 35: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/35.jpg)
C[0]
C[1]
C[2]
C[n-1]
Work groups
![Page 36: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/36.jpg)
Work groups
![Page 37: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/37.jpg)
Work groups
local work size = 1024N = 3 * 1024 = 3072
![Page 38: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/38.jpg)
Model pamięci
![Page 39: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/39.jpg)
Model pamięci
device
host
r i v a t e m e mp
work group 1 work group 2 work group n
local memory local memorylocal memory
host memory
global memory
![Page 40: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/40.jpg)
Czas na kod!
__global void add(__global const float * a, __global const float * b, const unsigned int n, __global float * c) { int gid = get_global_id(0);
if (gid < n) { c[gid] = a[gid] + b[gid]; }}
![Page 41: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/41.jpg)
#include <stdio.h>#include <stdlib.h>#include <time.h>
#include <CL/cl.h>
#define ARRAY_SIZE 4096#define MAX_SOURCE_SIZE (0x100000)
int main(void) { const size_t ARRAY_BYTES = ARRAY_SIZE * sizeof(float);
float h_a[ARRAY_SIZE]; float h_b[ARRAY_SIZE]; for (int i = 0; i < ARRAY_SIZE; i++) { h_a[i] = (float)i; h_b[i] = (float)(2 * i); }
float h_c[ARRAY_SIZE];
FILE *fp; char *source_str; size_t source_size;
fp = fopen("vectors_cl.cl", "r"); if (!fp) { fprintf(stderr, "Failed to load kernel.\n"); exit(1); } source_str = (char *)malloc(MAX_SOURCE_SIZE); source_size = fread(source_str, 1, MAX_SOURCE_SIZE, fp); fclose(fp);
cl_platform_id platform_id = NULL; cl_device_id device_id = NULL; cl_uint ret_num_devices; cl_uint ret_num_platforms; cl_int ret = clGetPlatformIDs(1, &platform_id, &ret_num_platforms); ret = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, &ret_num_devices);
cl_context context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret);
cl_command_queue command_queue = clCreateCommandQueue(context, device_id, 0, &ret);
cl_mem a_mem_obj = clCreateBuffer(context, CL_MEM_READ_ONLY, ARRAY_BYTES, NULL, &ret); cl_mem b_mem_obj = clCreateBuffer(context, CL_MEM_READ_ONLY, ARRAY_BYTES, NULL, &ret); cl_mem c_mem_obj = clCreateBuffer(context, CL_MEM_WRITE_ONLY, ARRAY_BYTES, NULL, &ret);
ret = clEnqueueWriteBuffer(command_queue, a_mem_obj, CL_TRUE, 0, ARRAY_BYTES, h_a, 0, NULL, NULL); ret = clEnqueueWriteBuffer(command_queue, b_mem_obj, CL_TRUE, 0, ARRAY_BYTES, h_b, 0, NULL, NULL);
cl_program program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret); if (ret != 0) { printf("clCreateProgramWithSource returned non-zero status %d\n\n", ret); exit(1); }
ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL); if (ret != 0) { printf("clBuildProgram returned non-zero status %d: ", ret);
if (ret == CL_INVALID_PROGRAM) { printf("invalid program\n"); } else if (ret == CL_INVALID_VALUE) { printf("invalid value\n"); } else if (ret == CL_INVALID_DEVICE) { printf("invalid device\n"); } else if (ret == CL_INVALID_BINARY) { printf("invalid binary\n"); } else if (ret == CL_INVALID_BUILD_OPTIONS) { printf("invalid build options\n"); } else if (ret == CL_INVALID_OPERATION) { printf("invalid operation\n"); } else if (ret == CL_COMPILER_NOT_AVAILABLE) { printf("compiler not available\n"); } else if (ret == CL_BUILD_PROGRAM_FAILURE) { printf("build program failure\n");
size_t log_size; clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
char *log = (char *) malloc(log_size);
clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, log_size, log, NULL);
printf("%s\n", log); } else if (ret == CL_OUT_OF_HOST_MEMORY) { printf("out of host memory\n"); } exit(1); }
cl_kernel kernel = clCreateKernel(program, "add", &ret);
ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&a_mem_obj); ret = clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&b_mem_obj); ret = clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&c_mem_obj); size_t array_size = ARRAY_SIZE; ret = clSetKernelArg(kernel, 3, sizeof(const size_t), (void *)&array_size);
size_t global_item_size = ARRAY_SIZE; // Process the entire lists size_t local_item_size = 1; // Divide work items into groups of 64 ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global_item_size, &local_item_size, 0, NULL, NULL);
ret = clEnqueueReadBuffer(command_queue, c_mem_obj, CL_TRUE, 0, ARRAY_BYTES, h_c, 0, NULL, NULL);
ret = clFlush(command_queue); ret = clFinish(command_queue); ret = clReleaseKernel(kernel); ret = clReleaseProgram(program); ret = clReleaseMemObject(a_mem_obj); ret = clReleaseMemObject(b_mem_obj); ret = clReleaseMemObject(c_mem_obj); ret = clReleaseCommandQueue(command_queue); ret = clReleaseContext(context);
return 0;}
![Page 42: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/42.jpg)
Jak to odpalić?
● Instalacja OpenCL + ICD● ICD – Installable Client Driver
![Page 43: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/43.jpg)
Jak to odpalić?
$ gcc -std=c99 vectors_cl.c -o vectors_cl -l OpenCL$ ./vectors_cl
● kompilacja, uruchomienie:
![Page 44: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/44.jpg)
![Page 45: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/45.jpg)
pyopencl
![Page 46: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/46.jpg)
Czas na ładny kod!
__global void add(__global const float * a, __global const float * b, const unsigned int n, __global float * c) { int gid = get_global_id(0);
if (gid < n) { c[gid] = a[gid] + b[gid]; }}
![Page 47: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/47.jpg)
import numpyimport osimport pyopencl
def add(a, b): # Create context. context = pyopencl.create_some_context()
# Create command queue withing it. queue = pyopencl.CommandQueue(context)
# Build the "program". program = pyopencl.Program( context, open(os.path.join( os.path.dirname(os.path.abspath(__file__)), "vectors_cl.cl") ).read() ).build()
![Page 48: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/48.jpg)
# Create two readable buffers on the device memory and # copy the input data there. a_in = pyopencl.Buffer( context, pyopencl.mem_flags.READ_ONLY | pyopencl.mem_flags.COPY_HOST_PTR, hostbuf=a) b_in = pyopencl.Buffer( context, pyopencl.mem_flags.READ_ONLY | pyopencl.mem_flags.COPY_HOST_PTR, hostbuf=b)
# Create one writeable buffer on the device memory for # result. c_out = pyopencl.Buffer( context, pyopencl.mem_flags.WRITE_ONLY, a.nbytes # Size. )
![Page 49: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/49.jpg)
# Execute the kernel. program.add(queue, a.shape, None, a_in, b_in, numpy.uint32(ARRAY_SIZE), c_out)
# Create empty numpy array on the host for result. c = numpy.empty_like(a)
# Copy the result from the device to the host. pyopencl.enqueue_copy(queue, c, c_out)
return c
![Page 50: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/50.jpg)
# Execute the kernel. program.add(queue, a.shape, None, a_in, b_in, numpy.uint32(ARRAY_SIZE), c_out)
# Create empty numpy array on the host for result. c = numpy.empty_like(a)
# Copy the result from the device to the host. pyopencl.enqueue_copy(queue, c, c_out)
return c
__global void add(__global const float * a, __global const float * b, const unsigned int n, __global float * c) { int gid = get_global_id(0);
if (gid < n) { c[gid] = a[gid] + b[gid]; }}
![Page 51: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/51.jpg)
ARRAY_SIZE = 4096
def test_add(): # Generate the input array on the host. a = numpy.empty(ARRAY_SIZE, dtype=numpy.float32) b = numpy.empty(ARRAY_SIZE, dtype=numpy.float32)
for i in range(ARRAY_SIZE): a[i] = i b[i] = 2 * i
c = add(a, b)
assert c[0] == 0 assert c[1] == 3 assert c[-2] == 12282 assert c[-1] == 12285
![Page 52: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/52.jpg)
$ py.test
examples/test_vectors_cl.py .
================= 1 passed in 0.21 seconds =================
![Page 53: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/53.jpg)
Więcej o work itemsget_global_id(0);
![Page 54: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/54.jpg)
Więcej o work itemsget_global_id(0);
get_global_id(1);
![Page 55: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/55.jpg)
Więcej o work items
get_global_id(0);
get_global_id(1);
get_global_id(2);
![Page 56: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/56.jpg)
Czas na ładny kod!
__global void add(__global const float * in, const int width, const int height, __global float * c) { int x = get_global_id(0); int y = get_global_id(1);
int gid = y * width + x;
if (x < width && y < height) { // }}
![Page 57: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/57.jpg)
![Page 58: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/58.jpg)
![Page 59: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/59.jpg)
Optymalizacja● rozmiar work group● sekwencyjny dostęp do pamięci● uruchamianie wielu kerneli naraz● ...
![Page 60: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/60.jpg)
Wzorce● mapa● redukcja● scan● histogram● scatter● gather● sort
![Page 61: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/61.jpg)
Wzorce● pyopencl.elementwise● pyopencl.reduction● pyopencl.scan● pyopencl.algorithm● pyopencl.bitonic_sort
![Page 62: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/62.jpg)
from pyopencl import ...● Image● array● clmath● clrandom● characterize● tools●
![Page 63: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/63.jpg)
Wsparcie OpenCL● OpenCV● ClBLAS, ViennaCL, clFFT● Rivertrail, WebCL● ViNN● Go, Haskell, Lua, Rust, Java…● PgOpenCL
![Page 64: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/64.jpg)
Randomowe uwagi● typy danych
● ile bajtów jest we floacie?● zawsze ustawiać dtype w numpy.array
● wielkość danych● jak zwykle, testy :)
![Page 65: Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny sposób obrazy, video kryptografia fizyka (od astrofizyki do fizyki kwantowej) biologia,](https://reader034.vdocuments.pub/reader034/viewer/2022052006/601a24b3c6ca831811033783/html5/thumbnails/65.jpg)
Dzięki :) Pytania?
kolodziejj.info/talks/gpgpu/