多线程操作

时间:2016-08-29 13:10:31

标签: c# multithreading intel-mkl mathnet openblas

我正在使用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;

1 个答案:

答案 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