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属性获取它。

09-18 02:44