Я пытаюсь суммировать массив в графическом процессоре, а затем получить его обратно на хосте. Для этого я использую функцию 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()
в виде обычного целочисленного элемента?
функция 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)
В моей конкретной установке pycuda, когда я
print(c)
я получаю15
и больше ничего.