並列ソルバーが逐次ソルバーより遅いのはなぜですか?


14

私はPETScいじくり回していましたが、MPIを介して複数のプロセスを使用してプログラムを実行すると、さらに遅くなるようです!何が起こっているかを確認するにはどうすればよいですか?


これは実際には「方法」ではなく「何」であるため、これを回答として投稿しませんでしたが、複数のスレッドからアクセスされるコードのミューテックス保護セクションによって引き起こされた同様の問題が過去にありました。場合によっては、背後で共有リソースのロックを確認する必要があります。
デビッドZ

回答:


13

これは、アーキテクチャ上の要因から発生する可能性があります。

1つ以上のプロセスで同じメモリ帯域幅を使用できる場合、SpMVおよび関連する線形代数演算はメモリ帯域幅に制限されるため、スピードアップはほとんどありません。

また、通信オーバーヘッドがローカル計算を圧倒する場合もあります。たとえば、線形反復法では、プロセスごとに少なくとも10,000個の未知数を持つことをお勧めします。

または数値要因:

パラレル前提条件は、多くの場合、シリアルの前提条件よりも弱いです。たとえば、ブロックJacobiは、使用するブロックが多いほど弱くなります。したがって、余分な線形反復に費やされる余分な時間を考慮する必要があります。一般に、非線形条件はこの方法では機能しないため、ニュートンの反復は多くの場合一定です。


8

プログラムを並列化しようとするときは常に、多くのコストのバランスを取る必要がありますが、主に

  • 各計算を実行するコスト
  • これらの計算間の通信のコスト
  • それらの計算を管理するコスト

計算が恥ずかしいほど並行している場合、通信コストは非常に低くなり(入力と出力のみ)、管理コストは非常に低くなります。

計算間に相互依存関係がある場合、通信コストが大幅に上昇する可能性があります。特定の計算を完了するのに異なる時間を要する複雑なアルゴリズムがある場合、所有するリソースを効率的に利用しようとすると、管理の複雑さが増します。

あらゆる形式の最適化と同様に、重要なのはベンチマークです。MPIなしで実行する方法、MPIと1つのプロセスで実行する方法、そしてスケーリングの方法を見てください。

あなたはCUDAで遊んでいる場合は、それを与えてみてください非常に多くのデータを。ここでの1つのテストは、負の高速化をもたらしました。データを1000倍増やし、GP-GPUバージョンはほぼ同じ時間で終了しましたが、メインCPUで実行されるバージョンは1000倍の時間がかかりました。


3

次のことをお勧めします。

  • 並列化の有無にかかわらず、コードの実行時間のプロファイルを作成します。これを行う方法について疑問がある場合は、コードをより詳しく説明してください。

  • 並行して実行速度が遅くなる部分に集中できるようになりました。プロセス間の通信が遅くなる可能性があることに注意する必要があります。マークとショーンが指摘したように、問題をスレッドに分割できるからといって、それが効率的であるとは限りません。もっと深く調べる必要があります。ただし、コードのプロファイルを作成すると、既存のバグを見つけるのに役立ちます。私の2セント。

ワークフローなどを使用して、実行していることをより詳細に説明すると、誰かがより良い説明をすることができる場合があります。


@ketch:そのとおりです。ごめん、気づいてくれてありがとう。テキストを編集しました。
jbcolmenares
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.