pycuda:gpu 中的内存分配列表

pycuda: Memory allocation in gpu for a list

我想运行一个简单的pycuda程序来更新gpu上的列表。以下是我的清单。 dm_count = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]]。 我将此列表作为输入,并希望并行更新输入列表。 当我尝试使用 mem_alloc().

在 gpu 中分配内存时,它会抛出异常

它给出属性错误,提示“'list' 对象没有属性 'nbytes'”。当我搜索答案时,有人说要以数组形式转换列表,否则无法应用 nbytes。它似乎只支持 [[1,1],[1,1],[2,4]] 格式的数组。但我不想更改列表。有什么方法可以在gpu中分配内存同时保持列表的原始格式?

我不知道 memcpy_dtoh() 是否也能正常工作。我怎样才能更正这个程序以产生预期的结果?

import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy

dm_count = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]]
length = len(dm_count)

mod = SourceModule("""
__global__ void UpdateMatrix(int **dm_count, int length)
    {
       int row = threadIdx.x + blockIdx.x*blockDim.x;
       int col = threadIdx.y + blockIdx.y*blockDim.y;
       if( (row < length) && (col< row)){
            dm_count[row][col] = 0 ; 
       }
    }
        """)


dm_gpu = cuda.mem_alloc(dm_count.nbytes)
cuda.memcpy_htod(dm_gpu, dm_count)
func = mod.get_function("updateMatrix")
func(dm_gpu, block=(length, length, 1))
result = numpy.empty_like(dm_count)
cuda.memcpy_dtoh(result, dm_gpu)
print(result)

Expected Result: result = [[0], [0, 2], [0, 0, 5], [0, 0, 0, 9]]

Error Message: Traceback (most recent call last): File "test_pycuda.py", line 55, in dm_gpu = cuda.mem_alloc(dm_count.nbytes) AttributeError: 'list' object has no attribute 'nbytes'

I want to run a simple pycuda program to update a list on the gpu

无法在 PyCUDA 中操作 python 列表。通常,PyCUDA 只能处理具有有限数据类型集的 numpy 数组,以及支持 Python buffer protocol.

的类似类型

因此,您可能会重新编写代码以使用合适数据类型的 numpy 数组作为内核的输入,尽管您必须设计一种与连续的 numpy 数组。然后您需要编写 CUDA 内核以使用您设计的格式(请注意,您当前的内核以多种方式损坏,这意味着即使列表被 PyCUDA 接受为 inout,它也不会工作)。