Matlab 求解大型(n>;1000000)线性方程组

Matlab 求解大型(n>;1000000)线性方程组,matlab,large-data,inverse,finite-element-analysis,Matlab,Large Data,Inverse,Finite Element Analysis,我已在以下问题上达到极限: 作为FEA代码的一部分(在MATLAB中),我需要找到x,x=A\b。A和b分别是稀疏、复、双精度矩阵和向量。A的大小是(n,n)和b的大小是(n,1),其中n是850000,可以增加到2000000。此外,A是对称的,大部分是对角的 我有两个HPC集群供我使用,一个有5.7TB的RAM,另一个有1.5TB(但更快的内核)。从技术上讲,我可以按原样解决系统,只需等待大约15天。但是,我需要执行求解方程组的操作,每次模拟的次数最多为10倍。因此,15天的时间是不可接受

我已在以下问题上达到极限:

作为FEA代码的一部分(在MATLAB中),我需要找到x,x=A\bAb分别是稀疏、复、双精度矩阵和向量。A的大小是(n,n)和b的大小是(n,1),其中n是850000,可以增加到2000000。此外,A是对称的,大部分是对角的

我有两个HPC集群供我使用,一个有5.7TB的RAM,另一个有1.5TB(但更快的内核)。从技术上讲,我可以按原样解决系统,只需等待大约15天。但是,我需要执行求解方程组的操作,每次模拟的次数最多为10倍。因此,15天的时间是不可接受的

我尝试了迭代方法,但是这些方法并没有产生与反斜杠操作符相同的结果。在某些情况下,也没有收敛

我已将x=A\b部分转换为mexa64格式,以潜在地减少时间。然而,我担心这仍然需要几天的时间

对如何解决这个问题有什么建议吗?是否有任何商业代码可以更快/更有效地完成这项工作?当一个模型有超过1m个节点时,商业FEA软件包如何解决这个问题

非常感谢您的帮助!
提前谢谢

稀疏矩阵计算本身就是一个很大的领域。你们唯一能做的就是更具体地描述它,并使用一个更可定制的解决方案,因为Matlab不允许你们这样做,并查看它的源代码,看看你们是否能做任何改进。据我所知,求解稀疏线性系统主要有两种方法,直接法和迭代法。每种类型都有许多算法。例如,Cholesky分解具有非常好的性能和较低的内存使用率,但仅适用于SPD(对称正定)矩阵。其他方法有LU、LDL、QR等。每种方法都满足特定的矩阵类型来求解

Matlab在幕后也使用了这些方法之一(不确定,但我在某处读到它在
A/b
操作符下面使用了SuiteSpase代码)。根据矩阵的类型(无论是
对称正定
还是
非对称
等),您需要选择一种模式(我指的是迭代模式或直接模式)。我认为直接法更适合这样大的系统(因为舍入误差)。此外,也有基于GPU的解算器可用于直接法和迭代法以及高度并行化,但可能不适用于矩阵分解本身超过8GB的大问题

您应该执行的步骤:

  • 确定矩阵的类型(SPD、对称或通用)
  • 为您选择最佳的直接法矩阵
  • 找到一个可以处理此类因式分解的免费或商业软件包(例如
    Eigen
    Intel MKL
    suitespare
    ),并优化代码以支持并行计算
  • <> LI>让你的手有点脏,写一个非常小的程序,从文件中取矩阵<代码> A/code >和vector <代码> B/code >,并使用代码包中的一个,用C++代码(它们准备使用示例代码)查找 x/code >
另外,请记住,每种方法和程序包都可以在开始计算之前改变矩阵的顺序,选择好的顺序会对速度甚至精度产生很大影响

这个链接也应该很有趣:

还有两本关于稀疏矩阵的书:

  • Sergio Pissanetzky的稀疏矩阵技术
  • Timothy A.Davis的稀疏线性系统的直接方法

如果你的矩阵是厄米特矩阵(Aij=Aji*)并且是正定的,那么共轭梯度法就不会出错。如果你有一个右手边并且保证收敛,那么这几乎总是最快的方法。此外,这允许您使用猜测解决方案(例如,来自上一时间步),这可能是有益的。虽然解决方案不同于直接分解(它怎么可能没有无数的系数),但它可能没有那么大的不同

如果它实际上是一个对称的复矩阵(Aij=Aji),那么这很奇怪,但可能仍然比一般的复矩阵好。在这两种情况下,尝试使用只需要传递矩阵一半的例程(我认为matlab不支持此功能)。这将把你的内存使用量减少一半,可能会让事情变得更快(移动16GB的数字要比移动8GB慢)


最后,我找不到关于Matlab是否支持英特尔MKL Inspector执行器稀疏BLAS例程的答案。根据我的经验,在瓶颈中使用MKL总是可以提高性能。这是一个封闭的源代码,您不知道其中发生了什么——可能是神奇的。

一旦达到这个级别,您需要特定于问题的代码来加速。通常,大规模问题不会将矩阵
A
存储在内存中,这会带来极大的速度提升。这是因为可以动态计算操作
A*x
和'A^t*b'。e、 我制作了一个层析成像工具箱,可以动态计算这些操作,这意味着不需要内存,矩阵存储解决方案的加速速度超过1000。但它只适用于特定类型的断层扫描。你需要发现,对于你的案例,顺便说一句,matlabs
A\b
在引擎盖下使用了高度加速的代码,我怀疑你能比MATLAB给出的更快,使用同样的方法你需要解几个方程组。
A
矩阵是否可能对其中一些人通用?可以使用的任何结构或限制?除此之外,我同意安德的观点:在求解线性系统方面,似乎很难超越Matlab的速度。矩阵A是对称的,而且大多是直径