Python/OpenCL: Difference between revisions

From Fundamental Ramen
Jump to navigation Jump to search
No edit summary
No edit summary
Line 1: Line 1:
= pyopencl =
= pyopencl =
== Type Mapping ==
{| class="wikitable"
! OpenCL || Numpy
|-
| float || np.float32
|-
| double || np.float64 (default)
|-
| int || np.int32
|-
| long || np.int64 (default)
|}
== To increase an array of float32. ==
== To increase an array of float32. ==
<source lang="python3">
<source lang="python3">

Revision as of 07:41, 6 June 2018

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__)