转换gsl线性代数以用于scalapack或其他并行矩阵库
converting gsl linear algebra for use in scalapack or other parallel matrix library
我有一个深深嵌入GNU科学库(GSL)矩阵算法的代码,该代码的主要计算是求解一个需要很长时间的大型线性方程组,该方程组具有GSL和BLAS函数,有没有方法将该计算并行化或将其转换为在ScaLAPACK这样的已经并行的库中使用?
如果您的矩阵是稀疏,即它包含许多零条目,那么您可以轻松地实现许多稀疏矩阵代数包,而不会遇到太多麻烦。不幸的是,这将要求您以稀疏格式存储矩阵,据我所知,gsl
无法做到这一点。一旦您以某种稀疏格式存储了矩阵,您应该能够处理大型系统,而不会遇到太多麻烦,即使是在串行应用程序中。
我建议使用UMFPACK,因为它需要最少的工作来实现,因为它不需要将数据放入它们的结构中。
关于视差的注记:如果您的代码当前是串行的,那么使用并行求解器并不是一件小事。实现多线程程序包可能很简单,但我对线程程序没有太多经验。此外,真正的并行(分布式内存)直接求解器并不那么高效,因为每个处理器都需要自己的完整矩阵副本,最好使用迭代方法。
多一点细节会很有帮助:长时间是多长?你是出于某种原因需要逆,还是只是在解一个方程组?
您试用过"英特尔MKL"吗?它包括自己的blas函数的并行版本。上次我试的时候,它们非常快。但如果你能提供矩阵大小的信息,答案也会更容易,但只要你运行的是x64,有很多CPU/内核,有很多RAM,那么,这并不重要。
另一个选择是nVidia CUDA。他们的接口类似于blas,但实际上它比MKL慢,仍然比串行快。可能是我在一张旧卡上尝试过,但你需要至少200个GPU流单元才能称其有用。
编辑:这种规模的矩阵超出了我的经验。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 在其他文件中创建类时在 c++ 项目中不起作用
- 类与私有变量的其他类之间的线程安全性
- C++17中的并行执行策略
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- GlobalAlloc而不是其他分配方法
- 并行用于C++17中数组索引范围内的循环
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 如何在Elixir中调用递归函数并行
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 当并行线程访问同一数据结构的其他成员时,正确的方法可以在Visual Studio上的OpenMP上并行循环
- 我如何使用“ op parallel”或其他方式并行循环
- GNU Radio没有来自与我自己的OOT块并行的其他块的输出
- 转换gsl线性代数以用于scalapack或其他并行矩阵库
- 在c++中,包含后增量的表达式能否与该表达式的其他部分并行执行?