在下面的代码中,我有一个NumPy的简单for循环,希望将其替换为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
行,这取决于输入数组的某些预先计算得出的结果)在for循环的下一次迭代中对其进行更新。
此外,a
和b
的大小约为1亿个元素,而变量b_mean
或b_stddev
则是均值和标准的滑动窗口窗口长度等于ith
的{{1}}窗口的偏差。
因此,如果m
和b = [1, 3, 5, 7, 9]
,则:
m = 3
用CuPy替换for循环以便可以在GPU上运行的最佳方法是什么?
对于将代码移植到CuPy以便我可以利用GPU CUDA计算的任何帮助,我将不胜感激。