pycuda:gpu中的内存分配列表

时间:2019-07-05 17:29:07

标签: python arraylist gpu pycuda

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

它给出了属性错误,表明“'列表'对象没有属性'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)
  

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

     

错误信息:追溯(最近一次呼叫最近):文件   第55行中的“ test_pycuda.py”       dm_gpu = cuda.mem_alloc(dm_count.nbytes)   AttributeError:“列表”对象没有属性“ nbytes”

1 个答案:

答案 0 :(得分:0)

  

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

在PyCUDA中无法操作python列表。通常,PyCUDA只能处理具有有限dtypes和支持Python buffer protocol的相似类型的numpy数组。

结果是,尽管您必须设计与连续的numpy兼容的锯齿状数组的表示形式,但您可能会重新编写代码以使用适当dtype的numpy数组作为内核的输入。数组。然后,您需要编写CUDA内核以使用您设计的格式(请注意,当前内核已通过多种方式破坏,即使PyCUDA接受该列表作为输入,也无法使用)。