コマンドライン引数をMPI_Initに渡す必要がありますか?


8

MPI 3.0のコードを書くとき、私は合格しなければならないargcargvMPI_Init通話やない、なぜ?

編集:ビル・バースの答えはいくつかの質問を提起したので、私はいくつかの発言をしたいと思います:

  • MPI 1.1以降、argc/を渡すargv必要はありません。
  • 質問は、具体的理由/ 1パスすべきでない程度であるargc/ argvなぜあなたはいけません、本当にその後、答えではありません)。
  • それでも、argc/ argvを渡すことができない場合がありますMPI_Init(mainが制御範囲外にあり、MPIが実装の詳細である場合、静的初期化を使用してMPIを起動するライブラリを作成します)。

EDIT2:なぜ使用しないのかMPI_Init(argc, argv)という質問が頻繁に出てきました。いくつかの理由:

  • 古い/非準拠/準拠のMPI <1.1実装との互換性のためにこれを行うことはできません。MPI2またはMPI3機能を使用している場合、これらは機能しません。

  • MPI_Init() と同じ方法でMPIランタイムを初期化します MPI_Init(argc, argv)

  • MPI_Init(argc, argv)MPIの実行時に渡される引数を削除argcし、argv そして MPIを初期化します。私の知る限り、それはきれいにするための唯一の方法であるargcargvあなたがそれを使用する必要が全くMPI引数を持たないためにこれらが必要な場合はそう。

  • MPI_Init()より多くの状況で使用できますMPI_Init(argc, argv)。たとえば、MPIを実装の詳細として使用しているライブラリは、MPIが初期化されているかどうかをテストできます。初期化されていない場合は、呼び出すMPI_Init()と正しいことが起こります。あなたのユーザーは、あなたがMPIを使用していることを知らない、渡す必要はありませんargcargv......あなたのライブラリーを使用するために、あなたのライブラリに、(場合には、それは引数を取っていない)自分のメインを変更する必要はありません。


BillBarthの応答があなたの質問に答えない理由は私にはわかりません。「なぜだろう」という部分は、以前のMPI実装で何が起こったのか、引数を渡さないと問題が発生する理由を説明する彼の応答の要点を要約したように見えます。たぶん、あなたはより決定的なものを探していますか?
Geoff Oxberry 2014

@GeoffOxberry なぜ答えないという問題は、なぜ答えるのと同じくらい良いことです。すべてのMPIの実装は、MPIをサポートしているので、> 1.1の代替提供している必要があり、正しく、あなたがに渡す引数を取得する/ 何とか(それがどのように指定されていない)、そして以来、より多くの状況で使用することができます「(回避策とせずに)、私はドンMPI 3.0をターゲットにしている場合は、実際に使用するポイントを確認してください。MPI_Init()mpirunmpiexec MPI_Init()MPI_Init(argc, argv)MPI_Init(argc, argv)
gnzlbg 2014

MPI 2.0またはMPI 3.0機能を使用する必要がある場合、MPI <1.1をサポートするMPI実装との互換性は、とにかく不可能です。
gnzlbg 2014

2
あなたはまだ私の基本的なポイントを逃しています。MPIディストリビューションは、MPI_InitがNULLを渡すかどうかを実行時に判別できないため、おそらくコマンドラインにデータを配置します。argcとargvを渡さない場合、MPI_Initはそれらを編集して追加を削除できません。そのため、コードはMPIからの偽のコマンドライン引数に対して堅牢でなければなりません。したがって、MPI_Initに引数を渡してクリーンなセットを取り戻すことができる場合に、任意の、おそらく競合する引数のセットを処理する必要があるというリスクを取るのはなぜですか。できない場合はできませんが、すべきです。
Bill Barth 2014

質問の2番目の編集を参照してください。基本的に、MPI引数をクリーンアップargcargvてMPI 初期化するMPI_Init(argc, argv)場合MPI_Init()は、を使用します。それ以外の場合は問題ありません(必要な場合もあります)。
gnzlbg 2014

回答:


2

私は間違いなくそれらを渡しますが、このMPI_init(&argc、&argv)のようなポインターを渡し、関数で完全に有効な呼び出しMPI_init(NULL、NULL)を許可します。


1

C / C ++でそれらを渡さないようにする3.0標準に新しいものがあるかどうかはわかりませんが、間違いなく渡します。現在の状態はわかりませんが、以前の多くの実装では、実行時に追加のコマンドライン引数をプログラムに渡し、で編集していましたMPI_Init()。コマンドライン引数を使用してプログラムにオプションを渡す場合、実装に編集を行わせない場合は、引数と、特定の実装からの未知の可能性のある引数の数とスタイルの両方を解釈する必要があります。あなたが使用しています。これらの議論はまた、実装ごとに異なる可能性が高いです。

これは、呼び出すために、かなり普通のことだMPI_Init()argcしてargv、なぜあなたではないでしょうか?


仕様によると、MPI 1.1以降では、MPI_Initにnullを渡すと、環境から引数を読み取る必要があります。それで、環境からそれらを読み取ることができる場合、なぜ最初にそれらをアプリケーションに渡すのでしょうか。とにかくランタイムがアプリケーションに引数を渡す場合は、そうです。そうすれば、少なくともアプリケーションの残りの部分が引数を使用する前にランタイムがそれらをクリーンアップするように、それらを使用してMPI_Initを呼び出すことは理にかなっています。
gnzlbg 2014

さて、あなたは利用可能なすべてのスタックをテストして、彼らが何ができるかに追いついたかどうかを確認しましたか?一部のスタックが追加の引数を追加することによってコードの引数の解析を台無しにする可能性がある場合は、初期化中にそれらの余分な引数を削除するようにしてください。argcとargvをMPI_Init()に渡すことの害は何ですか?繰り返しますが、なぜそれをしないのですか?
Bill Barth 2014

1
(1)環境情報に関するあなたの意見が本当にわかりません。mpirun/ mpiexecをいくつかのパラメーターで呼び出した場合mpirun、プログラムを開始する前にいくつかの環境変数を設定して、からそれらを読み取ることができますMPI_Init。(2)可能なすべての実装をテストしたわけではありませんが、質問にあるように、MPI 3.0準拠の実装のみに関心があります。難解なものはあまりありません。
gnzlbg 2014

2
入力する前に、あなたの編集を逃しました。私の提案は、あなたに代わってMPIを初期化したい場合は、argcとargvをライブラリに渡すことです。または、ユーザーにMPI_Init()を要求し、ライブラリに必要なコミュニケータを渡します。argcとargvを指定してMPI_Init()を呼び出さないのは、おそらく移植不可能です。たとえば、Petscは両方のスタイルをサポートしています。
Bill Barth 2014

1
両方のスタイルをサポートすることは、MPIラッパーを作成するすべての人にとって必要なようです。
gnzlbg 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.