2012-06-24 10 views
8

私はgccOpenMPIを使用しています。 4つのプロセスを開始するために例えば、mpirunを使用しないOpenMPIプログラムの実行

mpirun -np 4 myprogram 

- 通常、私はmpirunラッパーを使用してMPIプログラムを実行します。

しかし、自動的に(おそらく上記の-np 4などのハードコードされたオプションを使用して)自動的に行うバイナリを簡単に生成できるかどうか疑問に思っていました。

私は次のような、私のプログラムを呼び出すCラッパーを書くことができます知っている:

#include <stdlib.h> 
#include <unistd.h> 

int main() { 
     char *options[] = { "mpirun", "-np", "4", "myprogram" }; 

     execvp("mpirun", options); 
     /* Ignoring return value to keep example simple */ 

     return EXIT_SUCCESS; 
} 

をしかし、これは少し不器用なようで、私は2つの実行ファイルの代わりに、1で終わります。

私は

gcc -o myprogram -I/usr/lib/openmpi/include/ \ 
    -lmpi -L/usr/lib/openmpi/lib/ myprogram.c 

のように、明示的にMPIライブラリをリンクすることを試みたが、私は実行可能ファイルを結果として実行したときに(私は引数として-np 0を与えていたかのように)、MPI_Comm_sizeセットはグループサイズとしてゼロ。グループサイズを渡すために環境変数などを使用できますか?あるいは、単一実行可能なMPIプログラム(Linuxとgccを使用して)を構築する別の方法がありますか?

+0

私は私の頭の上からどのようにわからないが、それを行うことができます。 私はこれを実行するプログラムをいくつか知っています。そこには本当の魔法はありません。自分でもできるシーンの裏にはたくさんのものがあります。 –

+0

私は正しく理解していますか?あなたは 'mpirun'をスキップしたいですか、何とか自動的に' mpirun'を呼び出したいですか? –

+0

@Hristo Iliev:静的なバイナリが1つあればいいです。 – Jay

答えて

6

。コメントに書いたように、コードがmpirun(提供されている場合)を実行する特別なオプションを使用することができます。 -launchmpi。 Open MPIでは、特別な環境変数を起動したMPIプロセスにエクスポートするので、さらに簡単です。 OMPI_COMM_WORLD_RANK。この変数が環境内に存在する場合、プログラムはmpirunから起動されたものであり、直接起動されていないことがわかります。

int main (int argc, char **argv) 
{ 
    int perform_launch = 0; 
    // Scan argv[] for special option like "-launchmpi" 
    // and set perform_launch if found 

    if (perform_launch || getenv("OMPI_COMM_WORLD_RANK") == NULL) 
    { 
     // #args = argc + 3 ("mpirun -np 4" added) + NULL 
     // #args should be reduced by one if "-launchmpi" is present 
     char **args = (char **)calloc(
      argc + (perform_launch ? 3 : 4), 
      sizeof(char *)); 
     args[0] = "mpirun"; 
     args[1] = "-np"; 
     args[2] = "4"; 
     // Copy the entire argv to the rest of args but skip "-launchmpi" 

     execvp("mpirun", args); 

     return EXIT_SUCCESS; 
    } 

    // Proceed as regular MPI code 
    MPI_Init(&argc, &argv); 
    ... 
    // Magic happens here 
    ... 
    MPI_Finalize(); 

    return EXIT_SUCCESS; 
} 

あなたはMPIジョブ内のプロセスの数を制御したい場合は、追加arugmentとしてそれを供給することができ、例えば:あなたはこの1つのチェックでは両方の方法を組み合わせることができます-launchmpi 12、または環境変数に置き換え、上記のコードで"4"の代わりにその値を使用します。

mpirunを使用しないと、MPI実行ファイルを一般に起動できないことに注意してください。後者はMPIランタイムの不可欠な部分であり、MPI実行可能ファイルの複数のコピーを起動するだけです。また、MPIコンパイララッパー(コンパイル時にmpicc -showmeを試してください)でコンパイルするときは、常にMPIライブラリに明示的にリンクしています。 MPIライブラリを静的にリンクすることはできますが(here参照)、MPIジョブを実行するためにはまだmpirunが必要です.AFAIKでは、少なくともOpen MPIではなく、mpirunの機能をプログラムに組み込む方法はありません。

+0

あなたの応答に感謝します - それは本当に便利です! – Jay

1

あなたはbashスクリプトでこれを行うことができます:私はそれを正しく取得した場合、あなたは自己起動MPIの実行をしたい

 
# If you change this script has executable (chmod +x script_name) 
# and if you have the current path in the PATH variable (add export PATH=.:$PATH in your .bashrc) 
#Then, you can run this has: script_name program_args 

mpirun -np 4 your_executable_name "[email protected]" 
+1

ほとんどの場合、 '$ *'ではなく、 '' $ @ ''がほしいと思うでしょう。そうしないと、単語分割にargsがつぶれてしまいます。 –

+0

ありがとう@ChrisDown私は私の答えを修正しました。 – RSFalcon7

+1

あなたの引数はまだ変更されます。引用符は重要です。 –

関連する問題