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.txt
values.txt
Chain
編集:ここに私のコードの一部があります。
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 here
here
total nodes1
cout<<"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ポインタ違反が発生します。)他の/より良い方法はないと思います。