关于可用的快速C ++矩阵库的建议?


158

是否有人对可用的快速C ++矩阵库有建议?

我的意思是以下内容:

  • 矩阵对象具有直观的界面(例如:建立索引时可以使用行和列)
  • 我可以使用LAPACK和BLAS做的矩阵类做任何事情
  • 易于学习和使用的API
  • 在Linux上安装相对容易(我现在使用Ubuntu 11.04)

对我而言,可用性比现在的速度或内存使用率更为重要,以避免过早的优化。在编写代码时,我总是可以使用一维数组(或STL向量)和适当的索引或指针算法来模拟矩阵,但我最好不要这样做,以免出现错误。我还想将精力集中在要解决的实际问题上,并编程到问题域中,而不是用有限的注意力来记住我以前将矩阵模拟为数组的所有编程技巧。 ,并记住LAPACK命令等等。另外,我必须编写的代码越少,标准化程度越高,效果越好。

稀疏还是稀疏无关紧要;我正在处理的某些矩阵将是稀疏的,但不是全部。但是,如果特定的程序包可以很好地处理密集或稀疏矩阵,则值得一提。

模板对我来说也没有太大关系,因为我将使用标准数字类型,并且不需要存储双精度,浮点型或整数型的东西。很好,但是对于我想做的事情不是必需的。


1
是否可以使用CUDA?
活动挂图

1
以后可能会。我现在对CUDA不再感兴趣,因为我正在为应用程序构建库,矩阵乘法是我最不关心的问题。大部分工作将花费在调用混合整数线性程序求解器上,因此使用CUDA会显得过大。完成我的论文后,我打算研究线性代数繁重且以优化为中心的算法。但是,如果您有CUDA库的经验,我绝对鼓励您发布有关CUDA库的信息,因为我确信其他人也会有兴趣了解您的想法。
Geoff Oxberry

英特尔MKL和IPP呢?
罗伊2014年

Answers:


146

到目前为止,我已经从在线研究中收集了以下内容:

我稍微使用了Armadillo,发现界面足够直观,并且很容易找到Ubuntu的二进制包(并且我假设使用其他Linux发行版)。我还没有从源头上编译它,但是我希望它不会太困难。它符合我的大多数设计标准,并使用密集的线性代数。它可以调用LAPACK或MKL例程。通常不需要编译Armadillo,它是一个纯粹基于模板的库:您只需包含标头并链接到BLAS / LAPACK或MKL等。

我听说过关于Eigen的好事,但是还没有使用过。它声称是快速的,使用模板,并支持密集的线性代数。它没有LAPACK或BLAS作为依赖项,但是似乎能够完成LAPACK可以做的所有事情(加上LAPACK不能做的一些事情)。许多项目使用Eigen,这很有希望。它具有适用于Ubuntu的二进制程序包,但作为仅标头的库,在其他地方使用也很简单。

矩阵模板库版本4也看起来很有希望,并使用模板。它支持稠密和稀疏线性代数,并且可以将UMFPACK称为稀疏求解器。这些功能在他们的网站上还不清楚。它具有Ubuntu的二进制程序包,可从其网站下载。

由Argonne国家实验室的团队编写的PETSc可以访问稀疏和密集的线性求解器,因此我假设它可以用作矩阵库。我认为它是用C编写的,但是具有C ++绑定(即使没有,从C ++调用C也没问题)。该文档非常详尽。该软件包对于我现在想做的事情(矩阵乘法和建立混合整数线性程序的索引)有点过大了,但是将来可能对我或其他有不同需求的人有用比我好

Trilinos,由一组在Sandia国家实验室写入,提供面向对象的C ++接口通过其Epetra部件密集和稀疏矩阵,并通过其Tpetra部件密集和稀疏矩阵模板化接口。它还具有提供线性求解器和本征求解器功能的组件。该文档似乎不像PETSc那样精美或突出。Trilinos看起来像PETSc的Sandia类似物。PETSc可以调用某些Trilinos解算器。Trilinos的二进制文件可用于Linux。

Blitz是具有Linux二进制文件的C ++面向对象库。它似乎没有得到积极维护(2012-06-29:昨天刚刚发布了一个新版本!),尽管邮件列表处于活动状态,所以有一些社区正在使用它。它似乎并没有像BLAS那样在数值线性代数方面做得太多,并且看起来像一个密集的矩阵库。它使用模板。

