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