diff --git a/trunk/paradiseo-peo/src/core/communicable.cpp b/trunk/paradiseo-peo/src/core/communicable.cpp index 3caf6ee77..b6beca2ad 100644 --- a/trunk/paradiseo-peo/src/core/communicable.cpp +++ b/trunk/paradiseo-peo/src/core/communicable.cpp @@ -46,6 +46,7 @@ static std :: map comm_to_key; /* Map of regist unsigned Communicable :: num_comm = 0; + Communicable :: Communicable () { comm_to_key [this] = key = ++ num_comm; @@ -70,7 +71,7 @@ Communicable * getCommunicable (COMM_ID __key) { } COMM_ID getKey (const Communicable * __comm) { - + return comm_to_key [__comm]; } diff --git a/trunk/paradiseo-peo/src/core/communicable.h b/trunk/paradiseo-peo/src/core/communicable.h index 7ec179d1a..4d0dae9f2 100644 --- a/trunk/paradiseo-peo/src/core/communicable.h +++ b/trunk/paradiseo-peo/src/core/communicable.h @@ -47,10 +47,10 @@ class Communicable { public : Communicable (); - + virtual ~ Communicable (); - COMM_ID getKey (); + COMM_ID getKey (); void lock (); /* It suspends the current process if the semaphore is locked */ void unlock (); /* It unlocks the shared semaphore */ @@ -67,7 +67,7 @@ protected : COMM_ID key; sem_t sem_lock; - + sem_t sem_stop; }; @@ -75,6 +75,4 @@ extern void initCommunicableEnv (); extern Communicable * getCommunicable (COMM_ID __key); -//extern COMM_ID getKey (const Communicable * __comm); - #endif diff --git a/trunk/paradiseo-peo/src/core/cooperative.h b/trunk/paradiseo-peo/src/core/cooperative.h index 573c06805..efdcfebe4 100644 --- a/trunk/paradiseo-peo/src/core/cooperative.h +++ b/trunk/paradiseo-peo/src/core/cooperative.h @@ -51,7 +51,7 @@ public : void setOwner (Runner & __runner); virtual void pack () = 0; - + virtual void unpack () = 0; void send (Cooperative * __coop); diff --git a/trunk/paradiseo-peo/src/core/eoVector_mesg.h b/trunk/paradiseo-peo/src/core/eoVector_mesg.h index f5da8945e..ccf6fbf9c 100644 --- a/trunk/paradiseo-peo/src/core/eoVector_mesg.h +++ b/trunk/paradiseo-peo/src/core/eoVector_mesg.h @@ -44,7 +44,14 @@ template void pack (const eoVector & __v) { - pack (__v.fitness ()) ; + if (__v.invalid()) { + pack((unsigned)0); + } + else { + pack((unsigned)1); + pack (__v.fitness ()); + } + unsigned len = __v.size (); pack (len); for (unsigned i = 0 ; i < len; i ++) @@ -53,9 +60,16 @@ template void pack (const eoVector & __v) { template void unpack (eoVector & __v) { - F fit; - unpack (fit); - __v.fitness (fit); + unsigned valid; unpack(valid); + + if (! valid) { + __v.invalidate(); + } + else { + F fit; + unpack (fit); + __v.fitness (fit); + } unsigned len; unpack (len); diff --git a/trunk/paradiseo-peo/src/core/messaging.h b/trunk/paradiseo-peo/src/core/messaging.h index 0a632fa05..a5d7246ed 100644 --- a/trunk/paradiseo-peo/src/core/messaging.h +++ b/trunk/paradiseo-peo/src/core/messaging.h @@ -71,13 +71,13 @@ extern void pack (const char * __str); /* Pointer */ template void pack (const T * __ptr) { - + pack ((unsigned long) __ptr); } /* Pair */ template void pack (const std :: pair & __pair) { - + pack (__pair.first); pack (__pair.second); } @@ -116,7 +116,7 @@ extern void unpack (char * __str); /* Pointer */ template void unpack (T * & __ptr) { - + unsigned long p; unpack (p); __ptr = (T *) p; @@ -124,10 +124,9 @@ template void unpack (T * & __ptr) { /* Pair */ template void unpack (std :: pair & __pair) { - + unpack (__pair.first); unpack (__pair.second); } - #endif diff --git a/trunk/paradiseo-peo/src/core/peo_debug.cpp b/trunk/paradiseo-peo/src/core/peo_debug.cpp index bd0d346ee..dc79f09fd 100644 --- a/trunk/paradiseo-peo/src/core/peo_debug.cpp +++ b/trunk/paradiseo-peo/src/core/peo_debug.cpp @@ -50,12 +50,14 @@ #define DEBUG_PATH "./log/" + static bool debug = true; static char host [MAX_BUFF_SIZE]; std :: vector files; + void setDebugMode (bool __dbg) { debug = __dbg; @@ -65,7 +67,7 @@ void setDebugMode (bool __dbg) { extern int getNodeRank (); void initDebugging () { - + mkdir (DEBUG_PATH, S_IRWXU); // files.push_back (stdout); char buff [MAX_BUFF_SIZE]; diff --git a/trunk/paradiseo-peo/src/core/peo_fin.cpp b/trunk/paradiseo-peo/src/core/peo_fin.cpp index c6b41cceb..8c0bf3ff4 100644 --- a/trunk/paradiseo-peo/src/core/peo_fin.cpp +++ b/trunk/paradiseo-peo/src/core/peo_fin.cpp @@ -44,7 +44,6 @@ void peo :: finalize () { printDebugMessage ("waiting for the termination of all threads"); joinRunners (); - finalizeRMC (); printDebugMessage ("this is the end"); diff --git a/trunk/paradiseo-peo/src/core/peo_init.cpp b/trunk/paradiseo-peo/src/core/peo_init.cpp index f90f27476..31af40b19 100644 --- a/trunk/paradiseo-peo/src/core/peo_init.cpp +++ b/trunk/paradiseo-peo/src/core/peo_init.cpp @@ -38,11 +38,14 @@ #include "peo_init.h" #include "peo_param.h" + #include "peo_debug.h" #include "rmc.h" +#include "runner.h" extern void initCommunicableEnv (); +extern void initBuffers (); extern void initThreadsEnv (); extern void initReactiveThreadsEnv (); @@ -50,10 +53,14 @@ extern void initReactiveThreadsEnv (); extern void initRunnersEnv (); extern void initWorkersEnv (); +extern void initScheduler (); + static void initExecutionEnv() { initCommunicableEnv (); + initBuffers (); + initScheduler(); initThreadsEnv (); initReactiveThreadsEnv (); @@ -62,27 +69,28 @@ static void initExecutionEnv() { initWorkersEnv (); } + namespace peo { int * argc; - + char * * * argv; void init (int & __argc, char * * & __argv) { argc = & __argc; - + argv = & __argv; /* Initializing the execution environment */ initExecutionEnv(); - /* Initializing the the Resource Management and Communication */ - initRMC (__argc, __argv); - /* Loading the common parameters */ loadParameters (__argc, __argv); + /* Initializing the the Resource Management and Communication */ + initRMC ( *peo::argc, *peo::argv); + /* */ initDebugging (); } diff --git a/trunk/paradiseo-peo/src/core/peo_init.h b/trunk/paradiseo-peo/src/core/peo_init.h index b578cb501..9b4a90362 100644 --- a/trunk/paradiseo-peo/src/core/peo_init.h +++ b/trunk/paradiseo-peo/src/core/peo_init.h @@ -40,9 +40,9 @@ namespace peo { extern int * argc; - + extern char * * * argv; - + extern void init (int & __argc, char * * & __argv); } diff --git a/trunk/paradiseo-peo/src/core/peo_param.cpp b/trunk/paradiseo-peo/src/core/peo_param.cpp index a6023430e..6e3f4b6e5 100644 --- a/trunk/paradiseo-peo/src/core/peo_param.cpp +++ b/trunk/paradiseo-peo/src/core/peo_param.cpp @@ -40,7 +40,6 @@ #include "peo_debug.h" - void peo :: loadParameters (int & __argc, char * * & __argv) { eoParser parser (__argc, __argv); diff --git a/trunk/paradiseo-peo/src/core/peo_param.h b/trunk/paradiseo-peo/src/core/peo_param.h index fd00bfc28..4ec838e0b 100644 --- a/trunk/paradiseo-peo/src/core/peo_param.h +++ b/trunk/paradiseo-peo/src/core/peo_param.h @@ -38,7 +38,7 @@ #define __peo_param_h namespace peo { - + extern void loadParameters (int & __argc, char * * & __argv); } diff --git a/trunk/paradiseo-peo/src/core/peo_run.cpp b/trunk/paradiseo-peo/src/core/peo_run.cpp index ceb01da6f..166a45a44 100644 --- a/trunk/paradiseo-peo/src/core/peo_run.cpp +++ b/trunk/paradiseo-peo/src/core/peo_run.cpp @@ -34,11 +34,11 @@ * */ -#include "peo_init.h" #include "peo_run.h" #include "rmc.h" #include "runner.h" + void peo :: run () { startRunners (); diff --git a/trunk/paradiseo-peo/src/core/peo_run.h b/trunk/paradiseo-peo/src/core/peo_run.h index e4bcc55c6..b5ca43365 100644 --- a/trunk/paradiseo-peo/src/core/peo_run.h +++ b/trunk/paradiseo-peo/src/core/peo_run.h @@ -38,7 +38,7 @@ #define __peo_run_h namespace peo { - + extern void run (); } diff --git a/trunk/paradiseo-peo/src/core/reac_thread.cpp b/trunk/paradiseo-peo/src/core/reac_thread.cpp index ca341e475..bd669948f 100644 --- a/trunk/paradiseo-peo/src/core/reac_thread.cpp +++ b/trunk/paradiseo-peo/src/core/reac_thread.cpp @@ -40,6 +40,7 @@ static bool the_end = false; static std :: vector reac_threads; + ReactiveThread :: ReactiveThread () { reac_threads.push_back (this); diff --git a/trunk/paradiseo-peo/src/core/reac_thread.h b/trunk/paradiseo-peo/src/core/reac_thread.h index 91dad6221..79619090a 100644 --- a/trunk/paradiseo-peo/src/core/reac_thread.h +++ b/trunk/paradiseo-peo/src/core/reac_thread.h @@ -43,14 +43,14 @@ class ReactiveThread : public Thread { - + public: /* Ctor */ ReactiveThread (); void sleep (); - + void wakeUp (); private: @@ -62,6 +62,4 @@ extern void initReactiveThreadsEnv (); extern void stopReactiveThreads (); -extern bool theEnd (); - #endif /*REAC_THREAD_H_*/ diff --git a/trunk/paradiseo-peo/src/core/ring_topo.cpp b/trunk/paradiseo-peo/src/core/ring_topo.cpp index 5dbf9933d..c52ebb454 100644 --- a/trunk/paradiseo-peo/src/core/ring_topo.cpp +++ b/trunk/paradiseo-peo/src/core/ring_topo.cpp @@ -43,7 +43,7 @@ void RingTopology :: setNeighbors (Cooperative * __mig, __to.clear () ; int len = mig.size () ; - + for (int i = 0 ; i < len ; i ++) if (mig [i] == __mig) { __from.push_back (mig [(i - 1 + len) % len]) ; diff --git a/trunk/paradiseo-peo/src/core/ring_topo.h b/trunk/paradiseo-peo/src/core/ring_topo.h index 40d7405c6..363a69850 100644 --- a/trunk/paradiseo-peo/src/core/ring_topo.h +++ b/trunk/paradiseo-peo/src/core/ring_topo.h @@ -40,9 +40,9 @@ #include "topology.h" class RingTopology : public Topology { - + public : - + void setNeighbors (Cooperative * __mig, std :: vector & __from, std :: vector & __to); diff --git a/trunk/paradiseo-peo/src/core/runner.cpp b/trunk/paradiseo-peo/src/core/runner.cpp index 199ae5a2a..624dd8578 100644 --- a/trunk/paradiseo-peo/src/core/runner.cpp +++ b/trunk/paradiseo-peo/src/core/runner.cpp @@ -95,50 +95,19 @@ Runner * getRunner (RUNNER_ID __key) { return dynamic_cast (getCommunicable (__key)); } -void packExecutionContext () { - - num_local_exec_runners = 0; - for (unsigned i = 0; i < the_runners.size (); i ++) - if (the_runners [i] -> isAssignedLocally ()) num_local_exec_runners ++; - pack(num_local_exec_runners); -} - -void unpackExecutionContext () { - - unsigned num_remote_runners; - unpack(num_remote_runners); - num_exec_runners += num_remote_runners; -} - void initializeContext () { - initMessage (); - packExecutionContext (); - sendMessageToAll (EXECUTION_CONTEXT_TAG); + num_local_exec_runners = 0; - int src, tag; - for (unsigned i = 0; i < getNumberOfNodes(); i ++) { - - cleanBuffers (); - waitMessage (); - - probeMessage ( src, tag ); - receiveMessage( src, tag ); - - initMessage (); - unpackExecutionContext (); + // setting up the execution IDs & counting the number of local exec. runners + for (unsigned i = 0; i < the_runners.size (); i ++) { + the_runners [i] -> setExecutionID ( my_node -> execution_id_run[ i ] ); + if (the_runners [i] -> isAssignedLocally ()) num_local_exec_runners ++; } - cleanBuffers (); + collectiveCountOfRunners( &num_local_exec_runners, &num_exec_runners ); - // setting up the execution IDs - for (unsigned i = 0; i < the_runners.size (); i ++) - the_runners [i] -> setExecutionID ( my_node -> execution_id_run[ i ] ); - - - // synchronizing - all the nodes have to finish initializing - // the context before actually executing the runners - synchronizeNodes (); + // synchronizeNodes (); for (unsigned i = 0; i < the_runners.size (); i ++) if (the_runners [i] -> isAssignedLocally ()) the_runners [i] -> notifyContextInitialized (); @@ -217,6 +186,7 @@ void unpackTerminationOfRunner () { printDebugMessage ("All the runners have terminated - now stopping the reactive threads."); stopReactiveThreads (); + printDebugMessage ("Reactive threads stopped!"); } } diff --git a/trunk/paradiseo-peo/src/core/service.cpp b/trunk/paradiseo-peo/src/core/service.cpp index 8bf981af0..322769fe5 100644 --- a/trunk/paradiseo-peo/src/core/service.cpp +++ b/trunk/paradiseo-peo/src/core/service.cpp @@ -40,7 +40,7 @@ void Service :: setOwner (Thread & __owner) { owner = & __owner; } - + Thread * Service :: getOwner () { return owner; diff --git a/trunk/paradiseo-peo/src/core/service.h b/trunk/paradiseo-peo/src/core/service.h index fda8daf78..3e48ebd80 100644 --- a/trunk/paradiseo-peo/src/core/service.h +++ b/trunk/paradiseo-peo/src/core/service.h @@ -48,7 +48,7 @@ class Service : public Communicable { public : void setOwner (Thread & __owner); - + Thread * getOwner (); void requestResourceRequest (unsigned __how_many = 1); @@ -58,7 +58,7 @@ public : virtual void unpackData (); virtual void execute (); - + virtual void packResult (); virtual void unpackResult (); diff --git a/trunk/paradiseo-peo/src/core/thread.cpp b/trunk/paradiseo-peo/src/core/thread.cpp index e1fa309c8..0c7ba956b 100644 --- a/trunk/paradiseo-peo/src/core/thread.cpp +++ b/trunk/paradiseo-peo/src/core/thread.cpp @@ -42,8 +42,9 @@ static std :: vector threads; unsigned num_act = 0; + Thread :: Thread () { - + threads.push_back (this); act = false; } @@ -53,8 +54,6 @@ Thread :: ~ Thread () { /* Nothing ! */ } -extern int getNodeRank (); - void Thread :: setActive () { if (! act) { @@ -70,7 +69,7 @@ void Thread :: setPassive () { act = false; num_act --; - } + } } void initThreadsEnv () { diff --git a/trunk/paradiseo-peo/src/core/thread.h b/trunk/paradiseo-peo/src/core/thread.h index 4f4925c3d..42b1c0edb 100644 --- a/trunk/paradiseo-peo/src/core/thread.h +++ b/trunk/paradiseo-peo/src/core/thread.h @@ -42,7 +42,7 @@ /* A high-level thread */ class Thread { - + public: /* Ctor */ @@ -50,7 +50,7 @@ public: /* Dtor */ virtual ~ Thread (); - + /* Go ! */ virtual void start () = 0; @@ -59,7 +59,7 @@ public: (but it may receive messages) */ private : - + bool act; }; diff --git a/trunk/paradiseo-peo/src/core/topology.cpp b/trunk/paradiseo-peo/src/core/topology.cpp index 4a685b406..6e6ed0779 100644 --- a/trunk/paradiseo-peo/src/core/topology.cpp +++ b/trunk/paradiseo-peo/src/core/topology.cpp @@ -37,12 +37,11 @@ #include "topology.h" Topology :: ~ Topology () { - + /* Nothing ! */ } void Topology :: add (Cooperative & __mig) { - - mig.push_back (& __mig) ; -} + mig.push_back (& __mig) ; +} diff --git a/trunk/paradiseo-peo/src/peoEA.h b/trunk/paradiseo-peo/src/peoEA.h index a059d56a0..c2604d1ce 100644 --- a/trunk/paradiseo-peo/src/peoEA.h +++ b/trunk/paradiseo-peo/src/peoEA.h @@ -80,48 +80,48 @@ //! ...     //! template < class EOT > class peoEA : public Runner - { +{ - public: +public: - //! Constructor for the evolutionary algorithm object - several basic parameters have to be specified, - //! allowing for different levels of parallelism. Depending on the requirements, a sequential or a parallel - //! evaluation operator may be specified or, in the same manner, a sequential or a parallel transformation - //! operator may be given as parameter. Out of the box objects may be provided, from the EO package, for example, - //! or custom defined ones may be specified, provided that they are derived from the correct base classes. - //! - //! @param eoContinue< EOT >& __cont - continuation criterion specifying whether the algorithm should continue or not; - //! @param peoPopEval< EOT >& __pop_eval - evaluation operator; it allows the specification of parallel evaluation operators, aggregate evaluation functions, etc.; - //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of offspring individuals; - //! @param peoTransform< EOT >& __trans - transformation operator, i.e. crossover and mutation; allows for sequential or parallel transform; - //! @param eoReplacement< EOT >& __replace - replacement strategy for integrating the offspring individuals in the initial population; - peoEA( - eoContinue< EOT >& __cont, - peoPopEval< EOT >& __pop_eval, - eoSelect< EOT >& __select, - peoTransform< EOT >& __trans, - eoReplacement< EOT >& __replace - ); + //! Constructor for the evolutionary algorithm object - several basic parameters have to be specified, + //! allowing for different levels of parallelism. Depending on the requirements, a sequential or a parallel + //! evaluation operator may be specified or, in the same manner, a sequential or a parallel transformation + //! operator may be given as parameter. Out of the box objects may be provided, from the EO package, for example, + //! or custom defined ones may be specified, provided that they are derived from the correct base classes. + //! + //! @param eoContinue< EOT >& __cont - continuation criterion specifying whether the algorithm should continue or not; + //! @param peoPopEval< EOT >& __pop_eval - evaluation operator; it allows the specification of parallel evaluation operators, aggregate evaluation functions, etc.; + //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of offspring individuals; + //! @param peoTransform< EOT >& __trans - transformation operator, i.e. crossover and mutation; allows for sequential or parallel transform; + //! @param eoReplacement< EOT >& __replace - replacement strategy for integrating the offspring individuals in the initial population; + peoEA( + eoContinue< EOT >& __cont, + peoPopEval< EOT >& __pop_eval, + eoSelect< EOT >& __select, + peoTransform< EOT >& __trans, + eoReplacement< EOT >& __replace + ); - //! Evolutionary algorithm function - a side effect of the fact that the class is derived from the Runner class, - //! thus requiring the existence of a run function, the algorithm being executed on a distinct thread. - void run(); + //! Evolutionary algorithm function - a side effect of the fact that the class is derived from the Runner class, + //! thus requiring the existence of a run function, the algorithm being executed on a distinct thread. + void run(); - //! Function operator for specifying the population to be associated with the algorithm. - //! - //! @param eoPop< EOT >& __pop - initial population of the algorithm, to be iteratively evolved; - void operator()( eoPop< EOT >& __pop ); - - private: + //! Function operator for specifying the population to be associated with the algorithm. + //! + //! @param eoPop< EOT >& __pop - initial population of the algorithm, to be iteratively evolved; + void operator()( eoPop< EOT >& __pop ); - eoContinue< EOT >& cont; - peoPopEval< EOT >& pop_eval; - eoSelect< EOT >& select; - peoTransform< EOT >& trans; - eoReplacement< EOT >& replace; - eoPop< EOT >* pop; - }; +private: + + eoContinue< EOT >& cont; + peoPopEval< EOT >& pop_eval; + eoSelect< EOT >& select; + peoTransform< EOT >& trans; + eoReplacement< EOT >& replace; + eoPop< EOT >* pop; +}; template < class EOT > peoEA< EOT > :: peoEA( @@ -150,30 +150,29 @@ template< class EOT > void peoEA< EOT > :: operator ()( eoPop< EOT >& __pop ) template< class EOT > void peoEA< EOT > :: run() { - printDebugMessage( "performing the first evaluation of the population." ); + printDebugMessage( "peoEA: performing the first evaluation of the population." ); pop_eval( *pop ); do - { + { - eoPop< EOT > off; + eoPop< EOT > off; - printDebugMessage( "performing the selection step." ); - select( *pop, off ); - trans( off ); + printDebugMessage( "peoEA: performing the selection step." ); + select( *pop, off ); + trans( off ); - printDebugMessage( "performing the evaluation of the population." ); + printDebugMessage( "peoEA: performing the evaluation of the population." ); - pop_eval( off ); + pop_eval( off ); - printDebugMessage( "performing the replacement of the population." ); - replace( *pop, off ); + printDebugMessage( "peoEA: performing the replacement of the population." ); + replace( *pop, off ); - printDebugMessage( "deciding of the continuation." ); + printDebugMessage( "peoEA: deciding of the continuation." ); - } + } while ( cont( *pop ) ); } - #endif diff --git a/trunk/paradiseo-peo/src/peoEvalFunc.h b/trunk/paradiseo-peo/src/peoEvalFunc.h index b6e8486f3..b19e27335 100644 --- a/trunk/paradiseo-peo/src/peoEvalFunc.h +++ b/trunk/paradiseo-peo/src/peoEvalFunc.h @@ -43,20 +43,20 @@ template< class EOT, class FitT = EOT::Fitness, class FunctionArg = const EOT& > template< class EOT, class FitT = typename EOT::Fitness, class FunctionArg = const EOT& > #endif struct peoEvalFunc: public eoEvalFunc +{ + + peoEvalFunc( FitT (* _eval)( FunctionArg ) ) + : eoEvalFunc(), evalFunc( _eval ) + {}; + + virtual void operator() ( EOT & _peo ) { - - peoEvalFunc( FitT (* _eval)( FunctionArg ) ) - : eoEvalFunc(), evalFunc( _eval ) - {}; - - virtual void operator() ( EOT & _peo ) - { - _peo.fitness((*evalFunc)( _peo )); - }; + _peo.fitness((*evalFunc)( _peo )); + }; private: - FitT (* evalFunc )( FunctionArg ); - }; + FitT (* evalFunc )( FunctionArg ); +}; #endif diff --git a/trunk/paradiseo-peo/src/peoNoAggEvalFunc.h b/trunk/paradiseo-peo/src/peoNoAggEvalFunc.h index d6fa02152..3e169341e 100644 --- a/trunk/paradiseo-peo/src/peoNoAggEvalFunc.h +++ b/trunk/paradiseo-peo/src/peoNoAggEvalFunc.h @@ -45,13 +45,13 @@ //! The class is provided as a mean of declaring that no aggregation is required for the evaluation function - the fitness //! value is explicitly specified. template< class EOT > class peoNoAggEvalFunc : public peoAggEvalFunc< EOT > - { +{ - public : +public : - //! Operator which sets as fitness the __fit value for the __sol individual - void operator()( EOT& __sol, const typename EOT :: Fitness& __fit ); - }; + //! Operator which sets as fitness the __fit value for the __sol individual + void operator()( EOT& __sol, const typename EOT :: Fitness& __fit ); +}; template< class EOT > void peoNoAggEvalFunc< EOT > :: operator()( EOT& __sol, const typename EOT :: Fitness& __fit ) diff --git a/trunk/paradiseo-peo/src/peoParaSGATransform.h b/trunk/paradiseo-peo/src/peoParaSGATransform.h index 08f6bb1cb..38cb7a62a 100644 --- a/trunk/paradiseo-peo/src/peoParaSGATransform.h +++ b/trunk/paradiseo-peo/src/peoParaSGATransform.h @@ -47,54 +47,54 @@ extern int getNodeRank(); template< class EOT > class peoParaSGATransform : public peoTransform< EOT > - { +{ - public: +public: - using peoTransform< EOT > :: requestResourceRequest; - using peoTransform< EOT > :: resume; - using peoTransform< EOT > :: stop; - using peoTransform< EOT > :: getOwner; + using peoTransform< EOT > :: requestResourceRequest; + using peoTransform< EOT > :: resume; + using peoTransform< EOT > :: stop; + using peoTransform< EOT > :: getOwner; - peoParaSGATransform( + peoParaSGATransform( - eoQuadOp< EOT >& __cross, - double __cross_rate, - eoMonOp< EOT >& __mut, - double __mut_rate - ); + eoQuadOp< EOT >& __cross, + double __cross_rate, + eoMonOp< EOT >& __mut, + double __mut_rate + ); - void operator()( eoPop< EOT >& __pop ); + void operator()( eoPop< EOT >& __pop ); - void packData(); + void packData(); - void unpackData(); + void unpackData(); - void execute(); + void execute(); - void packResult(); + void packResult(); - void unpackResult(); + void unpackResult(); - void notifySendingData(); - void notifySendingAllResourceRequests(); + void notifySendingData(); + void notifySendingAllResourceRequests(); - private: +private: - eoQuadOp< EOT >& cross; - double cross_rate; + eoQuadOp< EOT >& cross; + double cross_rate; - eoMonOp< EOT >& mut; - double mut_rate; + eoMonOp< EOT >& mut; + double mut_rate; - unsigned idx; + unsigned idx; - eoPop< EOT >* pop; + eoPop< EOT >* pop; - EOT father, mother; + EOT father, mother; - unsigned num_term; - }; + unsigned num_term; +}; template< class EOT > peoParaSGATransform< EOT > :: peoParaSGATransform( @@ -156,18 +156,18 @@ template< class EOT > void peoParaSGATransform< EOT > :: unpackResult() // Can be used with an odd size if ( num_term == 2*(pop->size()/2) ) - { + { - getOwner()->setActive(); - resume(); - } + getOwner()->setActive(); + resume(); + } } template< class EOT > void peoParaSGATransform< EOT > :: operator()( eoPop < EOT >& __pop ) { - printDebugMessage( "performing the parallel transformation step." ); + printDebugMessage( "peoParaSGATransform: performing the parallel transformation step." ); pop = &__pop; idx = 0; num_term = 0; diff --git a/trunk/paradiseo-peo/src/peoParallelAlgorithmWrapper.h b/trunk/paradiseo-peo/src/peoParallelAlgorithmWrapper.h index 192bc282f..c27b66844 100644 --- a/trunk/paradiseo-peo/src/peoParallelAlgorithmWrapper.h +++ b/trunk/paradiseo-peo/src/peoParallelAlgorithmWrapper.h @@ -67,7 +67,7 @@ class peoParallelAlgorithmWrapper : public Runner ~peoParallelAlgorithmWrapper() { - + delete algorithm; } @@ -76,12 +76,12 @@ class peoParallelAlgorithmWrapper : public Runner algorithm->operator()(); } - + private: struct AbstractAlgorithm { - + // virtual destructor as we will be using inheritance and polymorphism virtual ~AbstractAlgorithm() { } @@ -90,7 +90,7 @@ class peoParallelAlgorithmWrapper : public Runner virtual void operator()() { } }; - + template< typename AlgorithmType, typename AlgorithmDataType > struct Algorithm : public AbstractAlgorithm { @@ -117,7 +117,7 @@ class peoParallelAlgorithmWrapper : public Runner { algorithm(); } - + AlgorithmType& algorithm; }; @@ -127,7 +127,7 @@ class peoParallelAlgorithmWrapper : public Runner FunctionAlgorithm( AlgorithmReturnType (*externalAlgorithm)( AlgorithmDataType& ), AlgorithmDataType& externalData ) : algorithm( externalAlgorithm ), algorithmData( externalData ) {} - + virtual void operator()() { algorithm( algorithmData ); @@ -136,22 +136,22 @@ class peoParallelAlgorithmWrapper : public Runner AlgorithmReturnType (*algorithm)( AlgorithmDataType& ); AlgorithmDataType& algorithmData; }; - + template< typename AlgorithmReturnType > struct FunctionAlgorithm< AlgorithmReturnType, void > : public AbstractAlgorithm { FunctionAlgorithm( AlgorithmReturnType (*externalAlgorithm)() ) : algorithm( externalAlgorithm ) {} - + virtual void operator()() { algorithm(); } - + AlgorithmReturnType (*algorithm)(); }; - + private: AbstractAlgorithm* algorithm; diff --git a/trunk/paradiseo-peo/src/peoPopEval.h b/trunk/paradiseo-peo/src/peoPopEval.h index ed3f7087a..e25c846d9 100644 --- a/trunk/paradiseo-peo/src/peoPopEval.h +++ b/trunk/paradiseo-peo/src/peoPopEval.h @@ -45,13 +45,12 @@ //! The derived classes may be used as wrappers for EO-derived evaluation functors. In order to have an example, //! please refer to the implementation of the peoSeqPopEval and peoParaPopEval classes. template< class EOT > class peoPopEval : public Service - { +{ - public: - - //! Interface function providing the signature for constructing an evaluation functor. - virtual void operator()( eoPop< EOT >& __pop ) = 0; - }; +public: + //! Interface function providing the signature for constructing an evaluation functor. + virtual void operator()( eoPop< EOT >& __pop ) = 0; +}; #endif diff --git a/trunk/paradiseo-peo/src/peoSyncIslandMig.h b/trunk/paradiseo-peo/src/peoSyncIslandMig.h index 71abae0e3..6cce0c2a5 100644 --- a/trunk/paradiseo-peo/src/peoSyncIslandMig.h +++ b/trunk/paradiseo-peo/src/peoSyncIslandMig.h @@ -144,68 +144,68 @@ //! the associated distinctly parametrized migration objects. The interconnecting element is the underlying topology, defined at step 1 //! (the same C++ migTopology object has to be passed as parameter for all the migration objects, in order to interconnect them). template< class EOT > class peoSyncIslandMig : public Cooperative, public eoUpdater - { +{ - public: +public: - //! Constructor for the peoSyncIslandMig class; the characteristics of the migration model are defined - //! through the specified parameters - out of the box objects provided in EO, etc., or custom, derived objects may be passed as parameters. - //! - //! @param unsigned __frequency - frequency of the migrations - the migrations occur periodically; - //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of emigrant individuals out of the source population; - //! @param eoReplacement< EOT >& __replace - replacement strategy used for integrating the immigrant individuals in the destination population; - //! @param Topology& __topology - topological model to be followed when performing migrations; - //! @param eoPop< EOT >& __source - source population from which the emigrant individuals are selected; - //! @param eoPop< EOT >& __destination - destination population in which the immigrant population are integrated. - peoSyncIslandMig( - unsigned __frequency, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, - Topology& __topology, - eoPop< EOT >& __source, - eoPop< EOT >& __destination - ); + //! Constructor for the peoSyncIslandMig class; the characteristics of the migration model are defined + //! through the specified parameters - out of the box objects provided in EO, etc., or custom, derived objects may be passed as parameters. + //! + //! @param unsigned __frequency - frequency of the migrations - the migrations occur periodically; + //! @param eoSelect< EOT >& __select - selection strategy to be applied for constructing a list of emigrant individuals out of the source population; + //! @param eoReplacement< EOT >& __replace - replacement strategy used for integrating the immigrant individuals in the destination population; + //! @param Topology& __topology - topological model to be followed when performing migrations; + //! @param eoPop< EOT >& __source - source population from which the emigrant individuals are selected; + //! @param eoPop< EOT >& __destination - destination population in which the immigrant population are integrated. + peoSyncIslandMig( + unsigned __frequency, + eoSelect< EOT >& __select, + eoReplacement< EOT >& __replace, + Topology& __topology, + eoPop< EOT >& __source, + eoPop< EOT >& __destination + ); - //! Function operator to be called as checkpoint for performing the migration step. The emigrant individuals are selected - //! from the source population and sent to the next island (defined by the topology object) while the immigrant - //! individuals are integrated in the destination population. There is no need to explicitly call the function - the - //! wrapper checkpoint object (please refer to the above example) will perform the call when required. - void operator()(); + //! Function operator to be called as checkpoint for performing the migration step. The emigrant individuals are selected + //! from the source population and sent to the next island (defined by the topology object) while the immigrant + //! individuals are integrated in the destination population. There is no need to explicitly call the function - the + //! wrapper checkpoint object (please refer to the above example) will perform the call when required. + void operator()(); - //! Auxiliary function dealing with sending the emigrant individuals. There is no need to explicitly call the function. - void pack(); - //! Auxiliary function dealing with receiving immigrant individuals. There is no need to explicitly call the function. - void unpack(); + //! Auxiliary function dealing with sending the emigrant individuals. There is no need to explicitly call the function. + void pack(); + //! Auxiliary function dealing with receiving immigrant individuals. There is no need to explicitly call the function. + void unpack(); - //! Auxiliary function dealing with migration notifications. There is no need to explicitly call the function. - void notifySending(); + //! Auxiliary function dealing with migration notifications. There is no need to explicitly call the function. + void notifySending(); - private: +private: - void emigrate(); - void immigrate(); + void emigrate(); + void immigrate(); - private: +private: - eoPeriodicContinue< EOT > cont; - eoSelect< EOT >& select; // selection strategy - eoReplacement< EOT >& replace; // replacement strategy - Topology& topology; // neighboring topology + eoPeriodicContinue< EOT > cont; + eoSelect< EOT >& select; // selection strategy + eoReplacement< EOT >& replace; // replacement strategy + Topology& topology; // neighboring topology - // source and target populations - eoPop< EOT >& source; - eoPop< EOT >& destination; + // source and target populations + eoPop< EOT >& source; + eoPop< EOT >& destination; - // immigrants & emigrants in the queue - std :: queue< eoPop< EOT > > imm; - std :: queue< eoPop< EOT > > em; + // immigrants & emigrants in the queue + std :: queue< eoPop< EOT > > imm; + std :: queue< eoPop< EOT > > em; - std :: queue< Cooperative* > coop_em; + std :: queue< Cooperative* > coop_em; - sem_t sync; - }; + sem_t sync; +}; template< class EOT > peoSyncIslandMig< EOT > :: peoSyncIslandMig( @@ -261,15 +261,15 @@ template< class EOT > void peoSyncIslandMig< EOT > :: emigrate() topology.setNeighbors( this, in, out ); for ( unsigned i = 0; i < out.size(); i ++ ) - { + { - eoPop< EOT > mig; - select( source, mig ); - em.push( mig ); - coop_em.push( out[ i ] ); - send( out[ i ] ); - printDebugMessage( "sending some emigrants." ); - } + eoPop< EOT > mig; + select( source, mig ); + em.push( mig ); + coop_em.push( out[ i ] ); + send( out[ i ] ); + printDebugMessage( "peoSyncIslandMig: sending some emigrants." ); + } } @@ -282,7 +282,7 @@ template< class EOT > void peoSyncIslandMig< EOT > :: immigrate() assert( imm.size() ); replace( destination, imm.front() ) ; imm.pop(); - printDebugMessage( "receiving some immigrants." ); + printDebugMessage( "peoSyncIslandMig: receiving some immigrants." ); } unlock(); } @@ -292,19 +292,19 @@ template< class EOT > void peoSyncIslandMig< EOT > :: operator()() { if ( !cont( source ) ) - { + { - // sending emigrants - emigrate(); - stop(); + // sending emigrants + emigrate(); + stop(); - // synchronizing - sem_wait( &sync ); - getOwner()->setActive(); + // synchronizing + sem_wait( &sync ); + getOwner()->setActive(); - // receiving immigrants - immigrate(); - } + // receiving immigrants + immigrate(); + } } @@ -315,13 +315,13 @@ template< class EOT > void peoSyncIslandMig< EOT > :: notifySending() { if ( imm.empty() ) - { + { - printDebugMessage( "entering pasive mode\n" ); - getOwner()->setPassive(); - } - } - unlock(); + printDebugMessage( "peoSyncIslandMig: entering pasive mode\n" ); + getOwner()->setPassive(); + } +} +unlock(); resume(); } diff --git a/trunk/paradiseo-peo/src/peoSyncMultiStart.h b/trunk/paradiseo-peo/src/peoSyncMultiStart.h index 424d2f733..84f920212 100644 --- a/trunk/paradiseo-peo/src/peoSyncMultiStart.h +++ b/trunk/paradiseo-peo/src/peoSyncMultiStart.h @@ -62,74 +62,74 @@ extern int getNodeRank(); //! thus allowing for simple hybridization schemes which combine the evolutionary approach with a local search approach, //! for example, executed at the end of each generation. template< class EOT > class peoSyncMultiStart : public Service, public eoUpdater - { +{ - public: +public: - //! Constructor function - several simple parameters are required for defining the characteristics of the multi-start model. - //! - //! @param eoContinue< EOT >& __cont - defined for including further functionality - no semantics associated at this time; - //! @param eoSelect< EOT >& __select - selection strategy for obtaining a subset of the initial population on which to apply the specified algorithm; - //! @param eoReplacement< EOT >& __replace - replacement strategy for integrating the resulting individuals in the initial population; - //! @param moAlgo< EOT >& __ls - algorithm to be applied on each of the selected individuals - a moAlgo< EOT >-derived object must be specified; - //! @param eoPop< EOT >& __pop - the initial population from which the individuals are selected for applying the specified algorithm. - peoSyncMultiStart( + //! Constructor function - several simple parameters are required for defining the characteristics of the multi-start model. + //! + //! @param eoContinue< EOT >& __cont - defined for including further functionality - no semantics associated at this time; + //! @param eoSelect< EOT >& __select - selection strategy for obtaining a subset of the initial population on which to apply the specified algorithm; + //! @param eoReplacement< EOT >& __replace - replacement strategy for integrating the resulting individuals in the initial population; + //! @param moAlgo< EOT >& __ls - algorithm to be applied on each of the selected individuals - a moAlgo< EOT >-derived object must be specified; + //! @param eoPop< EOT >& __pop - the initial population from which the individuals are selected for applying the specified algorithm. + peoSyncMultiStart( - eoContinue< EOT >& __cont, - eoSelect< EOT >& __select, - eoReplacement< EOT >& __replace, - moAlgo< EOT >& __ls, - eoPop< EOT >& __pop - ); + eoContinue< EOT >& __cont, + eoSelect< EOT >& __select, + eoReplacement< EOT >& __replace, + moAlgo< EOT >& __ls, + eoPop< EOT >& __pop + ); - //! Operator which synchronously executes the specified algorithm on the individuals selected from the initial population. - //! There is no need to explicitly call the operator - automatically called as checkpoint operator. - void operator()(); + //! Operator which synchronously executes the specified algorithm on the individuals selected from the initial population. + //! There is no need to explicitly call the operator - automatically called as checkpoint operator. + void operator()(); - //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified - //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. - void packData(); + //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified + //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. + void packData(); - //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified - //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. - void unpackData(); + //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified + //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. + void unpackData(); - //! Auxiliary function for actually executing the specified algorithm on one assigned individual. There is no need to - //! explicitly call the function. - void execute(); + //! Auxiliary function for actually executing the specified algorithm on one assigned individual. There is no need to + //! explicitly call the function. + void execute(); - //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified - //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. - void packResult(); + //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified + //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. + void packResult(); - //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified - //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. - void unpackResult(); + //! Auxiliary function for transferring data between the process requesting the synchronous execution of the specified + //! algorithm and the process which actually executes the algorithm. There is no need to explicitly call the function. + void unpackResult(); - //! Auxiliary function for notifications between the process requesting the synchronous multi-start execution - //! and the processes that performs the actual execution phase. There is no need to explicitly call the function. - void notifySendingData(); + //! Auxiliary function for notifications between the process requesting the synchronous multi-start execution + //! and the processes that performs the actual execution phase. There is no need to explicitly call the function. + void notifySendingData(); - //! Auxiliary function for notifications between the process requesting the synchronous multi-start execution - //! and the processes that performs the actual execution phase. There is no need to explicitly call the function. - void notifySendingAllResourceRequests(); + //! Auxiliary function for notifications between the process requesting the synchronous multi-start execution + //! and the processes that performs the actual execution phase. There is no need to explicitly call the function. + void notifySendingAllResourceRequests(); - private: +private: - eoContinue< EOT >& cont; - eoSelect< EOT >& select; - eoReplacement< EOT >& replace; + eoContinue< EOT >& cont; + eoSelect< EOT >& select; + eoReplacement< EOT >& replace; - moAlgo< EOT >& ls; + moAlgo< EOT >& ls; - eoPop< EOT >& pop; - eoPop< EOT > sel; - eoPop< EOT > impr_sel; + eoPop< EOT >& pop; + eoPop< EOT > sel; + eoPop< EOT > impr_sel; - EOT sol; - unsigned idx; - unsigned num_term; - }; + EOT sol; + unsigned idx; + unsigned num_term; +}; template< class EOT > peoSyncMultiStart< EOT > :: peoSyncMultiStart( @@ -180,14 +180,14 @@ template< class EOT > void peoSyncMultiStart< EOT > :: unpackResult() num_term++; if ( num_term == sel.size() ) - { + { - getOwner()->setActive(); - replace( pop, impr_sel ); + getOwner()->setActive(); + replace( pop, impr_sel ); - printDebugMessage( "replacing the improved individuals in the population." ); - resume(); - } + printDebugMessage( "replacing the improved individuals in the population." ); + resume(); + } } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/comm.cpp b/trunk/paradiseo-peo/src/rmc/mpi/comm.cpp index 3b26de542..7210f1202 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/comm.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/comm.cpp @@ -51,6 +51,7 @@ static sem_t sem_comm_init; static Communicator * the_thread; + Communicator :: Communicator (int * __argc, char * * * __argv) { the_thread = this; @@ -69,23 +70,28 @@ void Communicator :: start () { sendMessages (); - if (theEnd() || ! atLeastOneActiveRunner ()) + if (! atLeastOneActiveRunner () && ! atLeastOneActiveThread() && allResourcesFree ()) break; receiveMessages (); } waitBuffers (); - sem_destroy(& sem_comm_init); - printDebugMessage ("finalizing"); - synchronizeNodes (); + //synchronizeNodes (); } void initCommunication () { + static bool initializedSemaphore = false; + + if (initializedSemaphore) { + sem_destroy(& sem_comm_init); + } + sem_init (& sem_comm_init, 0, 0); + initializedSemaphore = true; } void waitNodeInitialization () { @@ -97,6 +103,3 @@ void wakeUpCommunicator () { the_thread -> wakeUp (); } - - - diff --git a/trunk/paradiseo-peo/src/rmc/mpi/comm.h b/trunk/paradiseo-peo/src/rmc/mpi/comm.h index 5184d45f1..7a343a595 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/comm.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/comm.h @@ -43,7 +43,7 @@ class Communicator : public ReactiveThread { public : - + /* Ctor */ Communicator (int * __argc, char * * * __argv); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/coop.cpp b/trunk/paradiseo-peo/src/rmc/mpi/coop.cpp index de6ce75a2..541677dd8 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/coop.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/coop.cpp @@ -53,7 +53,7 @@ void Cooperative :: setOwner (Runner & __runner) { void Cooperative :: send (Cooperative * __coop) { - :: send (this, getRankOfRunner (__coop -> getOwner () -> getDefinitionID ()), COOP_TAG); + :: send (this, getRankOfRunner (__coop -> getOwner () -> getDefinitionID ()), COOP_TAG); // stop (); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/mess.cpp b/trunk/paradiseo-peo/src/rmc/mpi/mess.cpp index a55cf4a29..addadc3b2 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/mess.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/mess.cpp @@ -45,18 +45,26 @@ static char mpi_buf [MPI_BUF_SIZE]; -static int pos_buf ; +static int pos_buf; static std :: vector act_buf; /* Active buffers */ static std :: vector act_req; /* Active requests */ +void initBuffers () { + + pos_buf = 0; + act_buf.clear (); + act_req.clear (); +} + void cleanBuffers () { for (unsigned i = 0; i < act_req.size ();) { MPI_Status stat ; int flag ; + MPI_Test (act_req [i], & flag, & stat) ; if (flag) { @@ -71,7 +79,7 @@ void cleanBuffers () { } else i ++; - } + } } void waitBuffers () { @@ -79,14 +87,14 @@ void waitBuffers () { printDebugMessage ("waiting the termination of the asynchronous operations to complete"); for (unsigned i = 0; i < act_req.size (); i ++) { - + MPI_Status stat ; MPI_Wait (act_req [i], & stat) ; - + delete[] act_buf [i] ; delete act_req [i] ; - } + } } bool probeMessage (int & __src, int & __tag) { @@ -111,17 +119,17 @@ void waitMessage () { } void initMessage () { - + pos_buf = 0; } void sendMessage (int __to, int __tag) { - cleanBuffers (); + cleanBuffers (); act_buf.push_back (new char [pos_buf]); - act_req.push_back (new MPI_Request); - memcpy (act_buf.back (), mpi_buf, pos_buf); - MPI_Isend (act_buf.back (), pos_buf, MPI_PACKED, __to, __tag, MPI_COMM_WORLD, act_req.back ()); + act_req.push_back (new MPI_Request); + memcpy (act_buf.back (), mpi_buf, pos_buf); + MPI_Isend (act_buf.back (), pos_buf, MPI_PACKED, __to, __tag, MPI_COMM_WORLD, act_req.back ()); } void sendMessageToAll (int __tag) { @@ -131,8 +139,8 @@ void sendMessageToAll (int __tag) { } void receiveMessage (int __from, int __tag) { - - MPI_Status stat; + + MPI_Status stat; MPI_Request req; MPI_Irecv (mpi_buf, MPI_BUF_SIZE, MPI_PACKED, __from, __tag, MPI_COMM_WORLD, & req); @@ -200,7 +208,7 @@ void pack (const unsigned long & __ul, int __nitem) { /* String */ void pack (const char * __str) { - + int len = strlen (__str) + 1; MPI_Pack (& len, 1, MPI_INT, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); MPI_Pack ((void *) __str, len, MPI_CHAR, mpi_buf, MPI_BUF_SIZE, & pos_buf, MPI_COMM_WORLD); @@ -267,4 +275,3 @@ void unpack (char * __str) { MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, & len, 1, MPI_INT, MPI_COMM_WORLD); MPI_Unpack (mpi_buf, MPI_BUF_SIZE, & pos_buf, __str, len, MPI_CHAR, MPI_COMM_WORLD); } - diff --git a/trunk/paradiseo-peo/src/rmc/mpi/mess.h b/trunk/paradiseo-peo/src/rmc/mpi/mess.h index 0b8264b9b..f7efecee7 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/mess.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/mess.h @@ -47,6 +47,8 @@ extern void sendMessageToAll (int __tag); extern void receiveMessage (int __from, int __tag); +extern void initBuffers (); + extern void cleanBuffers (); extern void waitBuffers (); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/node.cpp b/trunk/paradiseo-peo/src/rmc/mpi/node.cpp index b989d228d..e1e3707ce 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/node.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/node.cpp @@ -40,6 +40,8 @@ #include #include +#include "mess.h" + class MPIThreadedEnv { @@ -63,7 +65,7 @@ public: private: - /* No instance of this class can be created outside its domain */ + /* No instance of this class can be created outside its domain! */ MPIThreadedEnv ( int * __argc, char * * * __argv ) { static bool MPIThreadedEnvInitialized = false; @@ -72,6 +74,7 @@ private: if (! MPIThreadedEnvInitialized) { MPI_Init_thread (__argc, __argv, MPI_THREAD_FUNNELED, & provided); + assert (provided == MPI_THREAD_FUNNELED); /* The MPI implementation must be multi-threaded. Yet, only one thread performs the comm. operations */ @@ -92,6 +95,7 @@ static std :: map name_to_rk; static std :: vector rk_to_name; + int getNodeRank () { return rk; @@ -102,6 +106,11 @@ int getNumberOfNodes () { return sz; } +void collectiveCountOfRunners ( unsigned int* num_local_exec_runners, unsigned int* num_exec_runners ) { + + MPI_Allreduce( num_local_exec_runners, num_exec_runners, 1, MPI_UNSIGNED, MPI_SUM, MPI_COMM_WORLD ); +} + int getRankFromName (const std :: string & __name) { return atoi (__name.c_str ()); @@ -112,9 +121,8 @@ void initNode (int * __argc, char * * * __argv) { rk_to_name.clear (); name_to_rk.clear (); - MPIThreadedEnv :: init ( __argc, __argv ); - + //synchronizeNodes(); MPI_Comm_rank (MPI_COMM_WORLD, & rk); /* Who ? */ MPI_Comm_size (MPI_COMM_WORLD, & sz); /* How many ? */ diff --git a/trunk/paradiseo-peo/src/rmc/mpi/node.h b/trunk/paradiseo-peo/src/rmc/mpi/node.h index 76babf5b7..66610c91f 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/node.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/node.h @@ -44,6 +44,8 @@ extern int getNodeRank (); /* It gives the rank of the calling process */ extern int getNumberOfNodes (); /* It gives the size of the environment (Total number of nodes) */ +extern void collectiveCountOfRunners ( unsigned int* num_local_exec_runners, unsigned int* num_exec_runners ); + extern int getRankFromName (const std :: string & __name); /* It gives the rank of the process expressed by its name */ diff --git a/trunk/paradiseo-peo/src/rmc/mpi/recv.cpp b/trunk/paradiseo-peo/src/rmc/mpi/recv.cpp index 5bbf27c05..9ea9cf7fd 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/recv.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/recv.cpp @@ -130,7 +130,5 @@ void receiveMessages () { }; } - } while ( ! atLeastOneActiveThread () && atLeastOneActiveRunner () /*&& ! allResourcesFree ()*/); - - cleanBuffers (); + } while ( ! atLeastOneActiveThread () && atLeastOneActiveRunner () /*&& ! allResourcesFree ()*/ ); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/rmc.cpp b/trunk/paradiseo-peo/src/rmc/mpi/rmc.cpp index 9d846dd47..34e30a94a 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/rmc.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/rmc.cpp @@ -45,6 +45,7 @@ static std :: vector ll_threads; /* Low level threads */ static std :: vector worker_threads; /* Worker threads */ static Communicator* communicator_thread = NULL; /* Communicator thread */ + void runRMC () { /* Worker(s) ? */ diff --git a/trunk/paradiseo-peo/src/rmc/mpi/scheduler.cpp b/trunk/paradiseo-peo/src/rmc/mpi/scheduler.cpp index 6f7837b3e..617c81cf5 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/scheduler.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/scheduler.cpp @@ -47,6 +47,8 @@ static std :: queue requests; /* Requests */ static unsigned initNumberOfRes = 0; +extern void wakeUpCommunicator(); + void initScheduler () { resources = std :: queue (); @@ -57,36 +59,39 @@ void initScheduler () { const Node & node = the_schema [i]; - if (node.rk_sched == my_node -> rk) + if (node.rk_sched == my_node -> rk) for (unsigned j = 0; j < node.num_workers; j ++) - resources.push (std :: pair (i, j + 1)); - } + resources.push (std :: pair (i, j + 1)); + } initNumberOfRes = resources.size (); } bool allResourcesFree () { - return resources.size () == initNumberOfRes; } +unsigned numResourcesFree () { + return resources.size (); +} + static void update () { unsigned num_alloc = std :: min (resources.size (), requests.size ()); - + for (unsigned i = 0; i < num_alloc; i ++) { - + SCHED_REQUEST req = requests.front (); requests.pop (); - + SCHED_RESOURCE res = resources.front (); resources.pop (); - printDebugMessage ("allocating a resource."); + printDebugMessage ("allocating a resource."); initMessage (); pack (req.second); pack (res); sendMessage (req.first, SCHED_RESULT_TAG); - } + } } void unpackResourceRequest () { @@ -107,4 +112,5 @@ void unpackTaskDone () { if (resources.size () == initNumberOfRes) printDebugMessage ("all the resources are now free."); update (); + wakeUpCommunicator(); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/scheduler.h b/trunk/paradiseo-peo/src/rmc/mpi/scheduler.h index cbb61891a..f5fc71a13 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/scheduler.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/scheduler.h @@ -57,4 +57,6 @@ extern void unpackTaskDone (); extern bool allResourcesFree (); +extern unsigned numResourcesFree (); + #endif diff --git a/trunk/paradiseo-peo/src/rmc/mpi/schema.cpp b/trunk/paradiseo-peo/src/rmc/mpi/schema.cpp index f7f98d47b..b1185d365 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/schema.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/schema.cpp @@ -76,7 +76,7 @@ static void loadNode (int __rk_sched) { /* TAG: | */ std :: string name = getNextNode (); - assert (name == "runner" || name == "node"); + assert (name == "runner" || name == "node"); if (name == "runner") { /* TAG: */ node.id_run.push_back (atoi (getNextNode ().c_str ())); @@ -105,7 +105,7 @@ static void loadGroup () { /* TAG: | */ name = getNextNode (); - assert (name == "node" || name == "group"); + assert (name == "node" || name == "group"); if (name == "node") /* TAG: */ loadNode (rk_sched); @@ -173,7 +173,7 @@ void loadSchema (const char * __filename) { printDebugMessage (mess); if (isScheduleNode ()) - printDebugMessage ("I'am a scheduler"); + printDebugMessage ("I'am a scheduler"); for (unsigned i = 0; i < my_node -> id_run.size (); i ++) { sprintf (mess, "I manage the runner %d", my_node -> id_run [i]); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/schema.h b/trunk/paradiseo-peo/src/rmc/mpi/schema.h index 6feabadc7..0381bd5cd 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/schema.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/schema.h @@ -47,7 +47,7 @@ typedef int RANK_ID; struct Node { - + RANK_ID rk; /* Rank */ std :: string name; /* Host name */ unsigned num_workers; /* Number of parallel workers */ diff --git a/trunk/paradiseo-peo/src/rmc/mpi/send.cpp b/trunk/paradiseo-peo/src/rmc/mpi/send.cpp index 03bc31c19..d36dc0d88 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/send.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/send.cpp @@ -49,6 +49,7 @@ #define TO_ALL -1 + typedef struct { Communicable * comm; @@ -56,28 +57,28 @@ typedef struct { int tag; } SEND_REQUEST; - + + static std :: queue mess; static sem_t sem_send; static bool contextInitialized = false; + void initSending () { - static bool initializedSem = false; + static bool initializedSemaphore = false; mess = std :: queue (); - if (! initializedSem) { - sem_init (& sem_send, 0, 1); - initializedSem = true; - } - else { + if (initializedSemaphore) { sem_destroy(& sem_send); - sem_init (& sem_send, 0, 1); } + sem_init (& sem_send, 0, 1); + initializedSemaphore = true; + contextInitialized = false; } @@ -103,13 +104,13 @@ extern void initializeContext (); void sendMessages () { - sem_wait (& sem_send); - if (! contextInitialized) { contextInitialized = true; initializeContext(); } + sem_wait (& sem_send); + while (! mess.empty ()) { SEND_REQUEST req = mess.front (); @@ -132,7 +133,7 @@ void sendMessages () { case SCHED_REQUEST_TAG: dynamic_cast (comm) -> packResourceRequest (); - dynamic_cast (comm) -> notifySendingResourceRequest (); + dynamic_cast (comm) -> notifySendingResourceRequest (); break; case TASK_RESULT_TAG: @@ -157,5 +158,5 @@ void sendMessages () { mess.pop (); } - sem_post (& sem_send); + sem_post (& sem_send); } diff --git a/trunk/paradiseo-peo/src/rmc/mpi/tags.h b/trunk/paradiseo-peo/src/rmc/mpi/tags.h index 92d5ac1a2..8fb7f8a84 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/tags.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/tags.h @@ -48,6 +48,4 @@ #define TASK_RESULT_TAG 19 #define TASK_DONE_TAG 20 -#define EXECUTION_CONTEXT_TAG 1000 - #endif diff --git a/trunk/paradiseo-peo/src/rmc/mpi/worker.cpp b/trunk/paradiseo-peo/src/rmc/mpi/worker.cpp index 0dc242389..ee88cfb19 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/worker.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/worker.cpp @@ -46,26 +46,32 @@ static std :: vector key_to_worker (1); /* Vector of registered workers */ +extern void wakeUpCommunicator (); + Worker * getWorker (WORKER_ID __key) { - return key_to_worker [__key]; + return key_to_worker [__key]; } Worker :: Worker () { - + recvAndCompleted = false; + taskAssigned = 0; id = key_to_worker.size (); key_to_worker.push_back (this); + + sem_init( &sem_task_done, 0, 0 ); } void Worker :: packResult () { - + pack (serv_id); - serv -> packResult (); + serv -> packResult (); } void Worker :: unpackData () { + taskAssigned ++; printDebugMessage ("unpacking the ID. of the service."); unpack (serv_id); serv = getService (serv_id); @@ -90,9 +96,10 @@ void Worker :: notifySendingResult () { void Worker :: notifySendingTaskDone () { + sem_post(&sem_task_done); setPassive (); } - + void Worker :: setSource (int __rank) { src = __rank; @@ -102,22 +109,28 @@ void Worker :: start () { while (true) { - sleep (); + sleep (); - if (! atLeastOneActiveRunner ()) + if (! atLeastOneActiveRunner () && ! taskAssigned) break; if (recvAndCompleted) { send (this, my_node -> rk_sched, TASK_DONE_TAG); recvAndCompleted = false; + sem_wait(&sem_task_done); + taskAssigned --; } else { - printDebugMessage ("executing the task."); - serv -> execute (); - send (this, src, TASK_RESULT_TAG); + serv -> execute (); + send (this, src, TASK_RESULT_TAG); } } + + printDebugMessage ("Worker finished execution."); + setPassive (); + + wakeUpCommunicator(); } void initWorkersEnv () { diff --git a/trunk/paradiseo-peo/src/rmc/mpi/worker.h b/trunk/paradiseo-peo/src/rmc/mpi/worker.h index 709a10584..5576fa4f0 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/worker.h +++ b/trunk/paradiseo-peo/src/rmc/mpi/worker.h @@ -46,7 +46,7 @@ typedef unsigned WORKER_ID; class Worker : public Communicable, public ReactiveThread { -public : +public : Worker (); @@ -56,14 +56,14 @@ public : void unpackData (); - void packTaskDone (); + void packTaskDone (); void notifySendingResult (); void notifySendingTaskDone (); - + void setSource (int __rank); - + private : WORKER_ID id; @@ -72,6 +72,10 @@ private : int src; bool recvAndCompleted; + unsigned taskAssigned; + + sem_t sem_task_done; + sem_t sem_task_asgn; }; extern void initWorkersEnv (); diff --git a/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.cpp b/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.cpp index 706468cba..052f4c1b3 100644 --- a/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.cpp +++ b/trunk/paradiseo-peo/src/rmc/mpi/xml_parser.cpp @@ -41,11 +41,11 @@ static xmlTextReaderPtr reader; void openXMLDocument (const char * __filename) { - + reader = xmlNewTextReaderFilename (__filename); - + if (! reader) { - + fprintf (stderr, "unable to open '%s'.\n", __filename); exit (1); } @@ -57,18 +57,18 @@ void closeXMLDocument () { } std :: string getAttributeValue (const std :: string & __attr) { - + xmlChar * value = xmlTextReaderGetAttribute (reader, (const xmlChar *) __attr.c_str ()); - + std :: string str ((const char *) value); - + xmlFree (value); - + return str; } static bool isSep (const xmlChar * __text) { - + for (unsigned i = 0; i < strlen ((char *) __text); i ++) if (__text [i] != ' ' && __text [i] != '\t' && __text [i] != '\n') return false; @@ -76,7 +76,7 @@ static bool isSep (const xmlChar * __text) { } std :: string getNextNode () { - + xmlChar * name, * value; do { @@ -91,12 +91,11 @@ std :: string getNextNode () { str.assign ((char *) name); else str.assign ((char *) value); - + if (name) xmlFree (name); if (value) xmlFree (value); - + return str; } -