【发布时间】:2013-01-28 20:13:38
【问题描述】:
我的 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 的问题还是我做错了什么。
感谢任何帮助。谢谢。
【问题讨论】:
-
我对 PyOpenCL 一无所知,但在 C 语言中,
float *x; x[0]=1.0;正在为您尚未分配的内存分配值,基本上 x 没有任何意义。 -
@GradyPlayer
float3 *x是 OpenCL 中内核函数的函数头,x[i] = (float3)(1,1,1)是函数体。 -
函数头?我知道 C 语言中的 OpenCL……不知道这意味着什么。