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
프로그램의 마지막 숨결이어야 하며, (3) 프로그램이 실행될 때 실행 중이면 다른 노드의 환경에 있을 수 있습니다. 머리 위의 파일에 액세스하지 못할 수도 있습니다.
따라서 스크립트는 다음과 같아야 합니다.
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
. 그렇지 않으면 널 포인터 위반이 발생합니다.) 다른/더 나은 방법은 없다고 생각합니다.