// author : Peter Unruh // Dient der Synchronisation in einem Cluster, // so dass falls ein Prozessor "found" meldet, // die Methode ClusterSync auf allen Prozessoren TRUE liefert. #ifndef _SA_Synchronizer_h_ #define _SA_Synchronizer_h_ #include #include "constants.h" //---- SA_Synchronizer ----------------------------------------------------------- //#define SHOW_NFOUND // falls definiert, wird mittlere Anzahl der founds mitberechnet class SA_Synchronizer { MPI_Comm cluster; // Der Cluster, in dem synchronisiert wird int me; // meine Nummer im cluster int nproc; // Anzahl der Prozessoren im cluster int ClusterSync_ready; // Interner Flag von ClusterSync; // TRUE falls req und costs geeignet gesetzt MPI_Request req, // req ist der Irecv-Request auf dem Slave, * reqs; // reqs[1],..,reqs[nproc-1] ist Liste der Isend-Requests auf dem Master int *arr_ind; // Arrays der Laenge nproc - nur auf dem Master ! MPI_Status *arr_stat; // float * costs; // Auf dem Master: costs[0..nproc-1] fuer die Feststellung des "Gewinners" /* costs[i] >= 0 <=> Proc i found, = -3 <=> i noch nicht bearbeitet = -2 <=> Isend zu i startet = -1 <=> Isend zu i completed,d.i empfangen */ int * founds; // Auf dem Master: Array aus Zeiger auf die Kosten der gefundenen Zustaende in costs // Tags fuer die Kommunikation int MasterSlave, SlaveMaster; int FoundTag; // MPI_Status status; // Status der letzten MPI-Operation void InitReqsCosts(void); int GetWinner(EXCHANGE_MODE exch_m, int nfound); // anhand der costs und founds den gewaehlten Uebergang bestimmen int GetWinner(EXCHANGE_MODE exch_m); // nur anhand der costs den gewaehlten Uebergang bestimmen public: SA_Synchronizer(MPI_Comm comm); SA_Synchronizer(); void SetCluster(MPI_Comm comm); ~SA_Synchronizer(); // Funktionen ClusterSync* liefern auf allen Prozessoren im Cluster 1, falls ein Prozessor // found setzt; zusaeztlich wird in diesem Fall root auf den Rang des entsprechend zu // exch_m ausgewaehlten Prozessors gesetzt ( anhang von cost). // Ist exch_m auf dem Master auf MESSAGE gesetzt (gleichzeitig found==1), // so wird root auf allen Prozessoren auf -1 gesetzt (Group und Old - Varianten fordern daf"ur // cost < 0 , was eine Einschr"ankung ist. // die Methode liefert dann stets 0; bool ClusterSyncGroup(int found, float cost, EXCHANGE_MODE exch_m, int * root); bool ClusterSyncOld(int found, float cost, EXCHANGE_MODE exch_m, int * root); bool ClusterSync(int found, float cost, EXCHANGE_MODE exch_m, int * root); bool ClusterSyncFirst(int found, float cost, EXCHANGE_MODE exch_m, int * root); bool ClusterSyncNext(int found, float cost, EXCHANGE_MODE exch_m, int * root); // diese Variante wird noch entwickelt // Nur der Master (me ==0) darf found auf true setzten; in diesem Fall werden alle Slaves benachrichtigt), // d.h. liefern true bool MasterSync(bool found = false); #ifdef SHOW_NFOUND int NfoundSum, Nfoundi; void ShowNfoundRatio(void); #endif }; #endif