如何使用 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()
崩溃了。我也尝试了不同的方法,但最终导致
问题
- 如何将列表及其内容从 python 程序传输到 GPU 内核?
- 如何为内核指定列表的数据类型(即浮点数列表、整数列表或...)?
唯一的方法是从列表中创建一个支持缓冲区协议的对象,并将该新对象传递给 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 本身支持的内容,这将是重新发明轮子。
我想这对专家来说是一个相当简单的问题,但我在网上找不到任何答案。给定一个简单的案例:
问题:
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()
崩溃了。我也尝试了不同的方法,但最终导致
问题
- 如何将列表及其内容从 python 程序传输到 GPU 内核?
- 如何为内核指定列表的数据类型(即浮点数列表、整数列表或...)?
唯一的方法是从列表中创建一个支持缓冲区协议的对象,并将该新对象传递给 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 本身支持的内容,这将是重新发明轮子。