C# 多线程操作
我在用Math.Net解一个三对角系统。我已经安装了MKL(x86)和OpenBLAS扩展,但是当我看到CPU使用情况时,我只看到一个内核在工作。这是密码C# 多线程操作,c#,multithreading,intel-mkl,mathnet-numerics,openblas,C#,Multithreading,Intel Mkl,Mathnet Numerics,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
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);
MathNet.Numerics.Control.UseNativeMKL();
MathNet.Numerics.Control.UseMultiphreading();
基质A;
向量x;
载体b;
//***填写A和B***
对于(int n=0;n<50000;n++)
x=A.解(b);
这当然是实际代码的简化版本,但在使用超过1个CPU时没有任何帮助
代码是在启用了优化的发行版中编译的,我尝试了“任意CPU”和“x64”
我做错什么了吗
[编辑]
忘了提一下,但是A和b在for循环期间可能会改变,因此,我不能并行化for循环。这个问题更倾向于“如何强制Math.Net使用其LA提供程序的多线程包装器?”CPU模型(任何CPU、x64等)与内核的使用无关。如果输出代码必须是32位、64位或两者都是,它只定义编译器
我猜方法Solve
不使用多线程,但也许您可以在多个线程/内核上执行繁重的工作:
尝试使用Parallel.For-method:
Parallel.For(0, 5000, n => x = A.Solve(b));
这将创建一个for循环,但所有迭代都是在机器的核心上进行的
注#1:由于您的代码是一个简化版本,我希望您能将我的答案转换为实际代码,因为您的示例似乎只是重复了相同的操作5000次
注意#2:如果实例A或b通过方法Solve
修改,此解决方案将不起作用,因为多个线程将同时修改这些对象,这将导致不可预测的结果
来源:我假设您期望
A.Solve(b)
使用多线程实现?是的,根据Math.Net(它只是一个本机提供程序的包装器),如果本机提供程序(即MKL或OpenBLAS)使用多线程,则每个操作(如解算、乘法等)都应该是多线程的。您的矩阵有多大?使用多线程只在大型系统上有效,这就是为什么Math.NET线性代数提供程序只在小矩阵上使用调用线程的原因。矩阵是128 x 128,所以有点小。我认为使用“UseMultirthreading”时,无论问题的维度如何,我都会强制开关始终打开。谢谢你的回答。实际上是的,所有变量都依赖于for循环的上一次迭代,因此,我不能真正并行化它。但我知道(根据Math.Net文档),所有LA操作都应该使用所有可能的内核进行并行化。你有来源吗?这个声明写在哪里?从这个()中,我看到usemulthreading选项应该使用所有线程,即使对于本机提供程序也是如此