Boost :: uBLAS是一个C ++面向对象的库,是Boost项目的一部分。它支持模板化和密集的数值线性代数。我听说这不是特别快。

模板数值工具包是由NIST开发的C ++面向对象的库。它的作者Roldan Pozo似乎偶尔会贡献补丁,但是它似乎不再处于活跃状态(最新更新是2010年)。它专注于稠密的线性代数,并提供一些基本矩阵分解和特征值求解器的接口。

由Jack Poulson开发的Elemental是一种分布式存储器(并行)密集线性代数软件包,以类似于FLAME的样式编写。有关该项目的功能和背景的列表,请参阅他的文档。FLAME本身具有一个用于顺序和共享内存的密集线性代数的相关库,称为libflame,它似乎是用面向对象的C语言编写的。Libflame看起来很像LAPACK,但是在算法上有更好的表示法以进行快速数值运算线性代数库更多地是一门科学,而更少的是一门妖术。

可以将其他库添加到列表中。如果我们将稀疏线性代数包算作 “矩阵库”,我在C语言中所知最好的免费套件SuiteSparse,它是面向对象风格的。我用过SuiteSparse,发现拿起来很容易。它依赖BLAS和LAPACK来将稀疏问题分解为许多小的,密集的线性代数子问题的算法。该软件包的主要作者蒂姆·戴维斯(Tim Davis)非常乐于助人,是个非常有才华的人。

哈威尔子程序库是著名的稀疏线性代数程序,并且可用于学术用户,但你必须要经过填表和接收电子邮件为要下载的每个文件的过程。由于子例程通常具有依赖性,因此使用一个求解器可能需要下载五个或六个文件,并且该过程可能会变得有些乏味,特别是因为表单批准不是即时的。

还有其他稀疏的线性代数求解器,但据我所知,MUMPS和其他软件包主要集中在线性系统的求解上,而现在解决线性系统是我最不关心的问题。(也许以后,我将需要该功能,并且对其他人可能很有用。)


2
我认为您已经将Eigen与Elemental混淆了;尽管我对该项目印象深刻,但我还没有从事Eigen的工作。Elemental主要针对分布式内存计算机。
杰克·普尔森

3
我想我的第一个问题是:您是否想并行运行任何内容?
Matt Knepley 2011年

1
我应该提到Trilinos ...尽管这里并没有太多的知名度,但它是PETSc的可行替代方案,具有模板化矩阵程序包,本征求解器和稀疏矩阵求解器,但它也有一个程序包意思是专门用于抽象出算法的簿记,尽管我不知道它的效果如何。
Andrew Spott

1
Eigen看起来很棒-我的一位同事在专业环境下使用它,它可以使您足够快地启动并运行,而不会牺牲性能。
2011年

7
我还将在您的答案中添加以下库:ViennaCL-基于OpenCL的C ++头库,可以连接到Eigen和MTL。 PLASMA -的BLAS和LAPACK库设有瓷砖的分解的基于UTK-重新设计。 MAGMA –另一个UTK项目,致力于改善LAPACK / BLAS性能。
阿隆·艾玛迪亚

24

该文档于2009年3月编写,旨在帮助为科学图书馆选择线性代数图书馆。它评估了几个库的可移植性,高级接口和许可,其中包括Eigen,GSL,Lapack ++ MTL,PETSc,Trilinos和uBlas。似乎特别喜欢FlensSeldon。(要求之一是必须支持C ++模板和稀疏矩阵。)


17

在上面列出的所有项目中,实际上只有两个非常广泛使用的重量级(并且有充分的理由):PETSc和Trilinos。两者都是专业开发的,拥有庞大的开发人员基础。与其他两个项目相比,所有其他项目都是相当小的项目,我建议与他们一起进行,因为(i)它们将在很长一段时间内得到支持,并且(ii)它们可能已经具有您将需要的所有功能线性代数(最重要的是)。


