如何使用PyCUDA处理Python列表?

5
我猜对于专家来说这是一个相当简单的问题,但我在网络上找不到任何答案。给出一个简单的案例:
问题:
listToProcess = []
for i in range(0, 10):
    listToProcess.append(i)

这个列表将被传输到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)

然后调用内核本身。然而,列表没有缓冲区接口,因此memcpy_htod()会崩溃。我也尝试了不同的方法,但最终都导致了以下问题: 问题
  • 如何将包含内容的列表从Python程序传输到GPU内核?
  • 如何为内核指定列表的数据类型(例如浮点数、整数等)?
1个回答

1
唯一的方法是从列表中创建支持缓冲协议的对象,并将该新对象传递给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的numpy数组无法工作。
当然,你可以戴上毛衣,使用ctypes自己编写支持缓冲区协议的对象,但考虑到PyCUDA本身的支持,这将是重复造轮子。

如果在Python中传输浮点数列表,请使用dtype=np.float32,在CUDA/Kernel端请使用float*。否则,格式不正确,您将无法将实际值分配给数组。 - user3085931

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接