10.1. ElementwiseKernel

ElementwiseKernelは一言でいえばお手軽カーネルツールです。引数や処理ロジックをC言語で記述しますが、それ以外はPythonのインターフェースをとるため、とっつきやすいかもしれません。

class pyopencl.elementwise.ElementwiseKernel(
    context,
    arguments, #(1)
    operation, #(2)
    name="kernel",
    preamble="",
    options=[])

(1)

引数を指定。(C99準拠)

(2)

演算ロジックを指定。添字は常にiとなります。(C99準拠)

参考までに実装例を以下に掲載します。

import numpy as np
import pyopencl as cl
import pyopencl.array as clarr
import warnings
from pyopencl.elementwise import ElementwiseKernel

import os
os.environ['PYOPENCL_COMPILER_OUTPUT'] = '1'

a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).astype(np.float32)
b = np.array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1]).astype(np.float32)

platforms = cl.get_platforms()
ctx = cl.Context([platforms[0].get_devices(cl.device_type.GPU)[0]])
queue = cl.CommandQueue(ctx)

a_mem = clarr.to_device(queue, a)
b_mem = clarr.to_device(queue, b)

multiply = ElementwiseKernel(
    ctx,
    "float* a, float* b, float* out", #(1)
    "out[i] = a[i] * b[i]", #(2)
    "multiply") #(3)

out_mem = clarr.empty_like(a_mem)
multiply(a_mem, b_mem, out_mem)

print(out_mem)

(1)

arguments(引数)を宣言します。C99に準拠したOpenCL-C言語で記述します。

(2)

Map処理を指定します。C99に準拠したOpenCL-C言語で記述します。

(3)

カーネル関数の名前を指定します。(Cの名前空間で固有であれば何でも構いません。)

出力. 

/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/komatsu/PycharmProjects/MyPythonProject/CLElementWiseKernelTest.py
[ 10.  18.  24.  28.  30.  30.  28.  24.  18.  10.]

Copyright 2018-2019, by Masaki Komatsu