将 MPI 与 .sh 脚本一起使用?

将 MPI 与 .sh 脚本一起使用?

我有一个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]);
      }
 }

通过输入mpirun -np 4 ../directory/buildagain/bin/Project -PR INP/Chain.inp,我看到run here, here,total nodes1打印了 4 次。但我没有看到cout<<"processor"<<mynode<<" received from "<<j<<endl;打印出来,我希望total nodes显示 4,而不是 1。而且,程序只是停止了。为什么是这样?

答案1

在您报告得到输出后

total nodes=1

This node=0 

打印了 4 次,我得出的结论是你正在尝试这个:mpirun -np 4 script-name.sh。这样做是因为 mpirun 正在启动 4 个 shell 脚本副本,该脚本不理解 MPI 通信语义。

如果你以某种方式在脚本上启动 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,否则您将遇到空指针违规。)我认为没有其他/更好的方法。

相关内容