如何使用 PyCUDA 处理 python 列表?

How to handle a python list with PyCUDA?

我想这对专家来说是一个相当简单的问题,但我在网上找不到任何答案。给定一个简单的案例:

问题:

listToProcess = []
for i in range(0, 10):
    listToProcess.append(i)

此列表应传输到 GPU,以供进一步处理。然后我会继续使用常见的 cuda 程序进行 mem-copy:

import sys
import pycuda.autoinit
import pycuda.driver as cuda

listToProcess_gpu = cuda.mem_alloc(sys.getsizeof(listToProcess))
cuda.memcpy_htod(listToProcess_gpu, listToProcess)

然后调用内核本身。但是列表没有 buffer 接口,所以 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)

这意味着您的列表在类型方面是同类的。 dtype 为 object 的 numpy 数组将不起作用。

当然,您可以穿上毛衣并使用 ctypes 滚动您自己的带有缓冲协议支持的对象,但考虑到 PyCUDA 本身支持的内容,这将是重新发明轮子。