【发布时间】:2016-08-29 13:10:31
【问题描述】:
我正在使用 Math.Net 解决三对角系统。我已经安装了 MKL (x86) 和 OpenBLAS 扩展,但显然当我看到 CPU 使用率时,我只看到一个内核在工作。这是代码
MathNet.Numerics.Control.UseNativeMKL();
MathNet.Numerics.Control.UseMultiThreading();
Matrix<double> A;
Vector<double> x;
Vector<double> b;
// *** FILL A and B ***
for (int n = 0; n < 50000; n++)
x = A.Solve(b);
这当然是实际代码的一个非常简化的版本,但对于使用超过 1 个 CPU 没有任何帮助。
代码是在启用了优化的版本中编译的,我尝试了“任何 CPU”和“x64”。
我做错了吗?
[编辑] 忘了提,但 A 和 b 可能会在 for 循环期间发生变化,因此,我无法并行化 for 循环。这个问题更倾向于“如何强制 Math.Net 使用其 LA 提供程序的多线程包装器?”
【问题讨论】:
-
我假设您希望
A.Solve(b)使用多线程实现? -
是的,根据 Math.Net(它只是原生提供者的包装器),如果原生提供者(即 MKL 或 OpenBLAS)使用多个线程,则每个操作(例如 Solve、Multiply 等)都会使用多个线程。也应该是多线程的
-
您的矩阵有多大?使用多线程仅在大型系统上有效,这就是为什么 Math.NET 线性代数提供程序仅在小型矩阵上使用调用线程。
-
矩阵是 128 x 128,有点小。我认为使用“UseMultiThreading”我以某种方式强制该开关始终打开,无论问题维度如何
标签: c# multithreading intel-mkl mathnet-numerics openblas