Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多线程操作_C#_Multithreading_Intel Mkl_Mathnet Numerics_Openblas - Fatal编程技术网

C# 多线程操作

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

我在用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);
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选项应该使用所有线程,即使对于本机提供程序也是如此