|
Nemo
2.2.0
|
00001 00029 #ifndef __MPIMANAGER_H 00030 #define __MPIMANAGER_H 00031 00032 #include <queue> 00033 #include <string> 00034 #include <map> 00035 #include "MPStatHandler.h" 00036 00037 #ifdef USE_MPI 00038 #include <mpi.h> 00039 #endif 00040 00047 class MPImanager { 00048 00049 public: 00050 MPImanager() {} 00051 virtual ~MPImanager() {} 00052 virtual unsigned int init( MPStatHandler *SH ) = 0; 00053 virtual void finish( MPStatHandler *SH, unsigned int *_gen, unsigned int _repl ); 00054 virtual void iterate( Metapop *_pop, MPStatHandler *SH, unsigned int *_gen, unsigned int *_repl ) = 0; 00055 00056 protected: 00057 double **buf_dbl; 00058 unsigned int **buf_int; 00059 unsigned int buf_stride, size; 00060 00061 }; 00062 00063 #ifdef USE_MPI 00064 00076 class MPImaster : public MPImanager { 00077 00078 public: 00079 MPImaster( const unsigned int count ); 00080 ~MPImaster() { delete[] _request; } 00081 unsigned int init( MPStatHandler *SH ); 00082 void finish( MPStatHandler *SH, unsigned int *_gen, unsigned int _repl ); 00083 void iterate( Metapop *_pop, MPStatHandler *SH, unsigned int *_gen, unsigned int *_repl ); 00084 00085 private: 00086 MPI::Request *_request; 00087 std::vector< unsigned int > slave_job; 00088 unsigned int waitSlave(); 00089 unsigned int assign( const unsigned int job, const unsigned int slave ); 00090 00091 }; 00092 00103 class MPIslave : public MPImanager { 00104 00105 public: 00106 MPIslave() {} 00107 unsigned int init( MPStatHandler *SH ); 00108 void iterate( Metapop *_pop, MPStatHandler *SH, unsigned int *_gen, unsigned int *_repl ); 00109 00110 }; 00111 #endif 00112 00120 class MPIenv { 00121 00122 public: 00123 MPIenv( int &argc, char **&argv, MPImanager *&_p ); 00124 static void abort( int i ); 00125 static void finish( MPImanager *p ); 00126 bool isMaster() const { return (rank==0); } 00127 unsigned int slaveCount() const { return size-1; } 00128 unsigned int slaveRank() const { return rank; } 00129 std::string hostName() const { return host; } 00130 00131 private: 00132 unsigned int size; 00133 unsigned int rank; 00134 std::string host; 00135 00136 }; 00137 00138 #endif
1.7.5.1 -- Nemo is hosted by