Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny...

65
(py)OpenCL na kartach graficznych: Wprowadzenie do GPGPU kolodziejj.info

Transcript of Wprowadzenie do GPGPU · Zastosowanie strumieniowe przetwarzanie obrazów dużych tablic w podobny...

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,

(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,

● 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,
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,

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,

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,

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,

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,

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,

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,
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,
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,

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,

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,

@ 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,

„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,

„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,

„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,

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,

„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,

„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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

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,

#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,

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,

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,
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,

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,

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,

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,

# 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,

# 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,

# 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,

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,

$ 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,

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,

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,

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,

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,
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,
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,

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,

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,

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,

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,

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,

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,

Dzięki :) Pytania?

kolodziejj.info/talks/gpgpu/