【问题标题】:ublas vs. matrix template library (MTL4)ublas 与矩阵模板库 (MTL4)
【发布时间】:2010-11-07 06:11:35
【问题描述】:

我正在用 C++ 编写一个用于双曲偏微分方程的软件。几乎所有的符号都是向量和矩阵的。最重要的是,我需要线性代数求解器。是的,向量和矩阵的大小可以有很大差异(从 1000 到只能通过分布式内存计算解决的大小,例如集群或类似架构)。如果我生活在乌托邦,我就会有线性求解器,它可以很好地扩展到集群、GPU 和多核。

在考虑应该表示变量的数据结构时,我想到了 boost.ublas 和 MTL4。 这两个库都兼容 blas 3 级,MTL4 实现了稀疏求解器,并且比 ublas 快得多。它们都没有实现对多核处理器的支持,更不用说分布式内存计算的并行化了。另一方面,MTL4 的开发依赖于 2 个开发人员的单独努力(至少据我所知),我确信 ublas 存在于 boost 库中是有原因的。此外,intel 的 mkl 库包括将其结构与 ublas 绑定的示例。 我想将我的数据和软件绑定到将长期坚如磐石、开发和维护的数据结构。

最后,问题。您在使用 ublas 和/或 mtl4 方面有何经验,您会推荐什么?

谢谢, 威力多多

【问题讨论】:

  • @mightydodol:不客气。我添加了一个指向我一整天都在寻找的论文的链接。你可能会觉得很有趣。还更正了有关 ScaLAPACK 的事实错误。
  • 感谢您指出本征。 @stephan 是的,这篇论文真的很有趣。和我的问题差不多。
  • 作为评论发布,因为它不符合您的要求。我是 Armadillo (arma.sourceforge.net) 的快乐用户,它使线性代数运算变得轻而易举。它与 BLAS 和 LAPACK 接口(因此您有速度),语法简洁,并且是唯一仍在积极维护的线性代数库(除了我发现非常难以使用的boost::ublas)。它不支持(还)稀疏矩阵,所以如果你真的需要它们,请不要使用它。
  • @Alexandre Thx,我想知道犰狳与本征相比如何。乍一看,它们似乎非常相似。

标签: c++ math linear-algebra


【解决方案1】:

根据您的要求,我可能会选择BOOST::uBLAS。事实上,一个好的 uBLAS 部署在速度上应该与 MTL4 大致相当。

原因是bindings 存在ATLAS(因此您可以为您的计算机有效优化的共享内存并行化),以及供应商调整的实现,如Intel Math Kernel LibraryHP MLIB

使用这些绑定,带有经过良好调整的 ATLAS / BLAS 库的 uBLAS 应该足够快。如果您链接到给定的 BLAS/ATLAS,您应该与使用编译器标志 -DMTL_HAS_BLAS 链接到相同 BLAS/ATLAS 的 MTL4 大致相当,并且根据他们自己的 observation,很可能比没有 BLAS 的 MTL4 更快(示例见here,其中GotoBLAS 优于MTL4)。

总而言之,只要你愿意使用一些 BLAS 库,速度不应该是你的决定性因素。可用性和支持更重要。您必须决定,MTL 还是 uBLAS 更适合您。我倾向于 uBLAS,因为它是 BOOST 的一部分,而 MTL4 目前仅支持 BLAS selectively。您可能还会觉得这个有点过时的comparison of scientific C++ packages 很有趣。

一个大但是:对于您的要求(非常大的矩阵),我可能会跳过“语法糖”uBLAS 或 MTL,而直接调用 BLAS / LAPACK 的“金属”C 接口。但这只是我......另一个优点是它应该比切换到ScaLAPACK(分布式内存LAPACK,从未使用过)更容易解决更大的问题。明确一点:对于家庭问题,我不建议直接调用 BLAS 库。

