Math.NET数字性能差且CPU使用率低

时间:2019-08-25 08:49:33

标签: c# math linear-algebra intel-mkl mathnet-numerics

我希望能够解决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相比)。它还确实提供了处理稀疏矩阵的便捷方法。

1 个答案:

答案 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不同)

我浏览了该库代码的相关部分,但没有找到任何直接的稀疏矩阵求解器。