Python na GPU, czyli kilka słów o PyOpenCl'u
-
Upload
konrad-halas -
Category
Documents
-
view
226 -
download
0
Transcript of Python na GPU, czyli kilka słów o PyOpenCl'u
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
1/15
Grzegorz Gwardys
Python na GPU, czylikilka sw o PyOpenCl'u
Grzegorz Gwardys (C)
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
2/15
PyOpenCl = Python + OpenCl
Python wiadomka
OpenCl:
Open Computing Language, czylitaka CUDA Niewida, ale niezawona
tylko do Nvidii (lub do Windows'a jak
Direct Compute).
Grzegorz Gwardys (C)
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
3/15
Otwarto OpenCl'a
Grzegorz Gwardys (C)
Platform moe by CPU,GPU, akcelerator, lubinne diabelstwo
Andreas Klockner:http://neuralensemble.org/meetings/talks/CodeJam3_Kloeckner_PyOpenCL.pdf
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
4/15
A na co to ?
GTX 280 posiada 30 multi- procesorw,co daje okoo 30 tys. wtkw i kilka
milionw wtkw oczekujcych w kolejce.
Grzegorz Gwardys (C) Andreas Klockner:http://neuralensemble.org/meetings/talks/CodeJam3_Kloeckner_PyOpenCL.pdf
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
5/15
Gdzie ten Python ...
S bindingi do C++,Javy,Rubiego ...
Grzegorz Gwardys (C) Andreas Klockner:http://neuralensemble.org/meetings/talks/CodeJam3_Kloeckner_PyOpenCL.pdf
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
6/15
To tylko nakadka ...
Dziki tej nakadce, skracamy:
foo_kernel = clCreateKernel(program, "foo", NULL);clSetKernelArg(foo_kernel, 0, sizeof(a), &a);clSetKernelArg(foo_kernel, 1, sizeof(b), &b);clSetKernelArg(foo_kernel, 2, sizeof(c), &c);
size_t global_size[2] = {20, 16};
size_t local_size[2] = {5, 4};clEnqueueNDRangeKernel(queue, foo_kernel, 2, NULL, global_size, local_size,
0, NULL, NULL);
do:
program.foo(queue, (20, 16), (5, 4), a, b, c)
Beautiful is better than ugly ;-)
Grzegorz Gwardys (C)
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
7/15
Oprcz Zen of Python
Sprztanie (garbage collector)
Kompletne przeoenie OpenCL API
Zmapowanie bdw OpenCl'a na wyjtkiw Pythonie
Szybki, napisany w C++
Dobra dokumentacja + wiki
Licencja MIT
Grzegorz Gwardys (C)
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
8/15
Jedziemy z tym 1/3 !
import pyopencl as clfrom numpy import array,zeros, empty_like, float32
src = Tutaj jest kod kernela zapisany w modyfikacji C99, bdzie pniej}
#wczytanie danych
hyperplane, vectors, labels = read_files.read_files()
#PyOpenCl operuje na array'ach (b. zwizany z numpy)
hyperplane=array(hyperplane).astype(float32)vectors=array(vectors).astype(float32)vectors_number,dim=vectors.shapedot_product = zeros(vectors.shape[0]).astype(float32)
Grzegorz Gwardys (C)
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
9/15
Jedziemy z tym 2/3 !
#Inicjalizacjactx = cl.create_some_context()queue = cl.CommandQueue(ctx)mf= cl.mem_flags
#Tworzymy obiekty pamiciowe
vectors_buf = cl.Buffer(ctx, mf.READ_ONLY, hostbuf = vectors)hyperplane_buf = cl.Buffer(ctx, mf.READ_ONLY, hostbuf = hyperplane)dot_product_buf = cl.Buffer(ctx, mf.READ_WRITE, hostbuf = dot_product)
Grzegorz Gwardys (C)
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
10/15
Jedziemy z tym 3/3 !
#Kompilujemy
prg = cl.Program(ctx, src% {"dim": dim,"vectors_number":vectors_number}).build()
#Wykonujemy
prg.classify(queue,(dim*vectors_number,1),(dim,1),vectors_buf,hyperplane_buf,devDst_buf, dot_product_buf,cl.LocalMemory(4*dim))
#Zbieramy wyniki
dot_product_response = empty_like(dot_product)cl.enqueue_read_buffer(queue, dot_product_buf,dot_product_response ).wait()
Grzegorz Gwardys (C)
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
11/15
Wic co w tym kernelu ?
src =#define DIM %(dim)d#define VECTORS_NUMBER %(vectors_number)d#define NUM_ELEMENTS VECTORS_NUMBER*DIM
__kernel voidclassify(__global constfloat* data,__globalconstfloat*hyperplane,__globalfloat* dotProduct ,__localfloat* local_buf)
{ int iGID = get_global_id(0); int iLID = get_local_id(0); if(iGID >= NUM_ELEMENTS) return;
local_buf[iLID] = data[iGID];local_buf[iLID]=local_buf[iLID]*hyperplane[iGID%%DIM+1];
barrier (CLK_LOCAL_MEM_FENCE);
if(iGID%%DIM)return;
dotProduct[iGID/DIM]=hyperplane[0];
for(int i=0; i
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
12/15
Czy tylko obliczenia dla nudziarzy ?
Grzegorz Gwardys (C) Ofer Rosenberg:http://www.haifux.org/lectures/212/OpenCL_for_Halifux_new.pdf
P Sid P O Gl i P O Cl
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
13/15
PySide, PyOpenGl i PyOpenClbaraszkuj ...
Grzegorz Gwardys (C)
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
14/15
GPGPU maj najwikszy sens, dla duejiloci danych i duej iloci oblicze nanich wykonywanych
Zobaczymy co przyniesie hardware'owaprzyszo
C++ AMP ...
Posowie
Grzegorz Gwardys (C)
-
8/6/2019 Python na GPU, czyli kilka sw o PyOpenCl'u
15/15