Xmipp  v3.23.11-Nereus
Public Member Functions | Public Attributes | List of all members
ProgMPIRun Class Reference
Inheritance diagram for ProgMPIRun:
Inheritance graph
[legend]
Collaboration diagram for ProgMPIRun:
Collaboration graph
[legend]

Public Member Functions

 ProgMPIRun (int argc, char **argv)
 
void readParams ()
 
void defineParams ()
 
void show ()
 
void run ()
 
- Public Member Functions inherited from XmippProgram
const char * getParam (const char *param, int arg=0)
 
const char * getParam (const char *param, const char *subparam, int arg=0)
 
int getIntParam (const char *param, int arg=0)
 
int getIntParam (const char *param, const char *subparam, int arg=0)
 
double getDoubleParam (const char *param, int arg=0)
 
double getDoubleParam (const char *param, const char *subparam, int arg=0)
 
float getFloatParam (const char *param, int arg=0)
 
float getFloatParam (const char *param, const char *subparam, int arg=0)
 
void getListParam (const char *param, StringVector &list)
 
int getCountParam (const char *param)
 
bool checkParam (const char *param)
 
bool existsParam (const char *param)
 
void addParamsLine (const String &line)
 
void addParamsLine (const char *line)
 
ParamDefgetParamDef (const char *param) const
 
virtual void quit (int exit_code=0) const
 
virtual int tryRun ()
 
void initProgress (size_t total, size_t stepBin=60)
 
void setProgress (size_t value=0)
 
void endProgress ()
 
void processDefaultComment (const char *param, const char *left)
 
void setDefaultComment (const char *param, const char *comment)
 
virtual void initComments ()
 
void setProgramName (const char *name)
 
void addUsageLine (const char *line, bool verbatim=false)
 
void clearUsage ()
 
void addExampleLine (const char *example, bool verbatim=true)
 
void addSeeAlsoLine (const char *seeAlso)
 
void addKeywords (const char *keywords)
 
const char * name () const
 
virtual void usage (int verb=0) const
 
virtual void usage (const String &param, int verb=2)
 
int version () const
 
virtual void show () const
 
virtual void read (int argc, const char **argv, bool reportErrors=true)
 
virtual void read (int argc, char **argv, bool reportErrors=true)
 
void read (const String &argumentsLine)
 
 XmippProgram ()
 
 XmippProgram (int argc, const char **argv)
 
virtual ~XmippProgram ()
 

Public Attributes

FileName fn_commands
 
MPI_Status status
 
MpiNodenode
 
char szline [MAX_LINE+1]
 
- Public Attributes inherited from XmippProgram
bool doRun
 
bool runWithoutArgs
 
int verbose
 Verbosity level. More...
 
int debug
 

Additional Inherited Members

- Protected Member Functions inherited from XmippProgram
void defineCommons ()
 
- Protected Attributes inherited from XmippProgram
int errorCode
 
ProgramDefprogDef
 Program definition and arguments parser. More...
 
std::map< String, CommentListdefaultComments
 
int argc
 Original command line arguments. More...
 
const char ** argv
 

Detailed Description

Definition at line 35 of file mpi_run.cpp.

Constructor & Destructor Documentation

◆ ProgMPIRun()

ProgMPIRun::ProgMPIRun ( int  argc,
char **  argv 
)
inline

Definition at line 47 of file mpi_run.cpp.

48  {
49  node=new MpiNode(argc,argv);
50  if (!node->isMaster())
51  verbose=0;
52  }
int argc
Original command line arguments.
Definition: xmipp_program.h:86
const char ** argv
Definition: xmipp_program.h:87
int verbose
Verbosity level.
MpiNode * node
Definition: mpi_run.cpp:45
bool isMaster() const
Definition: xmipp_mpi.cpp:166

Member Function Documentation

◆ defineParams()

void ProgMPIRun::defineParams ( )
inlinevirtual

Function in which the param of each Program are defined.

Reimplemented from XmippProgram.

Definition at line 62 of file mpi_run.cpp.

63  {
64  addUsageLine("Run commands in a text file in a parallel environment");
65  addUsageLine("+You may use the tag MPI_BARRIER to separate execution blocks.");
66  addUsageLine("+You may use the tag MPI_NEWLINE to force a line break (this is useful for programs accepting parameters directly from stdin).");
67  addParamsLine("-i <commandFile> : File with commands in different lines");
68  }
void addUsageLine(const char *line, bool verbatim=false)
void addParamsLine(const String &line)

◆ readParams()

void ProgMPIRun::readParams ( )
inlinevirtual

Function in which each program will read parameters that it need. If some error occurs the usage will be printed out.

Reimplemented from XmippProgram.

Definition at line 54 of file mpi_run.cpp.

55  {
56  fn_commands = getParam("-i");
57  if (node->size < 2)
59  "This program cannot be executed in a single working node");
60  }
size_t size
Definition: xmipp_mpi.h:52
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
FileName fn_commands
Definition: mpi_run.cpp:39
const char * getParam(const char *param, int arg=0)
Incorrect argument received.
Definition: xmipp_error.h:113
MpiNode * node
Definition: mpi_run.cpp:45

