2016-08-29 3 views
1

私は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プロバイダのマルチスレッドラッパーを使用させるにはどうすればよいのですか?

+0

私はあなたが 'A.Solve(b)は'マルチスレッドを使用して実装されることを期待すると仮定しますか? – slawekwin

+0

ネイティブプロバイダ(つまり、MKLまたはOpenBLAS)が複数のスレッドを使用する場合は、Solve、Multiplyなどのすべての操作もマルチスレッドでなければならない、Math.Net(これはネイティブプロバイダの単なるラッパー)によると、 – 7raiden7

+0

あなたのマトリックスはどれくらいの大きさですか?複数のスレッドを使用するのは、大規模なシステムでのみ有効です。そのため、Math.NETの線形代数プロバイダは、小行列上で呼び出しスレッドのみを使用します。 –

答えて

1

CPUモデル(すべてのCPU、x64など)は、コアの使用とは関係ありません。出力コードが32ビット、64ビット、またはその両方でなければならない場合、単にコンパイラを定義します。

私は方法Solveは、マルチスレッドを使用していないと思いますが、おそらくあなたは、いくつかのスレッド/コアの上に重い作業を実行することができます。

Parallel.Forメソッドを使用してみてください:

Parallel.For(0, 5000, n => x = A.Solve(b)); 

この意志forループを作成しますが、すべての反復はマシンのコアに分割されます。

メモ#1:あなたのコードは単純化されたバージョンなので、私の答えはあなたの実際のコードに翻訳することができます。あなたの例は同じ操作を5000回繰り返しているようです。

NOTE#2:インスタンスAまたはBがメソッドSolveによって変更された場合、複数のスレッドがこれらのオブジェクトを同時に変更して予測できない結果につながるため、この解決策は機能しません。

出典:https://msdn.microsoft.com/en-us/library/dd460713(v=vs.110).aspx

+0

あなたの答えをありがとう。実際はそうです。すべての変数はforループの以前の反復に依存しますが、実際には並列化できません。 しかし、すべてのLA演算を可能なすべてのコアを使用して並列化する必要があることは知っています(Math.Netドキュメントに準拠)。 – 7raiden7

+0

ソースがありますか?その主張はどこに書かれていますか? –

+0

これは、UseMultiThreadingオプションがネイティブプロバイダであってもすべてのスレッドを使用する必要があることがわかりました(https://github.com/mathnet/mathnet-numerics/commit/59c41819e6db31f99ddc988ddb429e4cb02b7853) – 7raiden7