11

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

mpirun -np 4 myprogram

4つのプロセスを開始します。

ただし、それを自動的に実行するバイナリを簡単に生成できるかどうか疑問に思っていました(おそらく、-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;
}

しかし、これは少し不器用なようで、1つではなく2つの実行可能ファイルになってしまいます。

MPIライブラリを明示的にリンクしようとしました。

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

しかし、結果の実行可能ファイルを実行するMPI_Comm_sizeと、グループサイズとしてゼロが設定されます(-np 0引数として指定したかのように)。グループサイズを渡すために環境変数などを使用できますか?または、(Linuxとを使用して)単一の実行可能MPIプログラムを構築する別の方法はありgccますか?

4

2 に答える 2

11

正しく取得できれば、自己起動型のMPI実行可能ファイルが必要です。コメントに書いたように、mpirun提供された場合にコードを実行する特別なオプションを使用できます-launchmpi。Open MPIを使用すると、特別な環境変数を起動されたMPIプロセスにエクスポートするため、さらに簡単になりますOMPI_COMM_WORLD_RANKmpirunこの変数が環境に存在する場合は、プログラムが直接ではなく、から起動されたことがわかります。これを1回のチェックで両方の方法を組み合わせることができます。

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ジョブのプロセス数を制御する場合は、追加の拡張機能として、または環境変数として指定し、上記のコードの-launchmpi 12代わりにその値を使用できます。"4"

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

于 2012-06-25T08:15:43.870 に答える
2

これはbashスクリプトで実行できます。

#変更した場合、このスクリプトには実行可能ファイルがあります(chmod + x script_name)
#そして、PATH変数に現在のパスがある場合(.bashrcにexport PATH =。:$ PATHを追加します)
#次に、これを実行できます:script_name program_args

mpirun -np 4 your_executable_name "$ @"
于 2012-06-24T19:06:42.900 に答える