【发布时间】: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