【问题标题】:pycuda: Memory allocation in gpu for a listpycuda:gpu 中用于列表的内存分配
【发布时间】:2019-11-16 07:58:02
【问题描述】:

我想运行一个简单的 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)

预期结果:result = [[0], [0, 2], [0, 0, 5], [0, 0, 0, 9]]

错误消息:回溯(最近一次调用最后一次):文件 “test_pycuda.py”,第 55 行,在 dm_gpu = cuda.mem_alloc(dm_count.nbytes) AttributeError: 'list' 对象没有属性 'nbytes'

【问题讨论】:

    标签: python arraylist gpu pycuda


    【解决方案1】:

    我想运行一个简单的 pycuda 程序来更新 gpu 上的列表

    在 PyCUDA 中无法操作 python 列表。一般来说,PyCUDA 只能处理具有有限 dtype 集的 numpy 数组,以及支持Python buffer protocol 的类似类型。

    因此,您可能会重新编写代码以使用合适 dtype 的 numpy 数组作为内核的输入,尽管您必须设计与连续 numpy 兼容的锯齿状数组的表示大批。然后,您需要编写 CUDA 内核以使用您设计的格式(请注意,您当前的内核在许多方面都被破坏了,这意味着即使该列表被 PyCUDA 接受为 inout 也无法正常工作)。

    【讨论】:

    • @talonomies 谢谢,我将它转换为一个 numpy 数组,现在它可以正常工作了。
    猜你喜欢
    • 2021-08-19
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多