web-dev-qa-db-ja.com

MPI_Initがargcおよびargvへのポインターを受け入れるのはなぜですか?

これがMPI_Init関数の使用方法です

int main(int argc, char **argv)
{
    MPI_Init(&argc, &argv);
…
}

mPI_Initがargvの値の代わりにargcとargvへのポインターを使用するのはなぜですか?

23
Rohit Banga

ここに述べられた答えによると:

MPIを使用してコマンドラインから引数を渡す

ほとんどのMPI実装では、この関数のmpirun関連の引数がすべて削除されるため、呼び出した後、通常の(mpirun以外の)コマンド実行であるかのようにコマンドライン引数をアドレス指定できます。

つまり後

mpirun -np 10 myapp myparam1 myparam2

mpirunパラメーター(これもいくつか追加されているようです)とmyparam1およびmyparam2のインデックスが不明であるため、argc = 7(?)

しかし後

MPI_Init(&argc, &argv)

argc = 3であり、myparam1はargv [1]にあり、myparam2はargv [2]にあります。

どうやらこれは標準外ですが、私はlinux mpichでテストしましたが、確かにそうです。この動作がなければ、アプリケーションパラメータとmpirunパラメータを区別することは非常に困難です(不可能ですか?)。

20
NickTee

コマンドラインからmpi引数を削除できる可能性があると思います。引数カウントをポインタで渡すと、mainのポイントからその値を変更できます。

4
Anycorn

私は専門家ではありませんが、簡単な答えは、作業している各ノードが独自のコードのコピーを使用しているということだと思います。これらの引数を渡すと、コマンドラインインターフェイスを介して渡されなかった場合でも、各ノードがargcおよびargvにアクセスできるようになります。 MPI_Init isを呼び出す元のノードまたはマスターノードがこれらの引数を渡しました。 MPI_Initを使用すると、他のノードもそれらにアクセスできます。

1
user3208888

OpenMPIのマニュアルページによると: MPI_Init(3)のマニュアルページ

Open MPIは、mainへのC/C++ argcおよびargv引数を受け入れますが、それらを変更、解釈、または配布しません。

1
Wey Dong