MPI は自動的に 0 をマスター プロセスとして指定するようです。しかし、別のプロセス (ランク 10 のプロセスなど) をマスター プロセスに指定できるようにしたいと考えています。
また、この関数scanf
はマスター プロセスでのみ機能します。他のプロセスは単純にそれを無視して次のステートメントに進みます。なぜこうなった?
mpiexec
MPI プロセスを開始すると、そのうちの 1 つだけが を受け取りますstdin
。残りはその記述子を開いていないため、それを読み取るとエラーが返されます。からの戻り値を確認するscanf
と、おそらくEOF
. 技術的には、すべてのプロセスの内容をコピーしてstdin
転送する実装が存在する可能性がありますが、これを行う MPI はないと思います。
stdout
一方、通常、ランチャーによってすべてのプロセスから収集され、端末に出力されますが、出力される順序を制御することはほぼ不可能です。一般的な解決策は、pyCthon が提案したように、1 つのランクでデータを手動で収集し、すべてを出力させることです。
最後に、OpenMPImpiexec
は、あなたが要求したことを行うことができます: どのランクを取得するかを指定stdin
し、別の で特定のランクを起動することさえできますxterm
。これはデバッグには役立つかもしれませんが、コア機能をこれらの機能に依存するつもりはありません。いつか別の MPI 実装でコードを使用したくなるかもしれません。さらに、大規模なクラスターで実行しているとします。本当に 1000 のターミナルを開きたいですか? :)
はいといいえ。
またはを使用して、別個のコミュニケーターワールド サブグループを作成できます。MPI_Comm_create
MPI_Comm_split
についてscanf
は、たとえば別のランクで実行すると、そのランクプロセスが出力されると思います。たとえば、そのランクに別の端末があるが、端末がランク 0 にある可能性が最も高い場合、出力はそこでしか表示されませんが、他のランクではプログラムを実行していないため、そうなるとは思いません仕事。
別のノードから印刷するには、 を使用し、結果をメモリに保存してから、ランク 0 に端末sprintf
に送り返す必要があります。printf