转换gsl线性代数以用于scalapack或其他并行矩阵库

时间:2012-02-21 22:15:43

标签: c++ gsl scalapack

我有一个深度嵌入GNU科学库(GSL)矩阵算法的代码,这个代码的主要计算是求解一个大型的线性方程组,需要很长时间的串行和GSL和BLAS函数,有吗一种并行化这种计算或将其转换为在已经并行的库中使用的方法,如ScaLAPACK?

2 个答案:

答案 0 :(得分:2)

如果矩阵稀疏,即它包含大量零条目,那么您可以轻松实现许多稀疏矩阵代数包而不会有太多麻烦。不幸的是,这将要求您以稀疏格式存储矩阵,据我所知,gsl不能这样做。一旦你的矩阵以稀疏格式存储,你应该能够处理大型系统而不会有太多麻烦,即使在串行应用程序中也是如此。

我建议使用UMFPACK,因为它需要的工作量最少,因为它不需要您将数据放入其结构中。

关于平行的说明 如果您的代码当前是串行的,那么转到并行求解器并非易事。实现多线程包可能很简单,但我对线程程序没有多少经验。此外,真正的并行(分布式存储器)直接求解器并不是那么有效,因为每个处理器都需要自己的完整矩阵副本,并且最好使用迭代方法。

更多细节会有所帮助:需要多长时间?你是否出于某种原因需要逆,或者你只是求解方程组?

答案 1 :(得分:1)

您是否尝试过英特尔MKL?它包括自己的并行版本的blas函数。上次我试过,它们非常快。但是如果你给出矩阵大小的信息也会更容易回答,但是只要你运行x64,很多CPU /内核和大量内存,那么它就没关系了。

另一种选择是nVidia CUDA。它们的界面类似于blas,但它实际上比MKL慢,仍然比串行更快。可能是我在旧卡上尝试过,但你需要至少200个GPU流单元来调用它。

编辑:这些尺寸的矩阵超出了我的经验。