diff --git a/eo/src/apply.h b/eo/src/apply.h index df3c43e1c..7845c14ec 100644 --- a/eo/src/apply.h +++ b/eo/src/apply.h @@ -94,6 +94,7 @@ void parallelApply( eo::mpi::ParallelEvalStore & _store ) { _store.data( _pop ); + _algo.reinit( _pop.size() ); eo::mpi::ParallelApply job( _algo, _masterRank, _store ); job.run(); } diff --git a/eo/src/mpi/eoMpiAssignmentAlgorithm.h b/eo/src/mpi/eoMpiAssignmentAlgorithm.h index aa162d951..c3d24a196 100644 --- a/eo/src/mpi/eoMpiAssignmentAlgorithm.h +++ b/eo/src/mpi/eoMpiAssignmentAlgorithm.h @@ -16,6 +16,7 @@ namespace eo virtual int availableWorkers( ) = 0; virtual void confirm( int wrkRank ) = 0; virtual std::vector idles( ) = 0; + virtual void reinit( int runs ) = 0; }; struct DynamicAssignmentAlgorithm : public AssignmentAlgorithm @@ -79,6 +80,12 @@ namespace eo return availableWrk; } + void reinit( int _ ) + { + ++_; + // nothing to do + } + protected: std::vector< int > availableWrk; }; @@ -181,7 +188,7 @@ namespace eo void confirm( int rank ) { - int i = -1; + int i = -1; // i is the real index in table for( unsigned int j = 0; j < realRank.size(); ++j ) { if( realRank[j] == rank ) @@ -196,6 +203,11 @@ namespace eo ++freeWorkers; } + void reinit( int runs ) + { + init( realRank, runs ); + } + private: std::vector attributions; std::vector realRank; diff --git a/eo/src/mpi/eoTerminateJob.h b/eo/src/mpi/eoTerminateJob.h index 25e63eb76..d85aeeb05 100644 --- a/eo/src/mpi/eoTerminateJob.h +++ b/eo/src/mpi/eoTerminateJob.h @@ -73,6 +73,15 @@ namespace eo { // empty } + + ~EmptyJob() + { + std::vector< int > idles = assignmentAlgo.idles(); + for(unsigned i = 0, size = idles.size(); i < size; ++i) + { + comm.send( idles[i], Channel::Commands, Message::Kill ); + } + } }; /*