eoPopEvalFunc updated for parallel evaluation.

This commit is contained in:
Benjamin Bouvier 2012-06-25 14:55:15 +02:00
commit fc68c3b81e
3 changed files with 41 additions and 21 deletions

View file

@ -34,7 +34,7 @@
#include <omp.h> #include <omp.h>
# ifdef WITH_MPI # ifdef WITH_MPI
# include <mpi/eompi.h> # include <mpi/eoMpi.h>
# include <mpi/eoParallelApply.h> # include <mpi/eoParallelApply.h>
# endif // WITH_MPI # endif // WITH_MPI
@ -86,21 +86,15 @@ void apply(eoUF<EOT&, void>& _proc, std::vector<EOT>& _pop)
#ifdef WITH_MPI #ifdef WITH_MPI
template<class EOT> template<class EOT>
void parallelApply(eoUF<EOT&, void>& _proc, std::vector<EOT>& _pop) void parallelApply(
eoUF<EOT&, void>& _proc,
std::vector<EOT>& _pop,
eo::mpi::AssignmentAlgorithm& _algo,
int _masterRank,
int _packetSize)
{ {
ParallelApply<EOT> job( _proc, _pop ); eo::mpi::ParallelApply<EOT> job( _proc, _pop, _algo, _masterRank, _packetSize );
job.run();
MasterNode* master = dynamic_cast<MasterNode*>( MpiNodeStore::instance() );
if ( master )
{
DynamicAssignmentAlgorithm algo;
master->setAssignmentAlgorithm( &algo );
master->run( job );
} else
{
WorkerNode* wrk = dynamic_cast<WorkerNode*>( MpiNodeStore::instance() );
wrk->run( job );
}
} }
#endif #endif

View file

@ -83,17 +83,33 @@ template<class EOT>
class eoParallelPopLoopEval : public eoPopEvalFunc<EOT> { class eoParallelPopLoopEval : public eoPopEvalFunc<EOT> {
public: public:
/** Ctor: set value of embedded eoEvalFunc */ /** Ctor: set value of embedded eoEvalFunc */
eoParallelPopLoopEval(eoEvalFunc<EOT> & _eval) : eval(_eval) {} eoParallelPopLoopEval(
eoEvalFunc<EOT> & _eval,
eo::mpi::AssignmentAlgorithm& _assignAlgo,
int _masterRank,
int _packetSize = 1
) :
eval(_eval),
assignAlgo( _assignAlgo ),
masterRank( _masterRank ),
packetSize( _packetSize )
{
// empty
}
/** Do the job: simple loop over the offspring */ /** Do the job: simple loop over the offspring */
void operator()(eoPop<EOT> & _parents, eoPop<EOT> & _offspring) void operator()(eoPop<EOT> & _parents, eoPop<EOT> & _offspring)
{ {
(void)_parents; (void)_parents;
parallelApply<EOT>(eval, _offspring); parallelApply<EOT>(eval, _offspring, assignAlgo, masterRank, packetSize);
} }
private: private:
eoEvalFunc<EOT> & eval; eoEvalFunc<EOT> & eval;
eo::mpi::AssignmentAlgorithm & assignAlgo;
int masterRank;
int packetSize;
}; };
#endif #endif

View file

@ -3,12 +3,19 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include <eo> #include <eo>
#include <eoPopEvalFunc.h>
#include <es/make_real.h> #include <es/make_real.h>
//#include <apply.h> // #include <apply.h>
#include "real_value.h" #include "../real_value.h"
#include <mpi/eoMpi.h>
#include <boost/mpi.hpp> #include <boost/mpi.hpp>
#include <vector>
using namespace std;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class eoRealSerializable : public eoReal< eoMinimizingFitness >, public eoserial::Persistent class eoRealSerializable : public eoReal< eoMinimizingFitness >, public eoserial::Persistent
@ -75,7 +82,7 @@ typedef eoRealSerializable EOT;
int main(int ac, char** av) int main(int ac, char** av)
{ {
MpiSingletonFactory::init( ac, av ); eo::mpi::Node::init( ac, av );
eoParser parser(ac, av); eoParser parser(ac, av);
@ -100,7 +107,10 @@ int main(int ac, char** av)
eo::log << "Size of population : " << popSize << std::endl; eo::log << "Size of population : " << popSize << std::endl;
eoPopLoopEval< EOT > popEval( eval ); eo::log << eo::setlevel( eo::debug );
eo::mpi::DynamicAssignmentAlgorithm assign;
eoParallelPopLoopEval< EOT > popEval( eval, assign, 0, 3 );
popEval( pop, pop ); popEval( pop, pop );
eo::log << eo::quiet << "DONE!" << std::endl; eo::log << eo::quiet << "DONE!" << std::endl;