让
import pyopencl as cl
import pyopencl.array as cl_array
import numpy
a = numpy.random.rand(50000).astype(numpy.float32)
mf = cl.mem_flags
有什么区别
^{pr2}$以及
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()
是吗?在
Buffers是CL的版本}是计算设备上numpy数组的工作方式。在
malloc
,而{因此,对于问题第一部分的第二个版本,您可以编写}的情况下,PyOpenCL只看到一包字节,不能执行任何这样的操作。在
a_gpu + 2
来获得一个新数组,该数组中的每个数字都有2个加法,而在{问题的第二部分与此相反:如果您有一个PyOpenCL数组,
.get()
将数据复制回并转换为(基于主机的)numpy数组。由于numpy数组是在Python中获取连续内存的一种更方便的方法,第二个带有enqueue_copy
的变量也以numpy数组结尾,但请注意,您可以将此数据复制到任何大小的数组中(只要它足够大),并且任何类型的复制都是以字节包的形式执行的,而.get()
则确保在主机上获得相同的大小和类型。在额外的事实:当然每个PyOpenCL数组都有一个缓冲区。您可以从
.data
属性获取它。在为了回答第一个问题,
Buffer(hostbuf=...)
可以与实现buffer interface(reference)的任何东西一起调用。pyopencl.array.to_device(...)
必须用ndarray
(reference)调用。ndarray
实现缓冲区接口,并在任意位置工作。但是,只有hostbuf=...
可以与bytearray
(它也实现了缓冲区接口)一起工作。我还没有证实这一点,但这似乎是文件所建议的。在关于第二个问题,我不确定当你对它调用}的组合之间工作,可以有偏移量和区域,并且可以是异步的(使用}将阻塞并返回整个缓冲区)。(reference)
result_gpu
时,它应该是什么类型(你是说Buffer.get_host_array()
?)在任何情况下,enqueue_copy()
在Buffer
、Image
和{is_blocking=False
),我认为这些功能只有这样才可用(而{相关问题 更多 >
编程相关推荐