◆ run()

void ProgMPIRun::run ( )
inlinevirtual

This function will be start running the program. it also should be implemented by derived classes.

Reimplemented from XmippProgram.

Definition at line 80 of file mpi_run.cpp.

81  {
82  if (node->rank == 0)
83  {
84  std::ifstream fh_in;
85  fh_in.open(fn_commands.c_str());
86  if (!fh_in)
87  REPORT_ERROR(ERR_IO_NOTOPEN, (std::string)"Cannot open " + fn_commands);
88  std::string line;
89  int number_of_node_waiting = 0; // max is nprocs -1
90  while (!fh_in.eof())
91  {
92  //wait until a server is free
93  MPI_Recv(0, 0, MPI_INT, MPI_ANY_SOURCE, 0,
94  MPI_COMM_WORLD, &status);
95  number_of_node_waiting++;
96  getline(fh_in, line);
97  line=findAndReplace(line,"MPI_NEWLINE","\n");
98  strcpy(szline, line.c_str());
99 
100  std::string::size_type loc = line.find("MPI_BARRIER", 0);
101  if (loc != std::string::npos)
102  {
103  while (number_of_node_waiting < (node->size - 1))
104  {
105  MPI_Recv(0, 0, MPI_INT, MPI_ANY_SOURCE, 0,
106  MPI_COMM_WORLD, &status);
107  number_of_node_waiting++;
108  }
109  while (number_of_node_waiting > 0)
110  {
111  MPI_Send(&szline, 1, MPI_CHAR, number_of_node_waiting,
112  TAG_WAIT, MPI_COMM_WORLD);
113  number_of_node_waiting--;
114  }
115  continue;
116  }
117 
118  //send work
119  MPI_Send(&szline, MAX_LINE, MPI_CHAR, status.MPI_SOURCE,
120  TAG_WORK, MPI_COMM_WORLD);
121  number_of_node_waiting--;
122  }
123 
124  fh_in.close();
125  for (size_t i = 1; i < node->size; i++)
126  MPI_Send(0, 0, MPI_INT, i, TAG_STOP, MPI_COMM_WORLD);
127  }
128  else
129  {
130  while (1)
131  {
132  //I am free
133  MPI_Send(0, 0, MPI_INT, 0, 0, MPI_COMM_WORLD);
134  //get your next task
135  MPI_Probe(0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
136  if (status.MPI_TAG == TAG_STOP)//I am free
137  break;
138  else if (status.MPI_TAG == TAG_WAIT)//wait
139  {
140  MPI_Recv(&szline, 1, MPI_CHAR, 0, TAG_WAIT, MPI_COMM_WORLD, &status);
141  continue;
142  }
143  else if (status.MPI_TAG == TAG_WORK)//work to do
144  {
145  MPI_Recv(&szline, MAX_LINE, MPI_CHAR, 0, TAG_WORK, MPI_COMM_WORLD, &status);
146  //do the job
147  if(strlen(szline)<1)
148  continue;
149  else
150  {
151  if (system(szline)==-1)
152  REPORT_ERROR(ERR_UNCLASSIFIED,"Cannot open shell");
153  }
154  }
155  else
156  std::cerr << "WRONG TAG RECEIVED" << std::endl;
157 
158  }
159  }
160 
161  }
size_t size
Definition: xmipp_mpi.h:52
Just to locate unclassified errors.
Definition: xmipp_error.h:192
#define REPORT_ERROR(nerr, ErrormMsg)
Definition: xmipp_error.h:211
FileName fn_commands
Definition: mpi_run.cpp:39
#define TAG_STOP
Definition: mpi_run.cpp:32
#define MAX_LINE
Definition: mpi_run.cpp:78
#define i
#define TAG_WORK
Definition: mpi_run.cpp:31
String findAndReplace(const String &tInput, const String &tFind, const String &tReplace)
char szline[MAX_LINE+1]
Definition: mpi_run.cpp:79
size_t rank
Definition: xmipp_mpi.h:52
MpiNode * node
Definition: mpi_run.cpp:45
File cannot be open.
Definition: xmipp_error.h:137
MPI_Status status
Definition: mpi_run.cpp:42
#define TAG_WAIT
Definition: mpi_run.cpp:33

◆ show()

void ProgMPIRun::show ( )
inline

Definition at line 70 of file mpi_run.cpp.

71  {
72  if (!verbose)
73  return;
74  std::cout << "Commands file: " << fn_commands << std::endl;
75  }
FileName fn_commands
Definition: mpi_run.cpp:39
int verbose
Verbosity level.

Member Data Documentation

◆ fn_commands

FileName ProgMPIRun::fn_commands

Command file

Definition at line 39 of file mpi_run.cpp.

◆ node

MpiNode* ProgMPIRun::node

Definition at line 45 of file mpi_run.cpp.

◆ status

MPI_Status ProgMPIRun::status

status after am MPI call

Definition at line 42 of file mpi_run.cpp.

◆ szline

char ProgMPIRun::szline[MAX_LINE+1]

Definition at line 79 of file mpi_run.cpp.


The documentation for this class was generated from the following file: