Ошибка записи в файлы PBS MPI

У меня большие проблемы при записи некоторых данных в файлы с использованием MPI в кластере с PBS. Вот пример простой проблемной программы.

#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 ранга 0 делать это?

Это даст вам что-то вроде этого:

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

Может ли это работать для вас?

1

Другие решения


По вопросам рекламы [email protected]