我正在使用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没什么用。
代码在Release中编译并启用了优化,我尝试了两个&#34;任何CPU&#34;和&#34; x64&#34;。
我做错了吗?
[编辑] 忘了提,但A和b可能会在for循环期间发生变化,因此我无法并行化for循环。这个问题更倾向于&#34;我如何强制Math.Net使用其LA提供商的多线程包装器?&#34;
答案 0 :(得分:1)
CPU型号(任何CPU,x64等)与核心的使用无关。如果输出代码必须是32位,64位或两者,它只是定义编译器。
我想方法retries
不使用多线程,但也许你可以在多个线程/核心上执行繁重的工作:
尝试使用Parallel.For-method:
Solve
这将创建一个for循环,但所有迭代都将分散在机器的核心上。
注意#1:由于您的代码是简化版本,我希望您可以将我的答案转换为您的实际代码,因为您的示例似乎重复了相同的操作5000次。
注意#2:如果实例A或b被方法Parallel.For(0, 5000, n => x = A.Solve(b));
修改,则此解决方案将无法工作,因为多个线程将同时修改这些对象,这将导致不可预测的结果。
来源:https://msdn.microsoft.com/en-us/library/dd460713(v=vs.110).aspx