次のようにopenclで累積合計を実装しようとしました:
__kernel void cumsum(__global float *a)
{
int gid = get_global_id(0);
int n = get_global_size(0);
for (int i = 1; i < n; i <<= 1)
if (gid & i)
a[gid] += a[(gid & -i) - 1];
}
pyopencl を使用してこのコードを呼び出しました。
import pyopencl as cl
import pyopencl.array as cl_array
import numpy as np
a = np.random.rand(50000).astype(np.float32)
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
a_dev = cl_array.to_device(queue, a)
with open("imm/cluster.cl", 'r') as f:
prg = cl.Program(ctx, f.read()).build()
prg.cumsum(queue, a.shape, None, a_dev.data)
print(np.cumsum(a)[:33], a_dev[:33])
ただし、最初の 32 個の数字は正しく、その後は間違っています (低すぎます)。これはワークグループのサイズと関係がありますか? これを修正するにはどうすればよいですか?