我有一个应用程序,我已经对我的代码进行了一些速度分析,限制因素是两个数组的乘法。我有一个数组X如下(在我的真实代码中它是一个2000个元素长而不是15个):
a b c d e f g h i j k l m n o
和第二个数组Y(在我的实际代码中,它是300个元素长而不是6个),如下所示:
A B C D E F
然后我按如下方式将数组相乘以创建一个新数组C:
value 1 A*a+B*b+C*c+D*d+E*e+F*f
value 2 A*b+B*c+C*d+D*e+E*f+F*g
value 3 A*c+B*d+C*e+D*f+E*g+F*h
value 4 A*d+B*e+C*f+D*g+E*h+F*i
value 5 A*e+B*f+C*g+D*h+E*i+F*j
value 6 A*f+B*g+C*h+D*i+E*j+F*k
value 7 A*g+B*h+C*i+D*j+E*k+F*l
value 8 A*h+B*i+C*j+D*k+E*l+F*m
value 9 A*i+B*j+C*k+D*l+E*m+F*n
value 10 A*j+B*k+C*l+D*m+E*n+F*o
我想知道是否有办法加速这段代码。我目前只使用代码:
for (int l=0; l<X.length; l++) {
val=0;
for (int i=0; i<X.length; i++)
for (int j=0; j<J.length; j++)
val+=X[i]*Y[j];
C[l]=val;
}
我虽然可以使用傅立叶变换,但它比乘以它更慢。
答案 0 :(得分:0)
我建议使用BLAS实现,这是用于执行基本矢量/矩阵操作的事实上的标准科学库。可能有一个高度优化的BLAS版本可供您选择的架构,使用SIMD指令(如果有的话)并负责管道饱和以实现最大吞吐量。 例如:OS X和iOS在Accelerate.framework中附带了BLAS实现。
(请注意,您的代码不会进行卷积。 val 仅取决于 i 和 j ,因此每个元素都是 C 将是相同的: X 和 J 中每对产品的总和。)