我希望能够解决C#中的大型稀疏线性方程组(dim = 1,000,000)。为此,我在MKL提供程序中使用Math.NET Numerics。
我创建了以下测试程序来检查Math.NET Numerics的性能,但是,即使对于int dim = 5000;
,该程序也花费了很长时间甚至无法等待运行结束。另外,我的计算机的CPU使用率不会超过25%(计算机具有4个内核)。
将MKL与Fortran结合使用,可以更快地解决大型系统(dim = 1,000,000)的问题(CPU使用率接近100%)。我正在使用直接稀疏解算器(DSS)接口例程。
using MathNet.Numerics;
using MathNet.Numerics.LinearAlgebra;
namespace ConsoleApp1
{
class Program
{
static void Main()
{
Control.UseNativeMKL();
Control.UseMultiThreading();
int dim = 5000;
var A = Matrix<double>.Build.Sparse(dim, dim);
var F = Vector<double>.Build.Dense(dim);
for (int i = 0; i < dim; i++)
{
A[i, i] = 1.0;
F[i] = 1.0;
}
// THIS TAKES FOREVER
Vector<double> X = A.Solve(F);
}
}
}
该如何提高上述程序的性能?
更新
我的猜测是Math.NET Numerics稀疏求解器本质上是缓慢的?但是,该库仍然非常有用,因为它便于处理稀疏矩阵。但是为了真正解决系统问题,我创建了一个与DSS子例程接口的Fortran DLL。我只需要将csr稀疏矩阵数据和右侧作为DLL的Fortran子例程的参数发送,它将返回解决方案。性能提升巨大。
更新
尽管ALGLIB免费版确实有一些限制:
第一个限制是性能。免费版不包含多线程功能,SIMD优化,本机HPC内核 用于C#应用程序并与Intel MKL集成。
第二个限制是许可证。我们的旗舰产品(适用于C ++的ALGLIB和适用于C#的ALGLIB)已根据GPL 2+许可进行分发, 不适合商业发行;其他产品经销 根据个人和学术使用许可。
在解决稀疏系统方面确实提供了更好的性能(与Math.Net Numerics相比)。它还确实提供了处理稀疏矩阵的便捷方法。
答案 0 :(得分:3)
根据this comment已有一年半的历史,在Math.Net中没有针对稀疏矩阵的直接求解器。
我相信Math.Net不会为稀疏矩阵提供任何直接求解器。它将尝试将其解决为一个密集的矩阵,这将花费很长时间。我将CSparse.Net用于稀疏矩阵(https://github.com/wo80/CSparse.NET/wiki/Math.NET-Numerics-and-CSparse)
以下来自an article的八岁笔记以某种方式证实了这一点:
到目前为止,这些示例仅使用密集的向量和矩阵。 Math.NET Numerics提供了SparseVector和SparseMatrix类型,并且具有良好的设计,可以为将来使用它们提供支持。但是,它们的当前实现非常有限。例如,类型没有使用索引的非零值构建稀疏向量的构造函数。很少有数学库完全支持稀疏矩阵和稀疏线性代数,因为对于稀疏矩阵线性代数没有明确的标准(与稠密矩阵的BLAS / LAPACK不同)
我浏览了该库代码的相关部分,但没有找到任何直接的稀疏矩阵求解器。