ublas与矩阵模板库(MTL4)

时间:2009-07-01 07:54:02

标签: c++ math linear-algebra

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

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

最后,问题。您对使用ublas和/或mtl4的体验如何,您会推荐什么?

感谢名单, mightydodol

7 个答案:

答案 0 :(得分:11)

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

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

通过这些绑定,带有经过良好调整的ATLAS / BLAS库进行数学运算的uBLAS应该足够快。如果您链接到给定的BLAS / ATLAS,您应该与使用编译器标志observation针对同一BLAS / ATLAS链接的MTL4大致相同,并且很可能比没有BLAS的MTL4更快根据他们自己的{{{} 3}}(示例请参阅here,其中GotoBLAS优于MTL4。)

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

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

答案 1 :(得分:8)

如果你在C ++中编程向量,矩阵和线性代数,我会看看Eigen:

http://eigen.tuxfamily.org/

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

答案 2 :(得分:5)

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

问:我应该将uBLAS用于新项目吗?    ... uBLAS的最后一次重大改进是在2008年,自2009年以来没有发生重大变化。...表现?有更快的选择。前沿? uBLAS已经超过10年了,并且错过了C ++ 11中的所有新内容。

答案 3 :(得分:2)

此列表中缺少一个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。

答案 4 :(得分:1)

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

两者都是在其接口方面使用的合理库,我不认为因为uBLAS通过BOOST审核流程,它必然更强大。我有一些噩梦,有不明显的副作用和uBLAS实施的意外后果。

这并不是说uBLAS很糟糕,它确实很好,但我认为鉴于MTL目前的性能差异显而易见,使用它而不是uBLAS是值得的,尽管它可能有点风险因为它是“只有2个开发者” “支持小组。

在一天结束时,它是关于矩阵库的速度,与MTL4一起使用。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

MTL4有一个并行版本。只需查看simunova

即可