私のunix/windows C ++アプリは、MPIを使用してすでに並列化されています。ジョブはN cpusに分割され、各チャンクは並列で実行され、非常に効率的で、非常に高速なスケーリングで、ジョブは正しく実行されます。
ただし、一部のデータは各プロセスで繰り返され、技術的な理由から、このデータをMPIで簡単に分割することはできません(...)。例えば:
- 5 Gbの静的データ、各プロセスにまったく同じものがロードされます
- MPIで分散できる4Gbのデータは、使用されるCPUが多いほど、このCPUあたりのRAMは小さくなります。
4 CPUジョブでは、これは少なくとも20GbのRAM負荷を意味し、メモリの大部分は「無駄」になります。これはひどいことです。
全体的な負荷を減らすために共有メモリを使用することを考えています。「静的」チャンクは、コンピューターごとに1回だけロードされます。
したがって、主な質問は次のとおりです。
ノード上でメモリを共有するための標準的なMPIの方法はありますか? ある種のすぐに利用できる+無料のライブラリ?
- そうでない場合は、
boost.interprocess
MPI呼び出しを使用して、ローカル共有メモリ識別子を配布します。 - 共有メモリは、各ノードの「ローカルマスター」によって読み取られ、共有読み取り専用になります。変更されないため、セマフォ/同期の種類は必要ありません。
- そうでない場合は、
パフォーマンスの低下や注意すべき特定の問題はありますか?
- (「文字列」や過度に奇妙なデータ構造はありません。すべてを配列と構造ポインターにまとめることができます)
ジョブはPBS(またはSGE)キューイングシステムで実行されます。プロセスがクリーンでない出口の場合、それらがノード固有の共有メモリをクリーンアップするかどうか疑問に思います。