使用分而治之的矩阵乘法

时间:2017-07-01 07:49:33

标签: c algorithm matrix matrix-multiplication

问题在于速度非常慢,速度很慢,即使是在小n下,例如:当n = 1024时,一定有什么问题,有人吗?

每当函数调用时我都没有创建新的矩阵C,我将新结果添加到先前的结果中,当基本情况发生时,该结果存储在原始矩阵C中。

int **matA,**matB,**matC;

    void matmul_div_rec(int Arow,int Acol,int Brow,int Bcol,int n) {
        if(n==1)
        {
            matC[Arow][Bcol]+=matA[Arow][Acol]*matB[Brow][Bcol];
        }
        else
        {
            matmul_div_rec(Arow+0,Acol+0,Brow+0,Bcol+0,n/2);
            matmul_div_rec(Arow+0,Acol+n/2,Brow+n/2,Bcol+0,n/2);
            matmul_div_rec(Arow+0,Acol+0,Brow+0,Bcol+n/2,n/2);
            matmul_div_rec(Arow+0,Acol+n/2,Brow+n/2,Bcol+n/2,n/2);
            matmul_div_rec(Arow+n/2,Acol+0,Brow+0,Bcol+0,n/2);
            matmul_div_rec(Arow+n/2,Acol+n/2,Brow+n/2,Bcol+0,n/2);
            matmul_div_rec(Arow+n/2,Acol+0,Brow+0,Bcol+n/2,n/2);
            matmul_div_rec(Arow+n/2,Acol+n/2,Brow+n/2,Bcol+n/2,n/2);
        }
        return; }
int main()
{
    matmul_div_rec(0,0,0,0,n); //n must be the power of 2

}

1 个答案:

答案 0 :(得分:0)

正如在this论文中简要讨论的那样,Strassen算法的实现(即使它是正确的)只有在使用其他一些想法时才具有竞争性。这些包括例如使用所谓的Morton order布局用于存储器中的矩阵存储以获得更简单的方式来解决子矩阵并通过更好的存储器局部性改善缓存行为。此外,通过在递归的基本情况下使用SIMD来进行矩阵加法的并行化,可以进行改进。