C# Math.NET Numerics性能差,CPU使用率低

C# Math.NET Numerics性能差,CPU使用率低,c#,math,linear-algebra,intel-mkl,mathnet-numerics,C#,Math,Linear Algebra,Intel Mkl,Mathnet Numerics,我想能够解C#(dim=1000000)中的大型稀疏线性方程组。为此,我将Math.NET Numerics与MKL提供程序一起使用 我创建了以下测试程序来检查Math.NET Numerics的性能,即使是int dim=5000程序等待运行结束的时间太长。此外,我的机器的cpu使用率没有超过25%(机器有4个内核) 将MKL与Fortran结合使用,我可以更快地解决更大的系统(dim=1000000)(cpu使用率接近100%)。我正在使用直接稀疏解算器(DSS)接口例程 using Mat

我想能够解C#(dim=1000000)中的大型稀疏线性方程组。为此,我将Math.NET Numerics与MKL提供程序一起使用

我创建了以下测试程序来检查Math.NET Numerics的性能,即使是
int dim=5000程序等待运行结束的时间太长。此外,我的机器的cpu使用率没有超过25%(机器有4个内核)

将MKL与Fortran结合使用,我可以更快地解决更大的系统(dim=1000000)(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);
        }
    }
}
使用MathNet.Numerics;
使用MathNet.Numerics.LinearAlgebra;
名称空间控制台EAPP1
{
班级计划
{
静态void Main()
{
Control.UseNativeMKL();
控件。使用多线程();
int dim=5000;
var A=矩阵.Build.Sparse(dim,dim);
var F=向量.构建.密集(dim);
对于(int i=0;i
我可以做些什么来提高上述程序的性能

更新

尽管ALGLIB免费版有一些限制:

第一个限制是性能。免费版本不包括多线程功能、SIMD优化、本机HPC内核 用于C#应用程序和与英特尔MKL的集成

第二个限制是许可证。我们的旗舰产品(AlgLB为C++和AlgLIB为C)是在GPL 2 +许可证下分发的,这是 不适合商业分销;其他产品也在销售中 根据个人和学术使用许可证

它在求解稀疏系统时确实提供了更好的性能(与Math.Net Numerics相比)。它还提供了处理稀疏矩阵的方便方法。

根据这一点,一年半以前的Math.Net中没有稀疏矩阵的直接解算器

我相信Math.Net没有为稀疏矩阵提供任何直接的求解器。它将尝试将其作为一个稠密矩阵来求解,这将花费很长时间。我将CSparse.Net用于稀疏矩阵()

以下八年前的注释以某种方式证实了这一点:

到目前为止,这些示例仅使用密集向量和矩阵。Math.NET Numerics提供了SparseVector和SparseMatrix类型,并为将来使用它们提供了良好的设计支持。然而,目前对它们的实施非常有限。例如,这些类型没有使用索引非零值构建稀疏向量的构造函数。很少有数学库提供对稀疏矩阵和稀疏线性代数的完全支持,因为稀疏矩阵线性代数没有明确的标准(与密集矩阵的BLAS/LAPACK不同)


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

您有4核(或2核/4超线程)机器吗?听起来像是将一个内核固定在一个4核机器上,导致至少25%的CPU使用率。
Control.MaxDegreeOfParallelism
的值是多少?您正在调用
Control.usemulthreading()
?@AlwaysLearning我没有为
Control.MaxDegreeOfParallelism
设置值,因为我不知道要使用什么值。。。我的机器有4个内核和8个逻辑处理器。@mjwills是的,但是调用或不调用对性能没有影响。