0

私はしばらく MPI を使用していますが、経験がありません。そこで、次の実装の一般的な構造についてアドバイスを求めるためにここにいます。たとえば、メインの C++ ファイルがあるとします。

MPI_Init(&narg,&arg);
int me,nprocs;
MPI_Comm_rank(MPI_COMM_WORLD,&me);
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);

int N = 10;

for (int i=0;i<N;i++) {
   //(1)do some stuff in parallel...
   //(2)gather results and write an input file for executable

   MPI_Barrier(MPI_COMM_WORLD);
   //(3)run executable in parallel.
   // which is usually run from command line as:
   // 
   // mpirun -np 6 external.exe < input.file
   //
   MPI_Barrier(MPI_COMM_WORLD);

   //(4)gather output from executable, distribute info among processors and keep running 
}
MPI_Finalize();

それは(3)で、それを行う方法を理解するのに問題があり、使用できるプロセッサの数を教えてくれます。私の混乱は、ある種の「実行」コマンドはおそらく単一のプロセッサ/インスタンスから実行する必要があるということです。では、それを機能させ、メインプログラムに提供されたすべてのプロセッサを並列実行可能ファイルに使用させるにはどうすればよいでしょうか? もし可能ならば。

p/s/私はここでスタックオーバーフローで同様の質問を見ましたが、それが可能かどうかについて明確な答えはありません。

4

1 に答える 1

0

exe を制御できますか、つまり、そのコードを変更できますか? その場合は、exe が必要な動作の単なるラッパーになるように再開発することをお勧めします。その後、実際のアクションをアプリケーションにリンクできます。

それができない場合は、マスター (ランク 0) プロセスから実行可能ファイルを呼び出して、他のプロセスを待機させることをお勧めします。非常に効率的ではありませんが、それは仕事をします:

if (me == 0) {
    system("mpirun -np 6 external.exe < input.file")
}

コマンドが終了するまで待機する方法を考え出す必要がありますが、 systemmpirunのドキュメントによると、からの戻り値がゼロかどうかを確認してから続行するのと同じくらい簡単なはずですsystem(...)(バリアの後、あなたの例では)。

于 2013-03-28T12:40:39.863 に答える