0

我有一个应用程序,我对我的代码进行了一些速度分析,限制因素是两个数组的乘法。我有一个数组 X 如下(在我的真实代码中,它是一个 2000 个元素长而不是 15 个):

abcdefghijklmno

和第二个数组 Y(在我的真实代码中它是 300 个元素长而不是 6 个),如下所示:

ABCDEF

然后我按如下方式将数组相乘以创建一个新数组 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;
}

我虽然可以使用傅立叶变换,但它比乘以它要慢。

4

1 回答 1

0

我建议使用 BLAS 实现,它是用于执行基本向量/矩阵运算的事实上的标准科学库。可能有一个高度优化的 BLAS 版本可供您选择的架构使用,使用 SIMD 指令(如果有的话)并处理流水线饱和以实现最大吞吐量。例如:OS X 和 iOS 在 Accelerate.framework 中附带了 BLAS 实现。

(另请注意,您的代码不进行卷积。val仅取决于ij,因此C的每个元素都是相同的:来自XJ的每对产品的总和。)

于 2013-11-07T22:53:23.290 回答