use*_*931 5 python cuda list memcpy pycuda
我想这对于专家来说是一个相当简单的问题,但我在网上找不到任何答案。给出一个简单的案例:
问题:
listToProcess = []
for i in range(0, 10):
listToProcess.append(i)
Run Code Online (Sandbox Code Playgroud)
该列表应传输到 GPU,以进行进一步处理。然后我将继续使用常见的 cuda 程序进行内存复制:
import sys
import pycuda.autoinit
import pycuda.driver as cuda
listToProcess_gpu = cuda.mem_alloc(sys.getsizeof(listToProcess))
cuda.memcpy_htod(listToProcess_gpu, listToProcess)
Run Code Online (Sandbox Code Playgroud)
然后调用内核本身。然而列表没有缓冲区接口,因此会memcpy_htod()崩溃。我也尝试了不同的方法,但最终导致
问题
执行此操作的唯一方法是从列表中创建一个支持缓冲区协议的对象,并将该新对象传递给 PyCUDA。实际上,这可能意味着从列表中创建 numpy 或 PyCUDA 本机 GPUarray 数组并使用它:
import sys
import pycuda.autoinit
import pycuda.driver as cuda
import numpy as np
listToProcess = []
for i in range(0, 10):
listToProcess.append(i)
l2p = np.array(listToProcess, dtype=np.int32)
listToProcess_gpu = cuda.mem_alloc(l2p.nbytes)
cuda.memcpy_htod(listToProcess_gpu, l2p)
Run Code Online (Sandbox Code Playgroud)
这意味着您的列表在类型上是同质的。具有对象 dtype 的 numpy 数组将不起作用。
当然,您可以穿上一件毛衣,并使用 ctypes 来滚动您自己的具有缓冲协议支持的对象,但是鉴于 PyCUDA 本身支持的内容,这将是重新发明轮子。