Python/OpenCL

From Fundamental Ramen
< Python
Revision as of 07:41, 6 June 2018 by Tacoball (talk | contribs)
Jump to navigation Jump to search

pyopencl

Type Mapping

OpenCL Numpy
float np.float32
double np.float64 (default)
int np.int32
long np.int64 (default)

To increase an array of float32.

import os
import numpy as np
import pyopencl as cl

# Kernel code.
CL_INC_F32 = '''
__kernel void inc_f32(__global const float *a_g, __global float *res_g)
{
  int gid = get_global_id(0);
  res_g[gid] = a_g[gid] + 1;
}
'''

# Context and Queue
os.environ['PYOPENCL_CTX'] = '0:1' # Apple > HD Graphics 4000 of Macbook Air 2012 mid
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

# Memory allocation.
mf = cl.mem_flags
in_np = np.array([1, 2, 3, 4, 5]).astype(np.float32)
in_cl = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=in_np)
out_cl = cl.Buffer(ctx, mf.WRITE_ONLY, in_np.nbytes)
out_np = np.empty_like(in_np)

# Build OpenCL kernel code.
prg = cl.Program(ctx, CL_INC_F32).build()

# Run kernel.
prg.inc_f32(queue, in_np.shape, None, in_cl, out_cl)

# Convert results into numpy format.
cl.enqueue_copy(queue, out_np, out_cl)

print(in_np)
print(out_np)

numpy

Data Types

import numpy as np

# Default int type is int64
a = np.array([1, 2, 3])
print(type(a[0]).__name__)

# Default float type is float64
b = np.array([1.0, 2.0, 3.0])
print(type(b[0]).__name__)

# Force int32
c = np.array([1, 2, 3]).astype(np.int32)
print(type(c[0]).__name__)

# Force float32
d = np.array([1.0, 2.0, 3.0]).astype(np.float32)
print(type(d[0]).__name__)