私の pyopencl プログラムは奇妙な動作をしており、opencl カーネルから不正確な値を受け取っていると考えました。
次の例を考えます。
import pyopencl as cl
import pyopencl.array as cl_array
import numpy
from pyopencl.elementwise import ElementwiseKernel
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
n = 20
kernel = ElementwiseKernel(ctx,
"float3 *x",
"x[i] = (float3)(1,1,1)",
"assign")
x = numpy.empty(n, dtype=cl_array.vec.float3)
x_gpu = cl_array.to_device(queue, x)
kernel(x_gpu)
print x_gpu.get()
(1, 1, 1) でいっぱいの配列を返すことを期待しています。ただし、出力は次のようになります。
[(1.0, 1.0, 1.0) (0.0, 1.0, 1.0) (1.0, 0.0, 1.0) (1.0, 1.0, 0.0)
(1.0, 1.0, 1.0) (0.0, 1.0, 1.0) (1.0, 0.0, 1.0) (1.0, 1.0, 0.0)
(1.0, 1.0, 1.0) (0.0, 1.0, 1.0) (1.0, 0.0, 1.0) (1.0, 1.0, 0.0)
(1.0, 1.0, 1.0) (0.0, 1.0, 1.0) (1.0, 0.0, 1.0) (1.0, 1.0, 0.0)
(1.0, 1.0, 1.0) (0.0, 1.0, 1.0) (1.0, 0.0, 1.0) (1.0, 1.0, 0.0)]
またはこのように
[(1.0, 1.0, 1.0) (4.588972210970911e-41, 1.0, 1.0)
(1.0, 4.203895392974451e-45, 1.0) (1.0, 1.0, 1.3592595103950726e-43)
(1.0, 1.0, 1.0) (0.0, 1.0, 1.0) (1.0, 0.0, 1.0) (1.0, 1.0, 0.0)
(1.0, 1.0, 1.0) (1.401298464324817e-45, 1.0, 1.0)
(1.0, 2.0795269210580285e-42, 1.0) (1.0, 1.0, 0.0) (1.0, 1.0, 1.0)
(0.0, 1.0, 1.0) (1.0, 0.0, 1.0) (1.0, 1.0, 1.401298464324817e-45)
(1.0, 1.0, 1.0) (4.792440747990874e-43, 1.0, 1.0) (1.0, 0.0, 1.0)
(1.0, 1.0, 0.0)]
これが OpenCL の問題なのか、PyOpenCL の問題なのか、それとも私がひどく間違ったことをしているのかはわかりません。
どんな助けでも大歓迎です。ありがとうございました。