Statistiques
| Révision :

root / ETSN / MySteps.py @ 278

Historique | Voir | Annoter | Télécharger (957 octet)

1 268 equemene
#!/usr/bin/env python3
2 268 equemene
3 268 equemene
import numpy as np
4 268 equemene
import pyopencl as cl
5 268 equemene
6 268 equemene
a_np = np.random.rand(50000).astype(np.float32)
7 268 equemene
b_np = np.random.rand(50000).astype(np.float32)
8 268 equemene
9 268 equemene
ctx = cl.create_some_context()
10 268 equemene
queue = cl.CommandQueue(ctx)
11 268 equemene
12 268 equemene
mf = cl.mem_flags
13 268 equemene
a_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_np)
14 268 equemene
b_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b_np)
15 268 equemene
16 268 equemene
prg = cl.Program(ctx, """
17 268 equemene
__kernel void sum(
18 268 equemene
    __global const float *a_g, __global const float *b_g, __global float *res_g)
19 268 equemene
{
20 268 equemene
  int gid = get_global_id(0);
21 268 equemene
  res_g[gid] = a_g[gid] + b_g[gid];
22 268 equemene
}
23 268 equemene
""").build()
24 268 equemene
25 268 equemene
res_g = cl.Buffer(ctx, mf.WRITE_ONLY, a_np.nbytes)
26 268 equemene
knl = prg.sum  # Use this Kernel object for repeated calls
27 268 equemene
knl(queue, a_np.shape, None, a_g, b_g, res_g)
28 268 equemene
29 268 equemene
res_np = np.empty_like(a_np)
30 268 equemene
cl.enqueue_copy(queue, res_np, res_g)
31 268 equemene
32 268 equemene
# Check on CPU with Numpy:
33 268 equemene
print(res_np - (a_np + b_np))
34 268 equemene
print(np.linalg.norm(res_np - (a_np + b_np)))
35 268 equemene
assert np.allclose(res_np, a_np + b_np)