В приведенном ниже коде у меня есть простой цикл for с NumPy, который я хотел бы заменить реализацией CuPy.
import numpy as np
b = np.array([9,8100,-60,7], dtype=np.float64)
a = np.array([584,-11,23,79,1001,0,-19], dtype=np.float64)
m = 3
n = b.shape[0]
l = n-m+1
k = a.shape[0]-m+1
QT = np.array([-85224., 181461., 580047., 8108811., 10149.])
QT_first = QT.copy()
out = [None] * l
for i in range(1, l):
QT[1:] = QT[:k-1] - b[i-1]*a[:k-1] + b[i-1+m]*a[-(k-1):]
QT[0] = QT_first[i]
# The next line is not the REAL calculation below but a proxy
# Use QT above to do something with the ith element of array x.
# As i updates in each iteration, QT changes.
out[i] = np.argmin((QT + b_mean[i] * m) / (b_stddev[i] * m * a_stddev))
return out
В моей реальной функции длинавходные массивы a
и b
могут быть переменными и очень длинными.Обратите внимание, что QT
зависит от m
и длины b
, и оба будут предоставлены всегда.Кроме того, можно было бы порекомендовать сделать какую-то традиционную свертку, но свертка не решает мою проблему.Свертывание дает мне только окончательные значения QT
, но мне действительно нужно использовать промежуточные значения QT
для другого вычисления (см. Строку argmin
, которая зависит от некоторых предварительно вычисленных вычислений входных массивов) перед обновлением для следующей итерациидля цикла.
Кроме того, размеры a
и b
имеют длину около 1-100 миллионов элементов, а такие переменные, как b_mean
или b_stddev
, представляют собой скользящие окна для среднего и стандартного отклонения, соответственно, дляокно ith
с длиной окна, равной m
.
Итак, если b = [1, 3, 5, 7, 9]
и m = 3
, то:
b_mean[0] = 3 # (1+3+5)/3
b_mean[1] = 5 # (3+5+7)/3
b_mean[2] = 7 # (5+7+9)/3
Каков наилучший способ заменитьс CuPy, чтобы его можно было запускать на графическом процессоре?
Я был бы очень признателен за любую помощь в переносе этого кода на CuPy, чтобы можно было использовать вычисления GPU CUDA.