【发布时间】: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