BALL  1.4.1
MPISupport.h
Go to the documentation of this file.
00001 // -*- Mode: C++; tab-width: 2; -*-
00002 // vi: set ts=2:
00003 //
00004 // $Id: MPISupport.h,v 1.1.2.4 2006/03/02 18:52:57 anhi Exp $
00005 //
00006 
00007 #ifndef BALL_SYSTEM_MPISUPPORT_H
00008 #define BALL_SYSTEM_MPISUPPORT_H
00009 
00010 #ifndef BALL_COMMON_H
00011 # include <BALL/common.h>
00012 #endif
00013 
00014 #ifndef BALL_DATATYPE_STRING_H
00015 # include <BALL/DATATYPE/string.h>
00016 #endif
00017 
00018 #ifndef BALL_MATHS_VECTOR3_H
00019 # include <BALL/MATHS/vector3.h>
00020 #endif
00021 
00022 #ifndef BALL_COMMON_EXCEPTION_H
00023 # include <BALL/COMMON/exception.h>
00024 #endif
00025 
00026 #include <iostream>
00027 
00028 #include <mpi.h>
00029 
00030 #if MPI_VERSION >= 2
00031 # define BALL_HAS_MPI2_SUPPORT TRUE
00032 #else
00033 # undef BALL_HAS_MPI2_SUPPORT
00034 #endif
00035 
00036 namespace BALL
00037 {
00038   class System;
00039   class Options;
00040 
00044   class BALL_EXPORT MPISupport
00045   {
00046     public:
00047 
00050       enum TAGS
00051       {
00052         TAG_SYSTEM,
00053         TAG_OPTIONS
00054       };
00055 
00059 
00065       MPISupport(MPI_Comm default_communicator = MPI_COMM_WORLD);
00066 
00081       MPISupport(int argc, char** argv, 
00082                  MPI_Comm default_communicator = MPI_COMM_WORLD, 
00083                  bool accept_communicator = true);
00084       
00089       ~MPISupport();
00091 
00095       
00097       Index getRank();
00098 
00100       Index getSize();
00101 
00103       MPI_Comm getDefaultCommunicator();
00104 
00106       void setDefaultCommunicator(MPI_Comm default_communicator);
00107 
00111       bool getFinalizeOnDestruct();
00112 
00114       void setFinalizeOnDestruct(bool new_value);
00115 
00120       void setMpiInfo(const MPI_Info &mpi_info);
00121 
00123       bool isMaster();
00124 
00134       void init(int argc, char** argv, bool accept_communicator = true);
00135 
00141       void setBarrier();
00142 
00149       void sendSystem(const System& system, bool broadcast = true, int receiver = 0);
00150 
00156       System* receiveSystem(bool broadcast = true, int source = MPI_ANY_SOURCE);
00157 
00164       void sendOptions(const Options& options, bool broadcast = true, int receiver = 0);
00165 
00171       Options* receiveOptions(bool broadcast = true, int source = MPI_ANY_SOURCE);
00172 
00178       template <typename valuetype>
00179       void distributeDatapoints(const std::vector<valuetype>& input, std::vector<valuetype>& our_share);
00180 
00184       template <typename valuetype>
00185       void acceptDatapoints(std::vector<valuetype>& our_share);
00186 
00191       template <typename valuetype>
00192       void combineDatapoints(const std::vector<valuetype>& our_share)
00193         throw(Exception::OutOfMemory);
00194 
00198       template <typename valuetype>
00199       void acceptCombinedDatapoints(std::vector<valuetype>& combined_set, std::vector<valuetype>& our_share)
00200         throw(Exception::OutOfMemory);
00201 
00210       void* distributeDatapoints(const void* input, int size, Size& numpoints, MPI_Datatype datatype);
00211 
00217       void* acceptDatapoints(Size& numpoints, MPI_Datatype datatype);
00218 
00224       void combineDatapoints(const void* input, int size, MPI_Datatype datatype);
00225 
00234       void* acceptCombinedDatapoints(const void* input, int size, Size& numpoints, MPI_Datatype datatype);
00235 
00268 #ifdef BALL_HAS_MPI2_SUPPORT
00269       Size spawn(const String& command, char *argv[], Size wanted_number_of_processes = 0, bool merge_communicator = true);
00270 #endif
00271       
00278       template <typename valuetype>
00279       valuetype getSum(valuetype& local_value);
00280       
00287       template <typename valuetype>
00288       valuetype getProduct(valuetype& local_value);
00289       
00297       template <typename valuetype>
00298       valuetype getMaximum(valuetype& local_value);
00299       
00307       template <typename valuetype>
00308       valuetype getMinimum(valuetype& local_value);
00310       
00311     protected:
00314       void registerTypes_();
00315 
00319       void sendPersistenceStream_(const std::ostringstream& stream, 
00320                                   int tag = MPI_ANY_TAG, bool broadcast = true, int receiver = 0);
00321       
00326       void receivePersistenceStream_(std::istringstream& in, int tag = MPI_ANY_TAG, 
00327                                      bool broadcast = true, int source = 0);  
00328 
00329       Index     rank_;
00330       Index     comm_size_;
00331       bool      finalize_on_destruct_;
00332       MPI_Comm  default_communicator_;
00333       MPI_Info  mpi_info_object_;
00334       MPI_Datatype  mpi_Vector3_float_type_;
00335       MPI_Datatype  mpi_Vector3_double_type_;
00336   };
00337 }
00338 #endif
00339 
00340 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines