写入PBS MPI文件时出错

Error writing to files PBS MPI

本文关键字:出错 文件 MPI PBS 写入      更新时间:2023-10-16

在使用PBS的集群上使用MPI向文件写入数据时,我遇到了一个大麻烦。这是一个简单的问题模拟程序的例子。

#include <mpi.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <unistd.h>
int main(int argc, char* argv[]){
int rank;
int size;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

// Define hostname
char hostname[128];
gethostname(hostname, 128);
// check and create dump directory
  struct stat buf;
  int rc;
  char *dir="Res";
  rc = stat( dir, &buf );
  if( rc ) // no dir, create
  { if( rank == 0 )
    {
      rc = mkdir( dir, 0771);
      if( rc )
      {std::ostringstream oss;
       oss << "Can't create dump directory ""
          << dir
          << """;
      }
    }
    else {
       sleep (2);
    }
  }
  else if( !S_ISDIR( buf.st_mode ) )
  {std::ostringstream oss;
   oss << "Path ""
       << dir
       << "" is not directory for dump";
  }

   MPI_Barrier(MPI_COMM_WORLD);
// Every process defines name of file for output (res_0, res_1, res_2.....)
std::ostringstream filename;
filename << dir << "/res_"<< rank;
// Open file 
std::ofstream file(filename.str().c_str());
// Output to file . Output seems like "I am 0 from 24. hostname"
file  << "I am " << rank << " from " << size << ".   " << hostname  << std::endl;
file.close();
MPI_Finalize();
return 0;
}

我用openmpi_intel-1.4.2编译它,使用命令

mpicxx -Wall test.cc -o test

然后我用脚本将这个程序排队:

#!/bin/bash
#PBS -N test
#PBS -l select=8:ncpus=6:mpiprocs=6
#PBS -l walltime=00:01:30
#PBS -m n
#PBS -e stderr.txt
#PBS -o stdout.txt
cd $PBS_O_WORKDIR
echo "I run on node: `uname -n`"
echo "My working directory is: $PBS_O_WORKDIR"
echo "Assigned to me nodes are:"
cat $PBS_NODEFILE
mpirun -hostfile $PBS_NODEFILE ./test 

我预料到这个结果:

1. New directory "Res" to be created
2. 8*6 different files (res_0, res_1, res_2, ...) to be written to the Res dir

但是只有第一个节点的res_*文件被写入(res_{0..5}),而其余的没有。

有什么问题吗?

谢谢!

好,让我们假设您在一个文件系统上运行,该文件系统一致地挂载在所有计算节点上。就是这样,对吧?所以我看到你的代码片段的主要问题是,所有的进程都在同一时间状态的目录,然后尝试创建它,如果它不存在。我不知道到底会发生什么,但我肯定这不是最聪明的主意。

既然本质上你想要的是目录和/或它的创建(如果需要)的串行完整性检查,为什么不让排名0的MPI进程来做呢?

它会给你这样的东西:

if ( rank == 0 ) { // Only master manages the directory creation
    int rc = stat( dir, &buf );
    ... // sanity check goes here and directory creation as well
    // calling MPI_Abort() in case of failure seems also a good idea
}
// all other processes wait here
MPI_Barrier( MPI_COMM_WORLD );
// now we know the directory exists and is accessible
// let's do our stuff

这个对你有用吗?