私は、オプションでMPIを使用して並列に実行できるプログラム(C++ 11)を作成しています。このプロジェクトではCMakeを使用して設定を行い、CMakeが見つからない場合は自動的にMPakeを無効にし、警告メッセージを表示します。mpirun/mpiexecで実行しているときにMPIを使用していないことを検出
しかし、私はユーザーがHPCクラスタ上でプログラムを構成してコンパイルし、MPIモジュールをロードするのを忘れ、警告に気づかないという完璧な可能性のあるユースケースについて心配しています。同じユーザーがプログラムを実行しようとすると、mpirun
が見つからず、MPIモジュールをインクルードしますが、再コンパイルするのは忘れてしまいます。ユーザーがmpirun
でプログラムを実行すると、これは機能しますが、コンパイル時にMPIが無効になっているので、プログラムは何も並列化されずに何度も実行されます。ユーザーがプログラムが並行して実行されていると思うのを防ぐために、この場合はプログラムにエラーメッセージを表示させたいと思います。
私の質問は、私のプログラムがMPIライブラリ関数を使用せずに並列に実行されていることを検出する方法です(コンパイル時にMPIが無効になったため)。 mpirun
はプログラムを何度も起動しますが、私が知る限り並列起動されているプロセスについては通知しません。
私はプログラムにいくつかのテストファイルを書き込ませ、そのファイルがすでに存在するかどうかを確認することを考えましたが、並行性の問題のためにこれが難しいかもしれないという事実から離れて、mpirun
ファイルシステムを共有するノード上のさまざまなプロセス
システム変数を使用して2つのプロセス間で通信することも考えましたが、わかっている限り、これを行うシステムに依存しない方法はありません(並行性の問題が発生する可能性があります。さまざまなプロセス間の座標システムコール)。
だから、私は考えがなくなってしまったので、これを達成するのに役立つ提案をいただければ幸いです。好ましいソリューションは、オペレーティングシステムに依存しないものでなければなりませんが、UNIXのみのソリューションが既に大きな助けになっています。
'ldd'コマンドを使って、プログラムがMPIライブラリにリンクされているかどうかを確認できます。たとえば、https://cc.ulb.ac.be/hpc/Howto_hydra/compile_mpi.phpを参照してください。おそらくプログラムは 'ldd'自身で(' argv [0] 'を使って)、' mpicc --show'の出力を解析してモジュールがロードされているかどうかを調べることができます...もし結果が互換でないならば、エラー。これを行うには、最もクリーンな方法が必要です。 – francis
「FOOBARはSERIALモードで動作しています」という冒頭に大きな太いバナーを表示するだけです。注意力のあるユーザーに気付くでしょう。 –