为什么 MPI/PETSc 只显示 1 个处理器,即使它适用于 helloworld?

计算科学 并行计算 C++ 宠物 mpi
2021-12-14 10:56:32

我是 Unix 和 MPI 的初学者。对于串行程序,我通过输入make然后/directory/buildagain运行程序./runPR.sh values.txtvalues.txt仅包含该行Chain

这是我的代码的一小部分。

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

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

      MPI_Status status;
      PetscMPIInt    rank,size;

      //bunch of code that assigns argv2 to include argv and some new strings and sets 
      //argc2=argc plus the  number of new string
      PetscInitialize(&argc2, &argv2,0,0);

      MPI_Comm_size(PETSC_COMM_WORLD,&size);
      MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
      PetscPrintf(PETSC_COMM_WORLD,"Number of processors = %d, rank = %d\n",size,rank);
      PetscSynchronizedPrintf(PETSC_COMM_WORLD,"synchronized rank = %d\n",rank);
      PetscSynchronizedFlush(PETSC_COMM_WORLD);//,PETSC_STDOUT);

      MPI_Barrier(PETSC_COMM_WORLD);

      PetscPrintf(PETSC_COMM_SELF,"[%d] Jumbled Hello World\n",rank);

      PROpt opt;
      Solve* ps = new Solve();

      PROpt opt;
      Solve* ps = new Solve();
      ps->getFile(&opt,argv[0]);
 }

通过键入mpirun -np 4 ./runPR.sh values.txt,我看到Number of processors = 1, rank = 0synchronized rank = 0打印了 4 次。但我没有看到synchronized rank = 1或 2 或 3 打印出来。为什么是这样?

这是run.PR.sh包含的内容

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

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

编辑:我能够让 helloworld PETSc 示例在http://www.mcs.anl.gov/petsc/petsc-current/src/sys/examples/tutorials/ex2.c.html正常工作

1个回答

我无法直接从这段代码中分辨出来,但这种行为是从未调用过 MPI_Init() 的代码的典型行为。我知道 PetscInitialize() 应该为您执行此操作,但我猜测由于您似乎未能将 argv2 和 argc2 分配给任何内容,因此在初始化期间出现了问题。我猜这段代码将无法按原样编译,因为在这个例子中甚至没有定义 argc2 和 argv2。