.shスクリプトでMPIを使用しますか?

.shスクリプトでMPIを使用しますか?

runPR.sh次のスクリプトがあります

DIR=/directory/buildagain/bin/Project
 FILELIST=$1

 while read FILE
 do
     echo "Processing ${FILE}..."
     ./makeInp.sh ${FILE} ${FILE} >INP/${FILE}.inp
     ${DIR} -PR INP/${FILE}.inp
 done < ${FILELIST}

シリアルプログラムの場合は、プログラムをmake入力して実行します。 (この行のみを含む)/directory/buildagain./runPR.sh values.txtvalues.txtChain

編集:ここに私のコードの一部があります。

 int main( int argc, char *argv[ ] )
 {
      MPI_Status status;
      MPI_Init(&argc,&argv); 
      if( strcmp(argv[1],"-PR") == 0 )
           runPR(argc-2, &argv[2]);
      return 0;
 }

 int runPR(int argc, char* argv[])
 { 
      cout<<"run here"<<endl;

      int mynode, totalnodes;
      int sum,startval,endval,accum;
      int master=0;

      MPI_Comm_size(MPI_COMM_WORLD, &totalnodes); // get totalnodes
      MPI_Comm_rank(MPI_COMM_WORLD, &mynode); // get mynode

      PROpt opt;
      Solve* ps = new Solve();
      cout<<"here1"<<endl;

      cout<<"total nodes "<<totalnodes<<endl;
      for(int j=0;j<totalnodes-1;j=j+1){

           cout<<"processor"<<mynode<<"  received from "<<j<<endl;

           ps->getFile(&opt,argv[0]);
      }
 }

と入力すると、 が 4 回印刷されたことがmpirun -np 4 ../directory/buildagain/bin/Project -PR INP/Chain.inpわかります。ただし、印刷された内容は表示されません。 1ではなく4が表示されます。そしてプログラムはちょうど停止しました。なぜこれですか?run hereheretotal nodes1cout<<"processor"<<mynode<<" received from "<<j<<endl;total nodes

答え1

結果を報告した後

total nodes=1

そして

This node=0 

4回印刷した後、私はあなたがこれを試しているという結論に達しました:mpirun -np 4 script-name.sh。これは、mpirunがMPI通信の意味を理解していない4つのシェルスクリプトのコピーを開始するために行われます。

もしあなたならできる何らかの方法でスクリプトでmpirunを起動し、(1)スクリプトはリモート環境ではなくローカルの「ヘッド」ノード環境で実行され、(2)スクリプトはプログラムの最後の息でなければなりませんexec。ノードの環境にある可能性があります。頭の上のファイルにアクセスできない場合があります。

したがって、スクリプトは次のようにする必要があります。

PROG="$1"; shift;
OPT="$2"; shift    
for FILE in "$@"
do
     echo "Processing ${FILE}..."
     ./makeInp.sh ${FILE} ${FILE} >INP/${FILE}.inp
done
exec $PROG $OPT "$@"

では、現在のノード/スレッドに対応するPROGインデックスを作成する必要があります。ARGV(超過しないことを確認してくださいargc。そうしないとNULLポインタ違反が発生します。)他の/より良い方法はないと思います。

関連情報