Social Network

Post in Rilievo

Post Recenti




Post Random

Traduzione

Italiano flagArabo flagCinese (Semplificato) flagOlandese flagInglese flagFrancese flagTedesco flagGiapponese flagCoreano flagPolacco flagPortoghese flagRusso flagSpagnolo flagTurco flag

Calendario

agosto: 2009
L M M G V S D
« lug   set »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

Archivio

Categorie

PyOpenCL e PyCUDA, accedere a OpenCL e CUDA da Python

Pubblicato: il 28 agosto 2009.       Ultima Modifica: il 28 agosto 2009.          


PyOpenCL consente di accedere alle API per il calcolo parallelo di OpenCL da Python.
La documentazione di PyOpenCL è disponibile a questa pagina. Il download è possibile da questa pagina.
Di seguito è riportato un esempio relativo all’uso di PyOpenCL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import pyopencl as cl
import numpy
import numpy.linalg as la
 
a = numpy.random.rand(50000).astype(numpy.float32)
b = numpy.random.rand(50000).astype(numpy.float32)
 
ctx = cl.create_context_from_type(cl.device_type.ALL)
queue = cl.CommandQueue(ctx)
 
mf = cl.mem_flags
a_buf = cl.create_host_buffer(
        ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, a)
b_buf = cl.create_host_buffer(
        ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, b)
dest_buf = cl.create_buffer(ctx, mf.WRITE_ONLY, b.nbytes)
 
prg = cl.create_program_with_source(ctx, """
    __kernel void sum(__global const float *a,
    __global const float *b, __global float *c)
    {
      int gid = get_global_id(0);
      c[gid] = a[gid] + b[gid];
    }
    """).build()
 
prg.sum(queue, a.shape, a_buf, b_buf, dest_buf)
 
a_plus_b = numpy.empty_like(a)
cl.enqueue_read_buffer(queue, dest_buf, a_plus_b).wait()
 
print la.norm(a_plus_b - (a+b))

PyCUDA consente di accedere alle API di CUDA da Python. La documentazione è disponibile a questa pagina, il download è possibile da questa pagina.
Di seguito è riportato un esempio relativo all’uso di PyCUDA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pycuda.autoinit
import pycuda.driver as drv
import numpy
 
from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
  const int i = threadIdx.x;
  dest[i] = a[i] * b[i];
}
""")
 
multiply_them = mod.get_function("multiply_them")
 
a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)
 
dest = numpy.zeros_like(a)
multiply_them(
        drv.Out(dest), drv.In(a), drv.In(b),
        block=(400,1,1))
 
print dest-a*b


Pubblicato nella Categoria: Programmazione, Python.
Tags: , .
Commenti



Leave a Reply


:alien: :angel: :angry: :blink: :blush: :cheerful: :cool: :cwy: :devil: :dizzy: :ermm: :face: :getlost: :biggrin: :happy: :heart: :kissing: :lol: :ninja: :pinch: :pouty: :sad: :shocked: :sick: :sideways: :silly: :sleeping: :smile: :tongue: :unsure: :w00t: :wassat: :whistle: :wink: :wub: