一般的に、パラレルコードがシリアルコードよりも遅くなる可能性はありますか?私はそうです、そして私はそれに本当にイライラしています!私に何ができる?
2 に答える
特に、並列モデルのパフォーマンスを決定する3つの重要な要素は次のとおりです。
- 並列タスクの細かさ。
- 通信オーバーヘッド;
- プロセス間の負荷分散。
並列タスクの細かさ
並列タスクの粒度は、並列処理のオーバーヘッドを超えるのに十分な大きさである必要があります(たとえば、並列タスクの作成とそれらの間の通信)。通常、分散メモリ(DM)モデルのプロセスでは、スレッド同期よりも通信オーバーヘッドが高くなるため、プロセスのタスクの粒度を高くする必要があります。この粒度は、負荷分散を危険にさらすこともありません。
tl; dr:並列タスクは、並列化のオーバーヘッドを正当化するのに十分な「大きさ」である必要があります。
通信オーバーヘッド
あるプロセスが他のプロセスと通信しようとするときはいつでも、メッセージを作成/送信するコストがかかり、synchronous communication
ルーチンの場合は、他のプロセスがメッセージを受信するのを待つコストもあります。したがって、MPIを使用してアプリケーションのパフォーマンスを向上させるには、プロセス間で交換されるメッセージの数を減らす必要があります。
1つの特定のプロセスからの結果を待つ代わりに、プロセス間で計算の冗長性を使用できます。この結果は、各プロセスで直接実行できます。もちろん、これは通常、結果を交換するオーバーヘッドが計算自体にかかる時間と重なる場合に正当化されます。別の解決策は、に置き換えることsynchronous communication
ですasynchronous communication
。メッセージをsynchronous communication
送信するプロセスでは、他のプロセスがメッセージを受信するまで待機しますが、プロセスではasynchronous communication
、送信呼び出しから戻った直後に実行を再開します。したがって、通信と計算の重複。ただし、asynchronous communication
それを利用するには、コードを書き直す必要がある場合があります。また、適切なオーバーラップ率を達成するのは依然として難しい場合があります。
高性能の通信ハードウェアを使用することで通信オーバーヘッドを削減することは可能ですが、コストがかかる場合があります。集合通信は、ハードウェア、ネットワーク、およびトポロジに基づいて通信を最適化するため、通信パフォーマンスも向上させることができます。
tl; dr:並列タスク間の通信と同期の量を減らします。使用:冗長計算、非同期通信、集合通信、およびより高速な通信ハードウェア。
プロセス間の負荷分散
並行して実行される作業を最大化するため、適切な負荷分散が不可欠です。負荷分散は、プロセス間のタスク分散と、アプリケーションが実行しているリソースのセットの両方の影響を受けます。
固定されたリソースのセットで実行されているアプリケーションでは、タスクの分散に焦点を当てる必要があります。タスクの計算量がほぼ同じである場合(たとえば、反復の場合)、プロセス間でタスクを最も均等に分散することだけが必要です。
ただし、一部のアプリケーションは、速度の異なるプロセッサを搭載したシステムで実行されたり、計算量の異なるサブタスクを搭載したりする場合があります。このタイプの状況ではfarming model
、動的なタスク分散で実装できるため、より良い負荷分散を促進するためにタスクを使用できます。ただし、このモデルでは、使用される通信量が効率を損なう可能性があります。
もう1つの解決策は、タスク分散の調整を手動で実行することです。これは複雑で難しいことが判明するかもしれません。ただし、リソースのセットの速度が均一でなく、アプリケーションの実行間で絶えず変化している場合、タスク分散チューニングのパフォーマンスの移植性が危険にさらされる可能性があります。
tl; dr:各プロセスは、作業を完了するのにほぼ同じ時間がかかるはずです。
他の人が指摘しているように、パラレルコードがシリアルコードよりも遅くなる理由はいくつかあります。
マトリックス操作を実行している場合は、コードを「ブロック」することで、CPUキャッシュメモリをより効果的に利用することを検討できます。CPUキャッシュサイズによっては、パフォーマンスが最大3〜4倍向上する可能性があります。ブロッキングとは、基本的に、キャッシュメモリに収まるように小さなタイルまたはブロックの行列を処理することです。これにより、メインメモリの読み取り/書き込みの必要性が減り、パフォーマンスが向上します。
もう1つのオプションは、GPUを使用することです。
上記のソリューションは、コンピューティングの大部分が浮動小数点または整数演算用である場合にうまく機能します
汎用コンピューティングの場合、理想的には、実行時に作業負荷の分散でパフォーマンスが向上するかどうかを判断し、有利な場合にのみ分散するように、アプリを適応型に設計する必要があります。