我正在写在C ++双曲型偏微分方程软件。 几乎所有的符号表示向量和矩阵的。 最重要的是,我需要的线性代数求解。 是的,向量的和矩阵的尺寸可以显着改变(比如从1000到只能由分布式存储器计算来解决尺寸,例如。簇或类似的体系结构)。 如果我生活在乌托邦,我曾经有过它可以扩展伟大的集群,GPU和多核线性解算器。
在考虑中的数据结构应该代表变量,我来到accros的boost.ublas和MTL4。 这两个库是布拉斯级别3兼容,MTL4实现稀疏求解器,比的uBLAS快得多。 他们都没有已经实现支持多核处理器,何况分布式的内存计算的并行化。 在另一方面,MTL4的发展取决于2个开发者唯一的工作(至少我的理解),我敢肯定是有原因的uBLAS库是Boost库。 此外,英特尔的MKL库包括与uBLAS库结合其结构的例子。 我想我的数据和软件绑定到数据结构,将稳如磐石,开发和维护的时间长的时间。
最后,问题。 什么是与使用的uBLAS和/或MTL4你的经验,并且你会推荐什么?
感谢名单,mightydodol
随着你的要求,我可能会去BOOST :: uBLAS库 。 的确,uBLAS库调配好应大致与有关的速度MTL4相提并论。
其原因是存在绑定的ATLAS (你可以有效地优化您的计算机,因此共享内存并行),以及供应商的调整实现,如英特尔数学核心函数库或HP MLIB 。
凭借这些绑定,具有良好的调节ATLAS / BLAS库的uBLAS做数学应足够快。 如果你对一个给定的BLAS / ATLAS链接,你应该大致与MTL4反对使用编译器标志相同的BLAS / ATLAS联相提并论-DMTL_HAS_BLAS
根据自己的,而且很可能比MTL4快没有BLAS 观测 (例如看这里其中GotoBLAS优于MTL4)。
综上所述,速度不应该是你的决定性因素,只要你愿意使用一些BLAS库。 可用性和支持更为重要。 你必须决定,MTL或uBLAS库是否更适合你。 我倾向于uBLAS库因为它是BOOST的一部分,MTL4目前仅支持BLAS 选择 。 您可能还觉得这有点过时的科学的C ++封装比较有趣。
一个大,但:您的要求(非常大的矩阵),我可能会跳过“语法糖”的uBLAS或MTL,并直接调用BLAS / LAPACK的“金属” C接口。 但是,这只是我...另一个优点是,它应该是更容易比切换到的ScaLAPACK (分布式的内存LAPACK,从未用过它)的更大的问题。 只是要清楚:房屋保持的问题,我不建议直接调用BLAS库。
如果你在C ++编程向量,矩阵和线性代数,我想看看征:
http://eigen.tuxfamily.org/
它比的uBLAS(不知道MTL4)和更简洁的语法更快。
对于新的项目,它可能是最好远离Boost的uBLAS库了。 该FAQ uBLAS库甚至有自2012年底这样的警告:
问:我应该使用新项目的uBLAS? ... uBLAS库的最后一个主要的改进是在2008年和2009年以来...性能没有显著变化承诺? 有更快的替代品。 前沿? uBLAS库超过10岁,错过了所有新的东西从C ++ 11。
:您可以直接在这里看到的性能差异http://www.osl.iu.edu/research/mtl/mtl4/doc/performance.php3
两者都是在它们的接口方面使用合理的图书馆,我不认为因为uBLAS库通过BOOST审查过程中得到了它一定的方式更加稳健。 我有我有不明显的副作用和的uBLAS实现意想不到的后果噩梦的份额。
这并不是说的uBLAS是不好的,这是真的很不错,但我认为给出的戏剧表演不同的MTL这些天,这是值得用它代替的uBLAS即使它可以说是更危险的监守它是一个有点“只有2个开发者”支持组。
在一天结束的时候,它是关于一个矩阵库速度,去MTL4。
从我自己的经验,MTL4比的uBLAS快得多,它也快于征。
文章来源: ublas vs. matrix template library (MTL4)