4
PETSc的功能只不过是ScaLAPACK和PLAPACK的抽象接口。如果Geoff对便利的稠密线性代数感兴趣,那么我认为PETSc是过大的(我对Trilinos的稠密能力
不了解太多,

@AronAhmadia:至此,我认为答案已经转变为更多的社区Wiki资源,这就是为什么我一直在评论者的要求下添加软件包的原因。
Geoff Oxberry

3
@WolfgangBangerth:我认为提到设计目标很重要。如果目标是编写一款经久耐用并且打算供他人使用的软件,并且线性代数是该软件的组成部分,那么PETSc和Trilinos是不错的选择。但是,在某些情况下,更轻量级的选项是更可取和有用的,因为它们具有更简单的API,并且可以用更少的代码行完成几乎相同的任务。最后,选择偏见在代码的生存中起作用。如果没有人使用较小的代码,那么它们将不会持续或建立像PETSc和Trilinos这样的基础。
Geoff Oxberry

1
除了Geoff所说的以外,PETSc和Trilinos的绝大多数功能来自外部库的包装器。说没有人可以直接使用上述外部库,这对我来说很奇怪。
杰克·普尔森

1
@JackPoulson:我实际上支持我的评论。是的,PETSc包装了很多单独的包装。但这是通过统一的界面实现的,因此,一次学习该过程比学习每个软件包的命名约定和样式的特殊性要简单得多。换句话说,虽然每个单独的项目都可以很好地使用包装好的程序包,但是每次通过PETSc使用它们都会产生协同作用。
Wolfgang Bangerth'1

11

如果你想

  • 具有直观界面的矩阵类
  • 所有LAPACK和BLAS功能
  • 易于学习和使用的API
  • 易于安装

然后,我建议您看看我的图书馆FLENS。我正是为这类任务设计的。但是,它需要一个符合C ++ 11的编译器(例如gcc 4.7或clang)。

FLENS为您提供与基础BLAS实现完全相同的性能。 有一些(相当古老的)基准显示了这一点

如果使用相同的BLAS实现,那么对于FLENS-LAPACK来说,它可以提供与Netlib的LAPACK完全相同的性能。

关于新基准,让我更详细地介绍...

不久前,我问了Clint Whaley(ATLAS的作者),他对在Eigen网站上发布的基准测试有何看法。他只是证实了我的怀疑,这些基准很可能不可靠。同时,Clint提出了一些其他实现的基准。可以在ATLAS网站和Eigen邮件列表中找到详细信息。这些基准没有很好地显示在图表中,但是它们表明ATLAS总是比本征快40%。这与Eigen站点的基准相矛盾,但可以确定其他基准(例如blaze-lib的基准)。

注意,对于密集的数值线性代数,矩阵矩阵乘积最相关。我个人并不关心Eigen还是ATLAS更快。如果Eigen比ATLAS快,那么我将Eigen用作BLAS后端。

免责声明:是的,FLENS是我的宝贝!这意味着我编写了大约95%的代码,每一行代码都值得:-)


嗨,迈克尔,欢迎来到scicomp。您的网址对我不起作用,您的服务器出问题了吗?
阿隆·艾玛迪亚

感谢您的提示。该URL是正确的,但似乎我们的数学服务器在文件服务器上遇到了问题。就在周末准时...
Michael Lehn

1
好的,我刚刚从当前的git repo创建了新文档,并将其复制到另一台服务器上:apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
Michael Lehn



1

什么是处理小尺寸矩阵的最佳矩阵库,例如在组装有限元矩阵,执行张量运算等时通常使用的矩阵。

我已经在使用PETSc来解决我的应用程序中出现的大型稀疏线性系统的问题,但是我目前正在使用自己的简单库来处理这些矩阵/向量...我正在考虑迁移到更快的库像上面提到的那些。

搭配PETSc的最佳选择是什么?本征?犰狳?BOOST :: uBlas?MTL4?我使用了BOOST的一些东西,因此,首先,我想到了使用BOOST :: uBlas的方法,但是并没有太多的文档,示例等等。


2
我强烈建议您不要使用uBlas,因为众所周知,它比优化的BLAS例程要慢一个数量级。由于巧妙的模板技巧,我认为Eigen对于非常小的矩阵来说最为耀眼。
Jack Poulson'1

1
这对于单独的问题可能更好。我知道Eigen,MTL4和Armadillo都有解决小尺寸系统的技巧,但是我认为您正在要求如何组装矩阵,对此我并不知道。我通常逐个元素地组装矩阵。我不确定所提到的任何库是否适合与PETSc耦合;我还不是PETSc用户。不过,我赞同杰克关于Boost :: uBlas的评论,因为它很慢。
Geoff Oxberry 2012年


0

到目前为止,没有人惊讶地提到TooN。现在已经愉快地使用了将近3年。

它与本非常相似,尽管不全面。但是我认为它在某些方面具有更好的语法。

它还带有类,这些类基于Lie组(二维和3维的特殊欧几里得/正交等)和相关的Lie代数,帮助建模在Graphics和Vision中经常遇到的常见变换。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.