让
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.Buffer(self.ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a)
和
a_gpu = cl_array.to_device(self.ctx, self.queue, a)
?
和之间有什么区别
result = numpy.empty_like(a)
cl.enqueue_copy(self.queue, result, result_gpu)
和
result = result_gpu.get()
?
最佳答案
缓冲区是CL的malloc
版本,而pyopencl.array.Array
类似于计算设备上的numpy数组。
因此,对于问题的第一部分的第二个版本,您可以编写a_gpu + 2
来获得一个新数组,该数组在数组中的每个数字上都添加了2个,而对于Buffer
,PyOpenCL仅看到一袋字节,而不能执行任何此类操作。
问题的第二部分则相反:如果您有PyOpenCL数组,.get()
将数据复制回去,并将其转换为(基于主机的)numpy数组。由于numpy数组是在Python中获取连续内存的更方便的方法之一,因此带有enqueue_copy
的第二个变体也以numpy数组结尾-但请注意,您可以将此数据复制到任何大小的数组中(只要(因为它足够大)和任何类型-副本以一包字节的形式执行,而.get()
可确保您在主机上获得相同的大小和类型。
奖励事实:每个PyOpenCL数组下面都有一个Buffer。您可以从.data
属性获取它。