From 79c7a263a355f906cfd87a247e0d973475c72bca Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Fri, 6 Jul 2012 16:44:06 +0200 Subject: [PATCH] Static assignment algorithm works with parallel eval now. --- eo/src/apply.h | 1 + eo/src/mpi/eoMpiAssignmentAlgorithm.h | 14 +++++++++++++- eo/src/mpi/eoTerminateJob.h | 9 +++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/eo/src/apply.h b/eo/src/apply.h index df3c43e1..7845c14e 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 aa162d95..c3d24a19 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 25e63eb7..d85aeeb0 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 ); + } + } }; /*