Skip to content

Commit

Permalink
Merge pull request #2575 from PDoakORNL/improved_walker_count_handling
Browse files Browse the repository at this point in the history
Fix crowds input tag and implement solid walker count input handling in batched drivers
  • Loading branch information
ye-luo committed Jul 14, 2020
2 parents da99fef + b03fb88 commit d1678d3
Show file tree
Hide file tree
Showing 18 changed files with 481 additions and 439 deletions.
3 changes: 2 additions & 1 deletion src/QMCDrivers/Crowd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// This file is distributed under the University of Illinois/NCSA Open Source License.
// See LICENSE file in top directory for details.
//
// Copyright (c) 2019 QMCPACK developers.
// Copyright (c) 2020 QMCPACK developers.
//
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
//////////////////////////////////////////////////////////////////////////////////////
Expand All @@ -14,6 +14,7 @@ namespace qmcplusplus
{
void Crowd::clearWalkers()
{
// We're clearing the refs to the objects not the referred to objects.
mcp_walkers_.clear();
mcp_wfbuffers_.clear();
walker_elecs_.clear();
Expand Down
2 changes: 0 additions & 2 deletions src/QMCDrivers/Crowd.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
// Copyright (c) 2019 developers.
//
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
//
// File refactored from VMC.h
//////////////////////////////////////////////////////////////////////////////////////

#ifndef QMCPLUSPLUS_CROWD_H
Expand Down
53 changes: 12 additions & 41 deletions src/QMCDrivers/DMC/DMCBatched.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// This file is distributed under the University of Illinois/NCSA Open Source License.
// See LICENSE file in top directory for details.
//
// Copyright (c) 2019 QMCPACK developers.
// Copyright (c) 2020 QMCPACK developers.
//
// File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
//
Expand All @@ -28,7 +28,9 @@ using WP = WalkerProperties::Indexes;

// clang-format off
/** Constructor maintains proper ownership of input parameters
*/
*
* Note you must call the Base constructor before the derived class sets QMCType
*/
DMCBatched::DMCBatched(QMCDriverInput&& qmcdriver_input,
DMCDriverInput&& input,
MCPopulation& pop,
Expand All @@ -45,26 +47,6 @@ DMCBatched::DMCBatched(QMCDriverInput&& qmcdriver_input,
}
// clang-format on

QMCDriverNew::AdjustedWalkerCounts DMCBatched::calcDefaultLocalWalkers(QMCDriverNew::AdjustedWalkerCounts awc) const
{
checkNumCrowdsLTNumThreads();
int num_threads(Concurrency::maxThreads<>());

int orig_walkers_per_rank = awc.walkers_per_rank;

if (awc.num_crowds == 0)
awc.num_crowds = std::min(num_threads, awc.walkers_per_rank);
awc.walkers_per_crowd = (awc.walkers_per_rank % awc.num_crowds) ? awc.walkers_per_rank / awc.num_crowds + 1
: awc.walkers_per_rank / awc.num_crowds;

awc.walkers_per_rank = awc.walkers_per_crowd * awc.num_crowds;
if (awc.walkers_per_rank != orig_walkers_per_rank)
app_warning() << "DMCBatched driver has adjusted walkers per rank to: " << awc.walkers_per_rank << '\n';

app_log() << "DMCBatched walkers per crowd " << awc.walkers_per_crowd << std::endl;
return awc;
}

void DMCBatched::setNonLocalMoveHandler(QMCHamiltonian& golden_hamiltonian)
{
golden_hamiltonian.setNonLocalMoves(dmcdriver_input_.get_non_local_move(), qmcdriver_input_.get_tau(),
Expand Down Expand Up @@ -519,22 +501,10 @@ void DMCBatched::runDMCStep(int crowd_id,
void DMCBatched::process(xmlNodePtr node)
{
QMCDriverNew::AdjustedWalkerCounts awc =
adjustGlobalWalkerCount(myComm, qmcdriver_input_.get_total_walkers(), qmcdriver_input_.get_walkers_per_rank(),
dmcdriver_input_.get_reserve(), get_num_crowds());

walkers_per_rank_ = awc.walkers_per_rank;
walkers_per_crowd_ = awc.walkers_per_crowd;
num_crowds_ = awc.num_crowds;

app_log() << "DMCBatched Driver running with target_walkers=" << awc.global_walkers << '\n'
<< " walkers_per_rank=" << walkers_per_rank_ << '\n'
<< " num_crowds=" << num_crowds_ << '\n';

// side effect updates walkers_per_crowd_;
makeLocalWalkers(awc.walkers_per_rank, awc.reserve_walkers,
ParticleAttrib<TinyVector<QMCTraits::RealType, 3>>(population_.get_num_particles()));
population_.syncWalkersPerNode(myComm);
Base::process(node);
adjustGlobalWalkerCount(myComm->size(), myComm->rank(), qmcdriver_input_.get_total_walkers(), qmcdriver_input_.get_walkers_per_rank(),
dmcdriver_input_.get_reserve(), qmcdriver_input_.get_num_crowds());

Base::startup(node, awc);
}

bool DMCBatched::run()
Expand All @@ -553,11 +523,11 @@ bool DMCBatched::run()

{ // walker initialization
ScopedTimer local_timer(&(timers_.init_walkers_timer));
TasksOneToOne<> section_start_task(num_crowds_);
TasksOneToOne<> section_start_task(crowds_.size());
section_start_task(initialLogEvaluation, std::ref(crowds_), std::ref(step_contexts_));
}

TasksOneToOne<> crowd_task(num_crowds_);
TasksOneToOne<> crowd_task(crowds_.size());

for (int block = 0; block < num_blocks; ++block)
{
Expand All @@ -582,7 +552,8 @@ bool DMCBatched::run()

for (UPtr<Crowd>& crowd_ptr : crowds_)
crowd_ptr->clearWalkers();
population_.distributeWalkers(crowds_.begin(), crowds_.end(), walkers_per_crowd_);

population_.distributeWalkers(crowds_);

// Accumulate on the whole population
// But it is now visible in the algorithm not hidden in the BranchEngine::branch.
Expand Down
2 changes: 0 additions & 2 deletions src/QMCDrivers/DMC/DMCBatched.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,6 @@ class DMCBatched : public QMCDriverNew

void setNonLocalMoveHandler(QMCHamiltonian& golden_hamiltonian);

QMCDriverNew::AdjustedWalkerCounts calcDefaultLocalWalkers(QMCDriverNew::AdjustedWalkerCounts awc) const;

private:
DMCDriverInput dmcdriver_input_;
/// Interval between branching
Expand Down
50 changes: 10 additions & 40 deletions src/QMCDrivers/MCPopulation.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include "OhmmsPETE/OhmmsVector.h"
#include "QMCWaveFunctions/TrialWaveFunction.h"
#include "QMCHamiltonians/QMCHamiltonian.h"

#include "Utilities/FairDivide.h"
namespace qmcplusplus
{
class MCPopulation
Expand Down Expand Up @@ -146,48 +146,18 @@ class MCPopulation
* walkers are distributed one by one to crowds.
*
*/
template<typename ITER, typename = RequireInputIterator<ITER>>
void distributeWalkers(ITER it_group_start, ITER group_end, int walkers_per_group)
template<typename WTTV>
void distributeWalkers(WTTV& walker_consumer)
{
auto it_group = it_group_start;
auto it_walkers = walkers_.begin();
auto it_walker_elecs = walker_elec_particle_sets_.begin();
auto it_walker_twfs = walker_trial_wavefunctions_.begin();
auto it_walker_hamiltonians = walker_hamiltonians_.begin();

assert((group_end - it_group < walkers_.size()) || walkers_per_group == 1);

// while (it_group != group_end)
// {
// for (int i = 0; i < walkers_per_group; ++i)
// {
// // possible that walkers_all < walkers_per_group * group_size
// if (it_walkers == walkers_.end())
// break;
// (**it_group).addWalker(**it_walkers, **it_walker_elecs, **it_walker_twfs, **it_walker_hamiltonians);
// ++it_walkers;
// ++it_walker_elecs;
// ++it_walker_twfs;
// ++it_walker_hamiltonians;
// }
// ++it_group;
// }

// For now ignore the requesting walkers_per_group

while (it_walkers != walkers_.end())
auto walkers_per_crowd = fairDivide(walkers_.size(), walker_consumer.size());

auto walker_index = 0;
for (int i = 0; i < walker_consumer.size(); ++i)
{
it_group = it_group_start;
while (it_group != group_end)
for(int j = 0; j < walkers_per_crowd[i]; ++j)
{
if (it_walkers == walkers_.end())
break;
(**it_group).addWalker(**it_walkers, **it_walker_elecs, **it_walker_twfs, **it_walker_hamiltonians);
++it_walkers;
++it_walker_elecs;
++it_walker_twfs;
++it_walker_hamiltonians;
++it_group;
walker_consumer[i]->addWalker(*walkers_[walker_index], *walker_elec_particle_sets_[walker_index], *walker_trial_wavefunctions_[walker_index], *walker_hamiltonians_[walker_index]);
++walker_index;
}
}
}
Expand Down
3 changes: 1 addition & 2 deletions src/QMCDrivers/QMCDriverInput.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,10 @@ void QMCDriverInput::readXML(xmlNodePtr cur)
parameter_set.add(warmup_steps_, "warmupsteps", "int");
parameter_set.add(warmup_steps_, "warmup_steps", "int");
parameter_set.add(num_crowds_, "crowds", "int");
parameter_set.add(walkers_per_rank_, "walkers", "int");
parameter_set.add(walkers_per_rank_, "walkers_per_rank", "int");
parameter_set.add(total_walkers_, "total_walkers", "int");
parameter_set.add(steps_between_samples_, "stepsbetweensamples", "int");
parameter_set.add(samples_per_thread_, "samplesperthread", "real");
parameter_set.add(samples_per_thread_, "dmcwalkersperthread", "real");
parameter_set.add(requested_samples_, "samples", "real");
parameter_set.add(tau_, "timestep", "AU");
parameter_set.add(tau_, "time_step", "AU");
Expand Down

0 comments on commit d1678d3

Please sign in to comment.