我想感受一下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
答案 0 :(得分:1)
您的错误在于numpy数组类型的模糊性,导致在CPU和CL设备方面沿数组元素的步幅不一致
指定arr.append([0, 1, 2, 3, 4])
模棱两可,并假定使用8字节的dtype=int
或np.int64
元素。
对于long
,CL设备端的匹配类型应为long *a_in
。
如果要使用4字节整数,请在CPU端指定np.int64
,在CL设备端指定dtype=np.int32
。
要点:总是清楚地指定您的numpy数组类型,例如int *a_in
。并在CL设备端检查精确匹配。