配列データの開始をマークするバッファを取得してカーネルに渡すだけの場合は、サイズを気にする必要はありません。以下は、オフセット データの先頭を指すサイズ 1 のバッファーを取得する関数です。
def data_ptr(array):
if array.offset:
return array.base_data.get_sub_region(array.offset, 1)
else:
return array.data
オフセット データの先頭へのポインターが必要な場合は、これを使用してカーネルに渡すことができます。clV
配列のサブ領域をclA
値 3 に設定する例を次に示します。 のデータのdata_ptr
先頭へのポインターを取得するために使用します。clV
import numpy as np
import pyopencl as cl
import pyopencl.array
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
m, n = 5, 5
A = np.random.uniform(size=(m, n)).astype(np.float32)
clA = cl.array.Array(queue, A.shape, A.dtype)
clA.set(A)
clV = clA[1::2, 1::2]
def data(array):
if array.offset:
return array.base_data.get_sub_region(array.offset, 1)
else:
return array.data
source = """
__kernel void fn(long si, long sj, __global float *Y)
{
const int i = get_global_id(0);
const int j = get_global_id(1);
Y[i*si + j*sj] = 3;
}
"""
kernel = cl.Program(ctx, source).build().fn
gsize = clV.shape
lsize = None
estrides = np.array(clV.strides) / clV.dtype.itemsize
kernel(queue, gsize, lsize, estrides[0], estrides[1], data_ptr(clV))
print(clA.get())