【讨论】:

    【解决方案2】:

    如果您使用 C++ 编写向量、矩阵和线性代数,我会看 Eigen:

    http://eigen.tuxfamily.org/

    它比 uBLAS 更快(不确定 MTL4)和更简洁的语法。

    【讨论】:

    • Eigen 是我们使用的除 ATLAS / LAPACK 之外的唯一其他矩阵库。对于较小的矩阵(小于 100 行),它的矩阵乘法速度要快得多,并且在性能上与较大矩阵的标准 ATLAS/非供应商调整的 BLAS 相当(前提是处理器支持 SSE 指令)。然而,对于大型矩阵的高级线性代数(例如 LU 分解),它比 ATLAS / LAPACK 慢得多,并且不支持多核处理器。
    • @quant_dev:我相信这是正确的,尽管我怀疑开发人员会愿意提供帮助。我不是开发人员之一。
    • @stephan:我认为 Eigen 的开发版本正在开发 ATLAS 和其他“后端”以获得适当的功能。
    • @stephan:最新版本的 Eigen 可以链接到支持多核的英特尔 MKL 库。
    • @zhanxw:感谢您更新我的评论。 MKL 的集成(我在 stackoverflow.com/questions/2222549/… 中提到过,但忘记在此处添加)确实缓解了过去在某些用例中可能遇到的大部分性能问题。
    【解决方案3】:

    对于新项目,最好远离 Boost 的 uBlas。自 2012 年底以来,uBlas 常见问题解答甚至有此警告:

    问:我应该将 uBLAS 用于新项目吗? ... uBLAS 的最后一次重大改进是在 2008 年,自 2009 年以来没有进行任何重大更改。 ... 性能?有更快的选择。前沿? uBLAS 已有 10 多年的历史,错过了 C++11 的所有新内容。

    【讨论】:

    • 自 2013 年以来,这是有价值的信息。与这篇文章的主题完全无关的东西:我认为“替代”一词包括一种或所有可能性,例如事物、命题或行动过程(因此不需要复数形式),即替代库更快。
    【解决方案4】:

    此列表中缺少一个 C++ 库:FLENS

    http://flens.sf.net

    免责声明:是的,这是我的宝贝

    • 只是标题
    • 附带一个简单的、非性能的、通用的(即模板化的)BLAS 的 C++ 参考实现。
    • 如果可用,您可以使用优化的 BLAS 实施作为后端。在这种情况下,就像直接使用 BLAS (some Benchmark I should update)。
    • 您可以使用overloaded operators instead of calling BLAS functions
    • 它带有自己的、独立的、通用的对一堆 LAPACK 函数的重新实现。我们将此端口称为FLENS-LAPACK
    • FLENS-LAPACK 具有与 Netlib 的 LAPACK 完全相同的精度和性能。根据我的经验,(FLENS-)LAPACK+ATLAS 或 (FLENS-)LAPACK+OpenBLAS 可以提供与 ACML 或 MKL 相同的性能。
    • FLENS 对在评估线性代数表达式时创建临时向量/矩阵有不同的策略。 FLENS 政策是:永远不要创建它们!!!。但是,在special debug-mode 中,我们允许“在必要时”创建临时对象。这种“必要时”策略是其他库(如 Eigen 或 Armadillo)或 Matlab 中的默认设置。

    【讨论】:

    • 您的网站很干净,但文档很难......例如如何对对称矩阵进行特征分解?一个简短的参考表(例如 Eigen)将吸引更多用户,恕我直言。
    • 线性代数函数的概述可以在FLENS-LAPACK 下找到。但是,您是对的,这里的文档并不完整。它专注于经常需要的功能以及我已经移植到 FLENS/C++ 的功能。但是,如果本地 LAPACK 实现可用,则可以使用大多数/许多其他 LAPACK 例程。 ...我将尝试花一些额外的时间来编写并进一步扩展文档。
    【解决方案5】:

    您可以在此处直接查看性能差异: http://www.osl.iu.edu/research/mtl/mtl4/doc/performance.php3

    就其界面而言,两者都是合理的库,我不认为因为 uBLAS 通过了 BOOST 审查过程,它必然会更加强大。 uBLAS 实施带来的副作用和意想不到的后果,我都曾做过噩梦。

    这并不是说 uBLAS 很差,它真的很好,但我认为考虑到 MTL 近来在性能上的巨大差异,值得使用它而不是 uBLAS,尽管它可以说风险更大,因为它“只有 2 个开发人员” " 支持小组。

    归根结底,矩阵库是关于速度的,请使用 MTL4。

    【讨论】:

      【解决方案6】:

      根据我自己的经验,MTL4 比 uBLAS 快得多,也比 Eigen 快。

      【讨论】:

        【解决方案7】:

        有一个并行版本的 MTL4。看看simunova

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多