如何使用 PyCUDA 处理 python 列表?

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()崩溃。我也尝试了不同的方法,但最终导致

问题

  • 如何将列表及其内容从 python 程序传输到 GPU 内核?
  • 如何为内核指定列表的数据类型(即浮点数、整数或...的列表)?

tal*_*ies 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)
Run Code Online (Sandbox Code Playgroud)

这意味着您的列表在类型上是同质的。具有对象 dtype 的 numpy 数组将不起作用。

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