我想运行一个简单的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”
答案 0 :(得分:0)
我想运行一个简单的pycuda程序来更新gpu上的列表
在PyCUDA中无法操作python列表。通常,PyCUDA只能处理具有有限dtypes和支持Python buffer protocol的相似类型的numpy数组。
结果是,尽管您必须设计与连续的numpy兼容的锯齿状数组的表示形式,但您可能会重新编写代码以使用适当dtype的numpy数组作为内核的输入。数组。然后,您需要编写CUDA内核以使用您设计的格式(请注意,当前内核已通过多种方式破坏,即使PyCUDA接受该列表作为输入,也无法使用)。