我正在用c++编写双曲偏微分方程的软件。几乎所有符号都是 vector 和矩阵符号。最重要的是,我需要线性代数求解器。是的, vector 和矩阵的大小可以相差很大(从1000到只有分布式内存计算(例如,群集或类似体系结构)才能解决的大小)。如果我住在乌托邦,那我将拥有线性求解器,该求解器非常适合集群,GPU和多核。
在考虑应该代表变量的数据结构时,我提到了boost.ublas和MTL4。
这两个库都兼容blas 3级,MTL4实现了稀疏求解器,并且比ublas快得多。他们俩都没有实现对多核处理器的支持,更不用说分布式内存计算的并行化了。另一方面,MTL4的开发取决于2位开发人员(至少据我了解)的唯一努力,并且我确定ublas位于boost库中是有原因的。此外,intel的mkl库包含将其结构与ublas绑定(bind)的示例。
我想将我的数据和软件绑定(bind)到坚固,长期开发和维护的数据结构。
最后是问题。您对ublas和/或mtl4的使用有什么经验,您会推荐什么?
谢谢
威多多
最佳答案
根据您的要求,我可能会选择BOOST::uBLAS。确实,在速度方面,良好的uBLAS部署应与MTL4大致相当。
原因是存在bindings的ATLAS(因此可以为计算机有效优化的共享内存并行化),以及诸如Intel Math Kernel Library或HP MLIB之类的供应商优化的实现。
通过这些绑定(bind),具有经过良好调整的ATLAS/BLAS库进行数学运算的uBLAS应该足够快。如果链接到给定的BLAS/ATLAS,则应该使用编译器标记 -DMTL_HAS_BLAS
与链接到同一BLAS/ATLAS的MTL4大致相同,并且根据其自己的observation,最有可能比没有BLAS的MTL4更快(根据示例here,请参见GotoBLAS,其中selectively胜过MTL4)。
综上所述,只要您愿意使用某些BLAS库,速度就不是决定性因素。可用性和支持更为重要。您必须决定是MTL还是uBLAS更适合您。我倾向于uBLAS,因为它是BOOST的一部分,并且MTL4当前仅支持BLAS comparison of scientific C++ packages。您可能还会发现此过时的ScaLAPACK很有趣。
一个大的BUT:出于您的要求(非常大的矩阵),我可能会跳过“语法糖” uBLAS或MTL,而直接调用BLAS/LAPACK的“金属” C接口(interface)。但这只是我...另一个优点是,对于更大的问题,它比切换到ojit_a(分布式内存LAPACK,从未使用过)要容易得多。只是要清楚:对于家庭问题,我不建议直接调用BLAS库。
关于c++ - ublas与矩阵模板库(MTL4),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1067821/