我的 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)s 的数组。但是,输出如下所示:
[(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 的问题,或者我做错了什么。
任何帮助表示赞赏。谢谢你。