Python na GPU, czyli kilka słów o PyOpenCl'u

download Python na GPU, czyli kilka słów o PyOpenCl'u

of 15

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