Pyopencl:to-tu设备与Bu的区别

2024-05-17 05:43:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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

是吗?在


Tags: importselfpyopenclnumpygpuqueueclas
2条回答

Buffers是CL的版本malloc,而{}是计算设备上numpy数组的工作方式。在

因此,对于问题第一部分的第二个版本,您可以编写a_gpu + 2来获得一个新数组,该数组中的每个数字都有2个加法,而在{}的情况下,PyOpenCL只看到一包字节,不能执行任何这样的操作。在

问题的第二部分与此相反:如果您有一个PyOpenCL数组,.get()将数据复制回并转换为(基于主机的)numpy数组。由于numpy数组是在Python中获取连续内存的一种更方便的方法,第二个带有enqueue_copy的变量也以numpy数组结尾,但请注意,您可以将此数据复制到任何大小的数组中(只要它足够大),并且任何类型的复制都是以字节包的形式执行的,而.get()则确保在主机上获得相同的大小和类型。在

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

为了回答第一个问题,Buffer(hostbuf=...)可以与实现buffer interfacereference)的任何东西一起调用。pyopencl.array.to_device(...)必须用ndarrayreference)调用。ndarray实现缓冲区接口,并在任意位置工作。但是,只有hostbuf=...可以与bytearray(它也实现了缓冲区接口)一起工作。我还没有证实这一点,但这似乎是文件所建议的。在

关于第二个问题,我不确定当你对它调用result_gpu时,它应该是什么类型(你是说Buffer.get_host_array()?)在任何情况下,enqueue_copy()BufferImage和{}的组合之间工作,可以有偏移量和区域,并且可以是异步的(使用is_blocking=False),我认为这些功能只有这样才可用(而{}将阻塞并返回整个缓冲区)。(reference

相关问题 更多 >