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()