加速两个数组相乘以进行卷积

时间:2013-11-07 22:37:47

标签: convolution

我有一个应用程序,我已经对我的代码进行了一些速度分析,限制因素是两个数组的乘法。我有一个数组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;
}

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

1 个答案:

答案 0 :(得分:0)

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

(请注意,您的代码不会进行卷积。 val 仅取决于 i j ,因此每个元素都是 C 将是相同的: X J 中每对产品的总和。)