You are on page 1of 15

Python na GPU, czyli kilka sw o PyOpenCl'u

Grzegorz Gwardys

Grzegorz Gwardys (C)

PyOpenCl = Python + OpenCl


Python wiadomka OpenCl:
Open Computing Language, czyli taka CUDA Niewida, ale niezawona tylko do Nvidii (lub do Windows'a jak Direct Compute).

Grzegorz Gwardys (C)

Otwarto OpenCl'a

Platform moe by CPU, GPU, akcelerator, lub inne diabelstwo


Grzegorz Gwardys (C)
Andreas Klockner: http://neuralensemble.org/meetings/talks/CodeJam3_Kloeckner_PyOpenCL.pdf

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

Gdzie ten Python ...

S bindingi do C++,Javy, Rubiego ...


Grzegorz Gwardys (C)
Andreas Klockner: http://neuralensemble.org/meetings/talks/CodeJam3_Kloeckner_PyOpenCL.pdf

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)

Oprcz Zen of Python

Sprztanie (garbage collector) Kompletne przeoenie OpenCL API Zmapowanie bdw OpenCl'a na wyjtki w Pythonie Szybki, napisany w C++ Dobra dokumentacja + wiki Licencja MIT

Grzegorz Gwardys (C)

Jedziemy z tym 1/3 !


import pyopencl as cl from 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.shape dot_product = zeros(vectors.shape[0]).astype(float32)

Grzegorz Gwardys (C)

Jedziemy z tym 2/3 !


#Inicjalizacja ctx = 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)

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)

Wic co w tym kernelu ?


src = #define DIM %(dim)d #define VECTORS_NUMBER %(vectors_number)d #define NUM_ELEMENTS VECTORS_NUMBER*DIM __kernel void classify(__global const float* data,__global const float* hyperplane,__global float* dotProduct , __local float* 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<DIM;++i) dotProduct[iGID/DIM]=dotProduct[iGID/DIM]+ local_buf[i];
Grzegorz Gwardys (C)

Czy tylko obliczenia dla nudziarzy ?

Grzegorz Gwardys (C)

Ofer Rosenberg: http://www.haifux.org/lectures/212/OpenCL_for_Halifux_new.pdf

PySide, PyOpenGl i PyOpenCl baraszkuj ...

Grzegorz Gwardys (C)

Posowie
GPGPU maj najwikszy sens, dla duej iloci danych i duej iloci oblicze na nich wykonywanych Zobaczymy co przyniesie hardware'owa przyszo C++ AMP ...

Grzegorz Gwardys (C)

Dzikuj za uwag !

Grzegorz Gwardys (C)

You might also like