私はMath.Netを使って三角対角系を解くことに取り組んでいました。私はMKL(x86)とOpenBLASエクステンションをインストールしましたが、CPU使用量を見ると明らかに1つのコアだけが動作しています。これは、コードマルチスレッド操作
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を使用するのに役立ちません。
コードはリリースで最適化を有効にしてコンパイルされ、「Any CPUs」と「x64」の両方を試しました。
何か間違っていますか?
は、[EDIT] は言及し忘れたが、AとBは、forループ、エルゴ中に変更される可能性があります、私は、forループを並列化することはできません。この質問は、「Math.NetにLAプロバイダのマルチスレッドラッパーを使用させるにはどうすればよいのですか?
私はあなたが 'A.Solve(b)は'マルチスレッドを使用して実装されることを期待すると仮定しますか? – slawekwin
ネイティブプロバイダ(つまり、MKLまたはOpenBLAS)が複数のスレッドを使用する場合は、Solve、Multiplyなどのすべての操作もマルチスレッドでなければならない、Math.Net(これはネイティブプロバイダの単なるラッパー)によると、 – 7raiden7
あなたのマトリックスはどれくらいの大きさですか?複数のスレッドを使用するのは、大規模なシステムでのみ有効です。そのため、Math.NETの線形代数プロバイダは、小行列上で呼び出しスレッドのみを使用します。 –