Logo ROOT   6.14/05
Reference Guide
MPIProcess.h
Go to the documentation of this file.
1 // @(#)root/minuit2:$Id$
2 // Author: A. Lazzaro 2009
3 /***************************************************************************
4  * Package: Minuit2 *
5  * File: $Id$ *
6  * Author: Alfio Lazzaro, alfio.lazzaro@mi.infn.it *
7  * *
8  * Copyright: (C) 2008 by Universita' and INFN, Milan *
9  ***************************************************************************/
10 
11 #ifndef ROOT_Minuit2_MPIProcess
12 #define ROOT_Minuit2_MPIProcess
13 
14 // disable MPI calls
15 //#define MPIPROC
16 
17 #include "Minuit2/MnMatrix.h"
18 
19 #ifdef MPIPROC
20 #include "mpi.h"
21 #include <iostream>
22 #endif
23 
24 
25 namespace ROOT {
26 
27 namespace Minuit2 {
28 
29  class MPITerminate {
30  public:
32 #ifdef MPIPROC
33  if (MPI::Is_initialized() && !(MPI::Is_finalized())) {
34  std::cout << "Info --> MPITerminate:: End MPI on #"
35  << MPI::COMM_WORLD.Get_rank() << " processor"
36  << std::endl;
37 
38  MPI::Finalize();
39  }
40 #endif
41  }
42 
43  };
44 
45 
46  class MPIProcess {
47  public:
48  MPIProcess(unsigned int nelements, unsigned int indexComm);
49  ~MPIProcess();
50 
51  inline unsigned int NumElements4JobIn() const { return fNumElements4JobIn; }
52  inline unsigned int NumElements4JobOut() const { return fNumElements4JobOut; }
53 
54  inline unsigned int NumElements4Job(unsigned int rank) const
55  { return NumElements4JobIn()+((rank<NumElements4JobOut()) ? 1 : 0); }
56 
57  inline unsigned int StartElementIndex() const
58  { return ((fRank<NumElements4JobOut()) ? (fRank*NumElements4Job(fRank)) :
59  (fNelements-(fSize-fRank)*NumElements4Job(fRank))); }
60 
61  inline unsigned int EndElementIndex() const
62  { return StartElementIndex()+NumElements4Job(fRank); }
63 
64  inline unsigned int GetMPISize() const { return fSize; }
65  inline unsigned int GetMPIRank() const { return fRank; }
66 
67  bool SyncVector(ROOT::Minuit2::MnAlgebraicVector &mnvector);
68  bool SyncSymMatrixOffDiagonal(ROOT::Minuit2::MnAlgebraicSymMatrix &mnmatrix);
69 
70  static unsigned int GetMPIGlobalRank() { StartMPI(); return fgGlobalRank; }
71  static unsigned int GetMPIGlobalSize() { StartMPI(); return fgGlobalSize; }
72  static inline void StartMPI() {
73 #ifdef MPIPROC
74  if (!(MPI::Is_initialized())) {
75  MPI::Init();
76  std::cout << "Info --> MPIProcess::StartMPI: Start MPI on #"
77  << MPI::COMM_WORLD.Get_rank() << " processor"
78  << std::endl;
79  }
80  fgGlobalSize = MPI::COMM_WORLD.Get_size();
81  fgGlobalRank = MPI::COMM_WORLD.Get_rank();
82 #endif
83  }
84 
85  static void TerminateMPI() {
86 #ifdef MPIPROC
87  if (fgCommunicators[0]!=0 && fgCommunicators[1]!=0) {
88  delete fgCommunicators[0]; fgCommunicators[0] = 0; fgIndecesComm[0] = 0;
89  delete fgCommunicators[1]; fgCommunicators[1] = 0; fgIndecesComm[1] = 0;
90  }
91 
92  MPITerminate();
93 
94 #endif
95  }
96 
97  static bool SetCartDimension(unsigned int dimX, unsigned int dimY);
98  static bool SetDoFirstMPICall(bool doFirstMPICall = true);
99 
100  inline void SumReduce(const double& sub, double& total) {
101  total = sub;
102 
103 #ifdef MPIPROC
104  if (fSize>1) {
105  fgCommunicator->Allreduce(&sub,&total,1,MPI::DOUBLE,MPI::SUM);
106  }
107 #endif
108  }
109 
110  private:
111 
112 #ifdef MPIPROC
113  void MPISyncVector(double *ivector, int svector, double *ovector);
114 #endif
115 
116  private:
117  unsigned int fNelements;
118  unsigned int fSize;
119  unsigned int fRank;
120 
121  static unsigned int fgGlobalSize;
122  static unsigned int fgGlobalRank;
123 
124  static unsigned int fgCartSizeX;
125  static unsigned int fgCartSizeY;
126  static unsigned int fgCartDimension;
127  static bool fgNewCart;
128 
129  unsigned int fNumElements4JobIn;
130  unsigned int fNumElements4JobOut;
131 
132 #ifdef MPIPROC
133  static MPI::Intracomm *fgCommunicator;
134  static int fgIndexComm; // maximum 2 communicators, so index can be 0 and 1
135  static MPI::Intracomm *fgCommunicators[2]; // maximum 2 communicators
136  static unsigned int fgIndecesComm[2];
137 #endif
138 
139  };
140 
141 } // namespace Minuit2
142 } // namespace ROOT
143 
144 #endif
145 
146 
unsigned int fNumElements4JobOut
Definition: MPIProcess.h:130
Namespace for new ROOT classes and functions.
Definition: StringConv.hxx:21
static unsigned int fgGlobalSize
Definition: MPIProcess.h:121
void SumReduce(const double &sub, double &total)
Definition: MPIProcess.h:100
static void StartMPI()
Definition: MPIProcess.h:72
Class describing a symmetric matrix of size n.
Definition: LASymMatrix.h:51
static unsigned int GetMPIGlobalSize()
Definition: MPIProcess.h:71
static void TerminateMPI()
Definition: MPIProcess.h:85
static unsigned int fgCartDimension
Definition: MPIProcess.h:126
unsigned int fNumElements4JobIn
Definition: MPIProcess.h:129
unsigned int EndElementIndex() const
Definition: MPIProcess.h:61
unsigned int NumElements4JobOut() const
Definition: MPIProcess.h:52
static unsigned int GetMPIGlobalRank()
Definition: MPIProcess.h:70
void Init(TClassEdit::TInterpreterLookupHelper *helper)
Definition: TClassEdit.cxx:121
unsigned int StartElementIndex() const
Definition: MPIProcess.h:57
static unsigned int fgCartSizeX
Definition: MPIProcess.h:124
unsigned int GetMPISize() const
Definition: MPIProcess.h:64
static unsigned int fgGlobalRank
Definition: MPIProcess.h:122
unsigned int NumElements4Job(unsigned int rank) const
Definition: MPIProcess.h:54
static unsigned int fgCartSizeY
Definition: MPIProcess.h:125
unsigned int GetMPIRank() const
Definition: MPIProcess.h:65
static unsigned int total
unsigned int NumElements4JobIn() const
Definition: MPIProcess.h:51