【问题标题】:Math.NET Numerics Poor Performance and Low CPU UsageMath.NET 数值性能差且 CPU 使用率低
【发布时间】:2019-08-25 08:49:33
【问题描述】:

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

我创建了以下测试程序来检查 Math.NET Numerics 的性能,但是,即使对于 int dim = 5000;,该程序也需要很长时间才能等待运行结束。另外,我的机器的 cpu 使用率没有超过 25%(机器有 4 个核心)。

将 MKL 与 Fortran 结合使用,我可以更快地解决更大的系统(dim = 1,000,000)(cpu 使用率接近 100%)。我正在使用 Direct Sparse Solver (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);
        }
    }
}

我可以做些什么来提高上述程序的性能?

更新

虽然 ALGLIB 免费版确实有一些限制:

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

第二个限制是许可证。我们的旗舰产品(用于 C++ 的 ALGLIB 和用于 C# 的 ALGLIB)在 GPL 2+ 许可下分发,即 不适合商业发行;其他产品已分发 根据个人和学术使用许可。

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

【问题讨论】:

  • 您有 4 核(或 2 核/4 超线程)机器吗?听起来它与单核挂钩,导致 4 核机器上的 CPU 使用率至少达到 25%。 Control.MaxDegreeOfParallelism 的值是多少?
  • 你在打电话给Control.UseMultiThreading()吗?
  • @AlwaysLearning 我没有为Control.MaxDegreeOfParallelism 设置值,因为我不知道要使用什么值...我的机器有 4 个内核和 8 个逻辑处理器。
  • @mjwills 是的,但是调用或不调用对性能没有影响。

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


【解决方案1】:

根据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 用于密集矩阵)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多