PyCUDA:GPUArray.get() 返回不可访问的数组

Posted

技术标签:

【中文标题】PyCUDA:GPUArray.get() 返回不可访问的数组【英文标题】:PyCUDA: GPUArray.get() returns inaccessible array 【发布时间】:2021-03-21 20:38:13 【问题描述】:

我正在尝试对 GPU 中的一个数组求和,然后在主机上获取它。为此,我使用了pycuda.gpuarray.sum() 函数。

import pycuda.gpuarray
a = np.array([1,2,3,4,5])
b = gpuarray.to_gpu(a)
c = gpuarray.sum(b)
c = c.get()
print(c)   #Prints array(15)
print(type(c)) #Prints numpy.ndarray
print(c[0]) #Error, Index error - too many indices for array
print(c.shape) #Prints (), empty tuple

如何将sum() 函数的解作为普通整数元素返回?

【问题讨论】:

在我的特定 pycuda 安装中,当我 print(c) 我得到 15 而不是其他任何东西。 【参考方案1】:

正如@Robert Crovella 所说,函数 gpuarray.sum() 只是在对所有元素求和后返回一个标量。因此,您的变量 c 将始终被初始化为一个 0 维 numpy 数组(换句话说,一个标量),这就是为什么当您尝试访问其中的元素时会得到空元组作为输出和错误的原因。

如果您希望这是一个一维数组,您可以这样做:

import pycuda.autoinit
import pycuda.gpuarray as gpuarray
import numpy as np

a = np.array([1,2,3,4,5])
d_a = gpuarray.to_gpu(a)
d_c = gpuarray.sum(d_a)

h_d = np.zeros((1,))
h_d[0] = d_c.get()
print("np.array h_d: ", h_d)
print("h_d[0] = ", h_d[0])

(PyCuda 2020.1)

【讨论】:

以上是关于PyCUDA:GPUArray.get() 返回不可访问的数组的主要内容,如果未能解决你的问题,请参考以下文章

Pycuda 在函数参数中按值声明数组时返回错误

pycuda - memcpy_dtoh,没有给出似乎已设置的内容

如何在 pyCUDA 内核中生成随机数?

在 pyCuda 内核中生成单个随机数

[pycuda]win10安装完毕pycuda安装完毕后测试代码

PyCuda - 使用 *.cubin - 未找到命名符号