.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프로그램의 마지막 숨결이어야 하며, (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. 그렇지 않으면 널 포인터 위반이 발생합니다.) 다른/더 나은 방법은 없다고 생각합니다.

관련 정보