Python Pyopencl:to_设备和缓冲区之间的差异

Python Pyopencl:to_设备和缓冲区之间的差异,python,numpy,opencl,pyopencl,Python,Numpy,Opencl,Pyopencl,让 两者的区别是什么 import pyopencl as cl import pyopencl.array as cl_array import numpy a = numpy.random.rand(50000).astype(numpy.float32) mf = cl.mem_flags a_gpu = cl_array.to_device(self.ctx, self.queue, a) 及 ? 两者的区别是什么 import pyopencl as cl import pyope

两者的区别是什么

import pyopencl as cl
import pyopencl.array as cl_array
import numpy
a = numpy.random.rand(50000).astype(numpy.float32)
mf = cl.mem_flags
a_gpu = cl_array.to_device(self.ctx, self.queue, a)

?

两者的区别是什么

import pyopencl as cl
import pyopencl.array as cl_array
import numpy
a = numpy.random.rand(50000).astype(numpy.float32)
mf = cl.mem_flags
a_gpu = cl_array.to_device(self.ctx, self.queue, a)


要回答第一个问题,
缓冲区(hostbuf=…)
可以用实现()的任何东西调用<必须使用
ndarray
()调用code>pyopencl.array.to_设备(…)
ndarray
实现缓冲区接口并在任意位置工作。但是,只有
hostbuf=…
可以使用例如
bytearray
(它也实现了缓冲区接口)。我还没有证实这一点,但这似乎是医生们的建议


关于第二个问题,我不确定当你在上面调用
get()
时,
result\u gpu
应该是什么类型(你是说
Buffer.get\u host\u array()
?)在任何情况下,
enqueue\u copy()
Buffer
Image
host
的组合之间工作,可以有偏移量和区域,并且可以是异步的(使用
is_blocking=False
),我认为这些功能只能通过这种方式使用(而
get()
将阻塞并返回整个缓冲区)。()

缓冲区是CL版本的
malloc
,而
pyopencl.array.array
是计算设备上numpy数组的一种类似物

因此,对于问题第一部分的第二个版本,您可以编写
a_gpu+2
以获得一个新数组,该数组中的每个数字都添加了2,而在
缓冲区的情况下,PyOpenCL只能看到一包字节,无法执行任何此类操作

问题的第二部分与之相反:如果您有一个PyOpenCL数组,
.get()
将数据复制回来并将其转换为(基于主机的)numpy数组。由于numpy数组是Python中获取连续内存的更方便的方法之一,因此使用
enqueue\u copy
的第二个变体也会以numpy数组结束——但请注意,您可以将此数据复制到任何大小(只要足够大)和任何类型的数组中——复制是以字节包的形式执行的,而
.get()
确保主机上的大小和类型相同


额外的事实:每个PyOpenCL数组下面当然有一个缓冲区。您可以从
.data
属性中获取它。

我刚刚意识到您是PyOpenCL的作者。非常感谢PyOpenCL和您的回答!
result = result_gpu.get()