什么是矩阵运算的优秀C ++库

时间:2010-12-30 11:32:34

标签: c++ optimization matrix

我需要对矩阵进行乘法运算。我正在寻找一个可以快速完成的库。我正在使用Visual C ++ 2008编译器,我有一个核心i7 860,所以如果库已针对我的配置进行了优化,那么它就是完美的。

8 个答案:

答案 0 :(得分:7)

FWIW,Eigen 3对矩阵产品使用线程(OpenMP)(回复上面关于Eigen不使用线程的声明)。

答案 1 :(得分:6)

BLAS是所有基本线性代数运算的事实上的Fortran标准(基本上是矩阵和向量的乘法)。有许多实现可用。例如:

  • ATLAS是免费的,据说是自我优化的。你需要自己编译它。
  • Goto BLAS由Kazushige Goto在TACC维护。他非常擅长从现代处理器中获得最后一个性能。它仅供学术使用。
  • 英特尔MKL为英特尔处理器提供优化的BLAS。即使是学术用途,它也不是免费的。

然后,您可能想要使用C ++包装器,例如boost::ublas

如果您在分布式系统上进行编程,则可以使用PBLAS和ScaLAPACK,以便为分布式线性代数运算使用消息传递。在多核机器上,通常BLAS(至少是英特尔MKL)的实现使用线程来获得足够大的矩阵。

如果你想要更高级的线性代数例程(特征值,线性系统,最小二乘......),那么还有另一个事实上的Fortran标准LAPACK。据我所知,除了调用简单的Fortran例程之外,没有什么可以优雅地与C ++集成。您必须编写一些包装器来隐藏Fortran调用并提供声音类型检查实现。

答案 2 :(得分:5)

查看Eigen。它应该拥有你所需要的一切。

答案 3 :(得分:3)

我对Boost的uBLAS有很好的经验。如果您已经在使用Boost,这是一个不错的选择。

答案 4 :(得分:1)

您可以使用GNU Scientific Library(GSL)

这是一个描述库中可用矩阵运算的页面,包括乘法(gsl_matrix_mul_elements()):

http://www.gnu.org/software/gsl/manual/html_node/Matrix-operations.html

以下是一些链接,可帮助您开始在Visual Studio中使用GSL:

http://gladman.plushost.co.uk/oldsite/computing/gnu_scientific_library.php

http://www.quantcode.com/modules/smartfaq/faq.php?faqid=33

答案 5 :(得分:1)

它不能与科学图书馆竞争,但使用visual c ++就可以了。

#include <windows.h>
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;

int main()
{
    ULONG_PTR gpToken = 0;
    GdiplusStartup(&gpToken, &GdiplusStartupInput(), NULL);
    //lib inited

    Matrix A;
    A.Translate(10,20);

    Matrix B;
    B.Rotate(35.0);

    A.Multiply(&B);
    if (A.IsInvertible())
        A.Invert();
    if (!A.IsIdentity())
        A.RotateAt(120.0, PointF(10,10));

    //getting values
    REAL elements[6];
    A.GetElements(elements);

    //lib stopped
    GdiplusShutdown(gpToken);
    return 0;
}

因此,您可以轻松地获取矩阵乘法障碍(在Windows上)

GdiPlus Matrix Documentation

答案 6 :(得分:0)

对于更新版本的Visual Studio,您可以使用ScaLapack + MKL。 我们提供了一些代码示例here,以及如何使其运行的教程。

http://code.msdn.microsoft.com/Using-ScaLAPACK-on-Windows-d16a5e76#content

答案 7 :(得分:-1)

有一个选项可以自己实现,也许使用std :: valarray因为可以使用OpenMP进行并行化:gcc当然有这样的版本,MSVC ++也可能会这样做。

否则,以下技巧:其中一个矩阵应该被转置。然后你有:

AB [i,j] = Sum(k)A [i,k] B ^ t [j,k]

您正在扫描连续的内存。如果你有8个核心,你可以很容易地将[i,j]索引的集合划分为8,并给每个核心提供总工作的1/8。为了使速度更快,您可以使用向量乘法指令,大多数编译器将为此提供特殊功能。结果不会像调优的库一样快,但应该没问题。

如果您正在进行更长时间的计算,例如多项式求值,那么同时具有线程支持(gak,两种线程)的线程评估器也会做得很好,即使它不会进行低级别调整。如果你真的想快速做事,你必须使用像Atlas这样经过适当调整的库,但是如果你认真对待HPC,你可能不会运行Windows。