Added store management to eoPopEvalFunc.

This commit is contained in:
Benjamin Bouvier 2012-07-04 10:53:57 +02:00
commit 603268b053
5 changed files with 148 additions and 62 deletions

View file

@ -88,15 +88,13 @@ void apply(eoUF<EOT&, void>& _proc, std::vector<EOT>& _pop)
#ifdef WITH_MPI
template<class EOT>
void parallelApply(
eoUF<EOT&, void>& _proc,
std::vector<EOT>& _pop,
eo::mpi::AssignmentAlgorithm& _algo,
int _masterRank,
int _packetSize,
int _maxTime)
eo::mpi::ParallelEvalStore<EOT> & _store )
{
eo::mpi::ParallelEvalStore<EOT> store( _proc, _pop, _masterRank, _packetSize );
eo::mpi::ParallelApply<EOT> job( _algo, _masterRank, store );
_store.data( _pop );
eo::mpi::ParallelApply<EOT> job( _algo, _masterRank, _store );
job.run();
}
#endif

View file

@ -80,48 +80,72 @@ private:
#ifdef WITH_MPI
// TODO TODOB commenter
template<class EOT>
class eoParallelPopLoopEval : public eoPopEvalFunc<EOT> {
public:
/** Ctor: set value of embedded eoEvalFunc */
eoParallelPopLoopEval(
eoEvalFunc<EOT> & _eval,
eo::mpi::AssignmentAlgorithm& _assignAlgo,
int _masterRank,
int _packetSize = 1,
int _maxTime = 0
) :
eval(_eval),
assignAlgo( _assignAlgo ),
masterRank( _masterRank ),
packetSize( _packetSize ),
maxTime( _maxTime )
{
// empty
}
class eoParallelPopLoopEval : public eoPopEvalFunc<EOT>
{
public:
/** Ctor: set value of embedded eoEvalFunc */
eoParallelPopLoopEval(
eoEvalFunc<EOT> & _eval,
eo::mpi::AssignmentAlgorithm& _assignAlgo,
int _masterRank,
int _packetSize = 1
) :
eval(_eval),
assignAlgo( _assignAlgo ),
masterRank( _masterRank ),
packetSize( _packetSize ),
needToDeleteStore( true )
{
store = new eo::mpi::ParallelEvalStore<EOT>( _eval, _masterRank, _packetSize );
}
~eoParallelPopLoopEval()
{
if( eo::mpi::Node::comm().rank() == masterRank )
{
eo::mpi::EmptyJob job( assignAlgo, masterRank );
job.run();
}
}
eoParallelPopLoopEval(
eoEvalFunc<EOT> & _eval,
eo::mpi::AssignmentAlgorithm& _assignAlgo,
eo::mpi::ParallelEvalStore<EOT>* _store,
int _masterRank,
int _packetSize = 1
) :
eval(_eval),
assignAlgo( _assignAlgo ),
masterRank( _masterRank ),
packetSize( _packetSize ),
needToDeleteStore( false ),
store( _store )
{
// empty
}
/** Do the job: simple loop over the offspring */
void operator()(eoPop<EOT> & _parents, eoPop<EOT> & _offspring)
{
(void)_parents;
parallelApply<EOT>(eval, _offspring, assignAlgo, masterRank, packetSize, maxTime);
}
~eoParallelPopLoopEval()
{
if( eo::mpi::Node::comm().rank() == masterRank )
{
eo::mpi::EmptyJob job( assignAlgo, masterRank );
job.run();
}
private:
eoEvalFunc<EOT> & eval;
if( needToDeleteStore )
{
delete store;
}
}
eo::mpi::AssignmentAlgorithm & assignAlgo;
int masterRank;
int packetSize;
int maxTime;
/** Do the job: simple loop over the offspring */
void operator()(eoPop<EOT> & _parents, eoPop<EOT> & _offspring)
{
(void)_parents;
parallelApply<EOT>(_offspring, assignAlgo, masterRank, *store);
}
private:
eoEvalFunc<EOT> & eval;
eo::mpi::AssignmentAlgorithm & assignAlgo;
eo::mpi::ParallelEvalStore<EOT>* store;
int masterRank;
int packetSize;
bool needToDeleteStore;
};
#endif

View file

@ -24,6 +24,11 @@ namespace eo
d->comm.recv( d->masterRank, Channel::Commands, order );
}
}
~ProcessTaskParallelEval()
{
delete _wrapped;
}
};
template< class EOT >
@ -33,15 +38,20 @@ namespace eo
ParallelEvalStore(
eoUF<EOT&, void> & _proc,
std::vector<EOT>& _pop,
int _masterRank,
// long _maxTime = 0,
int _packetSize = 1
) :
ParallelApplyStore< EOT >( _proc, _pop, _masterRank, _packetSize )
ParallelApplyStore< EOT >( _proc, *( new std::vector<EOT> ), _masterRank, _packetSize )
// FIXME memory leak because of vector ==> use const correctness
{
wrapProcessTask( new ProcessTaskParallelEval<EOT> );
}
void data( std::vector<EOT>& _pop )
{
ParallelApplyStore<EOT>::_data.init( _pop );
}
};
}
}

View file

@ -21,7 +21,7 @@ namespace eo
{
ParallelApplyData(
eoUF<EOT&, void> & _proc,
std::vector<EOT>& _pop,
std::vector<EOT> & _pop,
int _masterRank,
// long _maxTime = 0,
int _packetSize
@ -35,6 +35,14 @@ namespace eo
tempArray = new EOT[ _packetSize ];
}
void init( std::vector<EOT>& _pop )
{
index = 0;
size = _pop.size();
data = _pop;
assignedTasks.clear();
}
~ParallelApplyData()
{
delete [] tempArray;
@ -180,7 +188,7 @@ namespace eo
ParallelApplyData<EOT>* data() { return &_data; }
~ParallelApplyStore()
virtual ~ParallelApplyStore()
{
delete _stf;
delete _hrf;