14

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

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

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

谢谢,mightydodol

4

7 回答 7

11

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

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

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

综上所述,只要你愿意使用一些 BLAS 库,速度不应该是你的决定性因素。可用性和支持更重要。您必须决定,MTL 还是 uBLAS 更适合您。我倾向于 uBLAS,因为它是 BOOST 的一部分,而 MTL4 目前仅选择性地支持 BLAS 。您可能还会发现这个稍微过时的科学 C++ 包比较很有趣。

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

于 2009-07-01T09:09:56.637 回答
8

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

http://eigen.tuxfamily.org/

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

于 2009-07-01T18:57:22.957 回答
5

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

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

于 2013-08-13T12:26:06.513 回答
2

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

http://flens.sf.net

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

  • 它只是标题
  • 附带一个简单的、非性能的、通用的(即模板化的)BLAS 的 C++ 参考实现。
  • 如果可用,您可以使用优化的 BLAS 实现作为后端。在这种情况下,它就像直接使用 BLAS(我应该更新一些基准)。
  • 您可以使用重载运算符而不是调用 BLAS 函数
  • 它带有自己的、独立的、通用的对一堆 LAPACK 函数的重新实现。我们将此端口称为 FLENS-LAPACK
  • FLENS-LAPACK 与 Netlib 的 LAPACK 具有完全相同的准确性和性能。根据我的经验,(FLENS-)LAPACK+ATLAS 或 (FLENS-)LAPACK+OpenBLAS 为您提供与 ACML 或 MKL 相同的性能。
  • FLENS 对在线性代数表达式的评估中创建临时向量/矩阵有不同的政策。FLENS 政策是:永远不要创建它们!!!。但是,在特殊的调试模式中,我们允许“在必要时”创建临时对象。这种“必要时”策略是其他库(如 Eigen 或 Armadillo)或 Matlab 中的默认设置。
于 2012-09-01T13:04:43.690 回答
1

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

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

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

归根结底,它与矩阵库的速度有关,与 MTL4 一起使用。

于 2009-07-01T09:19:03.453 回答
1

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

于 2011-09-11T19:54:08.473 回答
0

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

于 2011-03-11T17:10:40.707 回答