PyOpenCL内核未应用于整个阵列

时间:2018-11-19 00:08:22

标签: python-3.x opencl pyopencl

我想感受一下PyOpenCL随附的Elementwise演示,并决定尝试一下:

FlowManager.getDatabase().isDatabaseIntegrityOk

我希望打印出来

from __future__ import absolute_import
from __future__ import print_function
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 = 6

a_gpu = cl.array.to_device(queue,
numpy.arange(1, n, dtype=int))

update_a = ElementwiseKernel(ctx,
"int *a",
"a[i] = 2*a[i]",
"update_a")

print(a_gpu.get())
update_a(a_gpu)
print(a_gpu.get())

但是我反而得到了

[1 2 3 4 5]
[2 4 6 8 10]

此外,当我尝试将“ i”值存储到数组中以查看发生了什么时,我得到了一些非常奇怪的值。它们无处不在,甚至有些消极。

我已经尝试了一段时间了,但是没有。有人可以解释为什么会这样吗?谢谢。

相关信息:PyOpenCL版本:2018.2.1,Python版本:3.6.5,操作系统:macOS 10.14.1

1 个答案:

答案 0 :(得分:1)

您的错误在于numpy数组类型的模糊性,导致在CPU和CL设备方面沿数组元素的步幅不一致

指定arr.append([0, 1, 2, 3, 4])模棱两可,并假定使用8字节的dtype=intnp.int64元素。 对于long,CL设备端的匹配类型应为long *a_in

如果要使用4字节整数,请在CPU端指定np.int64,在CL设​​备端指定dtype=np.int32

要点:总是清楚地指定您的numpy数组类型,例如int *a_in并在CL设备端检查精确匹配。