我正在编写一个用于c ++的双曲偏微分方程的软件。几乎所有符号都是矢量和矩阵符号。最重要的是,我需要线性代数求解器。是的,矢量和矩阵的大小可以有很大差异(从1000到大小只能通过分布式存储器计算来解决,例如集群或类似的架构)。如果我曾经生活在乌托邦中,那么我就已经拥有线性求解器,它可以很好地适应簇,GPU和多核。
在考虑应该代表变量的数据结构时,我来了accros the boost.ublas和MTL4。 两个库都是blas 3级兼容,MTL4实现稀疏求解器并且比ublas快得多。它们都没有实现对多核处理器的支持,更不用说分布式内存计算的并行化了。另一方面,MTL4的开发取决于2个开发人员的唯一努力(至少我理解),并且我确信ublas有一个原因在于升级库。此外,intel的mkl库包含了用ublas绑定其结构的示例。 我想将我的数据和软件绑定到数据结构中,该数据结构将坚固,开发和维护很长一段时间。
最后,问题。您对使用ublas和/或mtl4的体验如何,您会推荐什么?
感谢名单, mightydodol
答案 0 :(得分:11)
根据您的要求,我可能会选择BOOST::uBLAS。实际上,uBLAS的良好部署应该与MTL4大致相同,关于速度。
原因是bindings存在ATLAS(因此您可以为您的计算机有效地优化共享内存并行化),以及Intel Math Kernel Library或HP 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)
答案 2 :(得分:5)
对于新项目,最好远离Boost的uBlas。自2012年底以来,uBlas常见问题解答甚至出现了此警告:
问:我应该将uBLAS用于新项目吗? ... uBLAS的最后一次重大改进是在2008年,自2009年以来没有发生重大变化。...表现?有更快的选择。前沿? uBLAS已经超过10年了,并且错过了C ++ 11中的所有新内容。
答案 3 :(得分:2)
此列表中缺少一个C ++库:FLENS
免责声明:是的,这是我的宝贝
答案 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
即可