PyOpenCL 内核未应用于整个阵列
PyOpenCL kernel not being applied to entire array
我想感受一下 PyOpenCL 附带的 Elementwise 演示,并决定尝试一下:
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]
但我得到了
[1 2 3 4 5]
[2 4 6 4 5] .
此外,当我尝试将 "i" 值存储到数组中以查看发生了什么时,我得到了一些非常奇怪的值。他们到处都是,有些甚至是负面的。
一段时间以来,我一直在努力理解这一点,但做不到。有人可以解释为什么会这样吗?谢谢。
相关信息:PyOpenCL版本:2018.2.1,Python版本:3.6.5,OS:macOS10.14.1
您的错误在于 numpy 数组类型的模糊性,这导致 CPU 与 CL 设备端
上数组元素的步幅不一致
指定 dtype=int
是不明确的,并假定 8 字节 np.int64
或 long
元素。
CL 设备端的匹配类型应该是 long *a_in
for np.int64
。
如果您想坚持使用 4 字节整数,请在 CPU 端指定 dtype=np.int32
,在 CL 设备端指定 int *a_in
。
要点:始终明确指定您的 numpy 数组类型,例如 dtype=np.int64
。 并在 CL 设备端检查精确匹配。
我想感受一下 PyOpenCL 附带的 Elementwise 演示,并决定尝试一下:
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]
但我得到了
[1 2 3 4 5]
[2 4 6 4 5] .
此外,当我尝试将 "i" 值存储到数组中以查看发生了什么时,我得到了一些非常奇怪的值。他们到处都是,有些甚至是负面的。
一段时间以来,我一直在努力理解这一点,但做不到。有人可以解释为什么会这样吗?谢谢。
相关信息:PyOpenCL版本:2018.2.1,Python版本:3.6.5,OS:macOS10.14.1
您的错误在于 numpy 数组类型的模糊性,这导致 CPU 与 CL 设备端
上数组元素的步幅不一致指定 dtype=int
是不明确的,并假定 8 字节 np.int64
或 long
元素。
CL 设备端的匹配类型应该是 long *a_in
for np.int64
。
如果您想坚持使用 4 字节整数,请在 CPU 端指定 dtype=np.int32
,在 CL 设备端指定 int *a_in
。
要点:始终明确指定您的 numpy 数组类型,例如 dtype=np.int64
。 并在 CL 设备端检查精确匹配。