Usando MPI com um script .sh?

2

Eu tenho um script runPR.sh como abaixo

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}

Para o programa serial, executo o programa digitando make em /directory/buildagain e, em seguida, ./runPR.sh values.txt . ( values.txt contém apenas a linha Chain )

EDITAR: Aqui está uma pequena parte do meu código.

 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]);
      }
 }

Digitando mpirun -np 4 ../directory/buildagain/bin/Project -PR INP/Chain.inp , vejo run here , here , total nodes1 impresso 4 vezes. Mas eu não vejo cout<<"processor"<<mynode<<" received from "<<j<<endl; impresso, e eu esperava que total nodes mostrasse 4, não 1. Além disso, o programa simplesmente para. Por que isso acontece?

    
por user4352158 12.05.2015 / 00:33

1 resposta

1

Depois de reportar a saída como

total nodes=1

e

This node=0 

impresso 4 vezes, concluí que você está tentando isso: mpirun -np 4 script-name.sh . Isso acontece porque o mpirun está lançando 4 cópias de um script de shell que não entende a semântica da comunicação MPI.

Se você puder obter de alguma forma o mpirun de inicialização em um script, lembre-se de que (1) o script está sendo executado no ambiente de nó "head" local, não o remoto, (2) exec ao seu programa como sua última e última respiração, e (3) quando o programa é executado, ele está no ambiente possivelmente em outro nó - possivelmente não tendo acesso aos arquivos que você tinha na cabeça.

O script deve ficar assim:

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

Dentro de PROG , você terá que indexar ARGV para corresponder ao nó / thread atual. (Verifique se você não excedeu argc ou se receberá uma violação de ponteiro NULO.) Não acho que exista outra maneira melhor.

    
por 12.05.2015 / 20:06