如何优化矩阵乘法运算

8

我需要在我的应用程序中执行许多矩阵操作,其中最耗时的是矩阵乘法。我是这样实现它的:

template<typename T>
Matrix<T> Matrix<T>::operator * (Matrix& matrix)
{


    Matrix<T> multipliedMatrix = Matrix<T>(this->rows,matrix.GetColumns(),0);

    for (int i=0;i<this->rows;i++)
    {
        for (int j=0;j<matrix.GetColumns();j++)
        {
            multipliedMatrix.datavector.at(i).at(j) = 0;
            for (int k=0;k<this->columns ;k++)
            {
                multipliedMatrix.datavector.at(i).at(j) +=  datavector.at(i).at(k) * matrix.datavector.at(k).at(j);
            }
            //cout<<(*multipliedMatrix)[i][j]<<endl;
        }
    }
    return multipliedMatrix;
}

有没有更好的方法来进行矩阵乘法?目前,在我的应用程序中,矩阵乘法操作占据了大部分时间。也许有很好/快的库来完成这种工作?但是我不能使用使用图形卡进行数学运算的库,因为我使用带有集成图形卡的笔记本电脑。


2
一般来说,如果您需要高效地完成一个相当标准的任务,您应该寻找一个做得很好的库。这些库是由通常比您更了解操作的人编写的,并且他们可以投入比您更多的时间使其更加高效。 - David Thornley
这些是密集矩阵吗?如果不是(在许多应用中您有稀疏矩阵),这个简单的算法将浪费大量时间乘以零。当然,为了有效地处理稀疏矩阵,您需要完全改变数据存储的方式。 - leftaroundabout
请查看Blaze库,它非常擅长处理矩阵乘法,并提供易于使用的语法。 - Engineero
5个回答

7

Eigen可以说是目前最快的线性代数库之一,甚至可能是最快的。它编写良好,质量高。此外,它使用表达式模板,使得编写更易读的代码。最新发布的版本3使用OpenMP进行数据并行处理。

#include <iostream>
#include <Eigen/Dense>

using Eigen::MatrixXd;

int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;
}

4

Boost uBLAS我认为绝对是解决这类问题的最佳方式。Boost经过精心设计,经过严格测试,并在许多应用程序中使用。


3
与其他可用选项(Eigen、CUBLAS、MKL)相比,Boost uBLAS 的性能很糟糕。特别是Eigen集成了许多Boost uBLAS所使用的概念,并且可以针对各种CPU体系结构发出SIMD指令。 - void-pointer

2
考虑使用GNU Scientific Library或MV++。如果您可以接受C语言,BLAS是一个低级库,它包含了C和C-wrapped FORTRAN指令,并且被许多高级数学库广泛使用。我不知道这个,但另一个选择可能是Meschach,它似乎有相当不错的性能。关于您不想使用使用图形卡的库的评论,我要指出,在许多情况下,使用图形卡的库是标准(非GPU)库的专业实现。例如,各种BLAS的实现在其维基百科页面上列出,只有一些是设计用于利用您的GPU的。

1

有一本书叫做《算法导论》。你可能想看看动态规划这一章节。它使用动态规划实现了一个优秀的矩阵乘法算法。值得一读。好吧,这些信息是为了让你在不使用库的情况下编写自己的逻辑。


0

有很多高效矩阵乘法算法。

高效矩阵乘法算法

看看这些算法,找到一个实现。

你也可以为它编写一个多线程实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接