PyCUDA: GPUArray.get() возвращает недоступный массив

Я пытаюсь суммировать массив в графическом процессоре, а затем получить его обратно на хосте. Для этого я использую функцию 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 и больше ничего.

Robert Crovella 10.12.2020 18:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
395
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

функция gpuarray.sum() просто возвращает скаляр после суммирования всех элементов, как сказал @Robert Crovella. Таким образом, ваша переменная 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)

Другие вопросы по теме