Skip to content

Commit 5f8c074

Browse files
authored
Merge pull request QMCPACK#5672 from ye-luo/refine-H-mw-api
Consolidate multi-walker APIs of OperatorDependsOnlyOnParticleSet
2 parents e2bf283 + e6796ef commit 5f8c074

12 files changed

Lines changed: 76 additions & 143 deletions

src/QMCHamiltonians/CoulombPBCAA.cpp

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,6 @@ CoulombPBCAA::Return_t CoulombPBCAA::evaluate(ParticleSet& P)
214214
}
215215

216216
void CoulombPBCAA::mw_evaluate(const RefVectorWithLeader<OperatorBase>& o_list,
217-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
218217
const RefVectorWithLeader<ParticleSet>& p_list) const
219218
{
220219
auto& o_leader = o_list.getCastedLeader<CoulombPBCAA>();
@@ -238,11 +237,10 @@ void CoulombPBCAA::mw_evaluate(const RefVectorWithLeader<OperatorBase>& o_list,
238237
}
239238
}
240239
else
241-
OperatorBase::mw_evaluate(o_list, wf_list, p_list);
240+
OperatorDependsOnlyOnParticleSet::mw_evaluate(o_list, p_list);
242241
}
243242

244243
void CoulombPBCAA::mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase>& o_list,
245-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
246244
const RefVectorWithLeader<ParticleSet>& p_list,
247245
const std::vector<ListenerVector<RealType>>& listeners,
248246
const std::vector<ListenerVector<RealType>>& listeners_ions) const
@@ -362,17 +360,6 @@ void CoulombPBCAA::mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase
362360
}
363361
}
364362

365-
void CoulombPBCAA::mw_evaluatePerParticleWithToperator(const RefVectorWithLeader<OperatorBase>& o_list,
366-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
367-
const RefVectorWithLeader<ParticleSet>& p_list,
368-
const std::vector<ListenerVector<RealType>>& listeners,
369-
const std::vector<ListenerVector<RealType>>& ion_listeners) const
370-
371-
{
372-
mw_evaluatePerParticle(o_list, wf_list, p_list, listeners, ion_listeners);
373-
}
374-
375-
376363
void CoulombPBCAA::evaluateIonDerivs(ParticleSet& P,
377364
ParticleSet& ions,
378365
TrialWaveFunction& psi,
@@ -876,8 +863,5 @@ void CoulombPBCAA::releaseResource(ResourceCollection& collection,
876863
collection.takebackResource(o_leader.mw_res_handle_);
877864
}
878865

879-
std::unique_ptr<OperatorBase> CoulombPBCAA::makeClone(ParticleSet& qp)
880-
{
881-
return std::make_unique<CoulombPBCAA>(*this);
882-
}
866+
std::unique_ptr<OperatorBase> CoulombPBCAA::makeClone(ParticleSet& qp) { return std::make_unique<CoulombPBCAA>(*this); }
883867
} // namespace qmcplusplus

src/QMCHamiltonians/CoulombPBCAA.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,25 +126,17 @@ struct CoulombPBCAA : public OperatorDependsOnlyOnParticleSet, public ForceBase
126126
Return_t evaluate(ParticleSet& P) override;
127127

128128
void mw_evaluate(const RefVectorWithLeader<OperatorBase>& o_list,
129-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
130129
const RefVectorWithLeader<ParticleSet>& p_list) const override;
131130

132131
/**
133132
* Evaluate the contribution of this component of multiple walkers per particle reporting
134133
* to registered listeners from Estimators.
135134
*/
136135
void mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase>& o_list,
137-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
138136
const RefVectorWithLeader<ParticleSet>& p_list,
139137
const std::vector<ListenerVector<RealType>>& listeners,
140138
const std::vector<ListenerVector<RealType>>& ion_listeners) const override;
141139

142-
void mw_evaluatePerParticleWithToperator(const RefVectorWithLeader<OperatorBase>& o_list,
143-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
144-
const RefVectorWithLeader<ParticleSet>& p_list,
145-
const std::vector<ListenerVector<RealType>>& listeners,
146-
const std::vector<ListenerVector<RealType>>& ion_listeners) const override;
147-
148140
void evaluateIonDerivs(ParticleSet& P,
149141
ParticleSet& ions,
150142
TrialWaveFunction& psi,

src/QMCHamiltonians/CoulombPBCAB.cpp

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,7 @@ CoulombPBCAB::CoulombPBCAB(ParticleSet& ions, ParticleSet& elns, bool computeFor
6060
app_log() << " Number of k vectors " << AB->Fk.size() << std::endl;
6161
}
6262

63-
std::unique_ptr<OperatorBase> CoulombPBCAB::makeClone(ParticleSet& qp)
64-
{
65-
return std::make_unique<CoulombPBCAB>(*this);
66-
}
63+
std::unique_ptr<OperatorBase> CoulombPBCAB::makeClone(ParticleSet& qp) { return std::make_unique<CoulombPBCAB>(*this); }
6764

6865
CoulombPBCAB::~CoulombPBCAB() = default;
6966

@@ -212,8 +209,8 @@ CoulombPBCAB::Return_t CoulombPBCAB::evaluate_sp(ParticleSet& P)
212209
v1 = 0.0;
213210
for (int s = 0; s < NumSpeciesB; s++)
214211
v1 += Qspec[s] * q *
215-
AB->evaluate(P.getSimulationCell().getKLists().getKShell(), RhoKB.rhok_r[s], RhoKB.rhok_i[s], RhoKA.eikr_r[i],
216-
RhoKA.eikr_i[i]);
212+
AB->evaluate(P.getSimulationCell().getKLists().getKShell(), RhoKB.rhok_r[s], RhoKB.rhok_i[s],
213+
RhoKA.eikr_r[i], RhoKA.eikr_i[i]);
217214
Vi_samp(i) += v1;
218215
Vlr += v1;
219216
}
@@ -268,7 +265,6 @@ CoulombPBCAB::Return_t CoulombPBCAB::evaluate_sp(ParticleSet& P)
268265
#endif
269266

270267
void CoulombPBCAB::mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase>& o_list,
271-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
272268
const RefVectorWithLeader<ParticleSet>& p_list,
273269
const std::vector<ListenerVector<RealType>>& listeners,
274270
const std::vector<ListenerVector<RealType>>& ion_listeners) const
@@ -379,16 +375,6 @@ void CoulombPBCAB::mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase
379375
}
380376
}
381377

382-
void CoulombPBCAB::mw_evaluatePerParticleWithToperator(const RefVectorWithLeader<OperatorBase>& o_list,
383-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
384-
const RefVectorWithLeader<ParticleSet>& p_list,
385-
const std::vector<ListenerVector<RealType>>& listeners,
386-
const std::vector<ListenerVector<RealType>>& ion_listeners) const
387-
388-
{
389-
mw_evaluatePerParticle(o_list, wf_list, p_list, listeners, ion_listeners);
390-
}
391-
392378
/** Evaluate the background term. Other constants are handled by AA potentials.
393379
*
394380
* \f$V_{bg}^{AB}=-\sum_{\alpha}\sum_{\beta} N^{\alpha} N^{\beta} q^{\alpha} q^{\beta} v_s(k=0) \f$

src/QMCHamiltonians/CoulombPBCAB.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,18 +147,11 @@ class CoulombPBCAB : public OperatorDependsOnlyOnParticleSet, public ForceBase
147147
* to registered listeners from Estimators.
148148
*/
149149
void mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase>& o_list,
150-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
151150
const RefVectorWithLeader<ParticleSet>& p_list,
152151
const std::vector<ListenerVector<RealType>>& listeners,
153152
const std::vector<ListenerVector<RealType>>& ion_listeners) const override;
154153

155154

156-
void mw_evaluatePerParticleWithToperator(const RefVectorWithLeader<OperatorBase>& o_list,
157-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
158-
const RefVectorWithLeader<ParticleSet>& p_list,
159-
const std::vector<ListenerVector<RealType>>& listeners,
160-
const std::vector<ListenerVector<RealType>>& ion_listeners) const override;
161-
162155
void evaluateIonDerivs(ParticleSet& P,
163156
ParticleSet& ions,
164157
TrialWaveFunction& psi,

src/QMCHamiltonians/CoulombPotential.cpp

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,6 @@ Return_t CoulombPotential::evaluate(ParticleSet& P)
379379
}
380380

381381
void CoulombPotential::mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase>& o_list,
382-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
383382
const RefVectorWithLeader<ParticleSet>& p_list,
384383
const std::vector<ListenerVector<RealType>>& listeners,
385384
const std::vector<ListenerVector<RealType>>& ion_listeners) const
@@ -395,24 +394,23 @@ void CoulombPotential::mw_evaluatePerParticle(const RefVectorWithLeader<Operator
395394
auto myTableIndex = o_leader.myTableIndex;
396395
auto nCenters = o_leader.nCenters;
397396

398-
auto evaluate_walker = [&va_sample, &vb_sample, myTableIndex,
399-
is_AA, is_active](int walker_index, const ParticleSet& pset, const ParticleSet& pset_ions,
400-
const std::vector<ListenerVector<RealType>>& listeners,
401-
const std::vector<ListenerVector<RealType>>& ion_listeners) -> Return_t {
397+
auto evaluate_walker = [&va_sample, &vb_sample, myTableIndex, is_AA,
398+
is_active](int walker_index, const ParticleSet& pset, const ParticleSet& pset_ions,
399+
const std::vector<ListenerVector<RealType>>& listeners,
400+
const std::vector<ListenerVector<RealType>>& ion_listeners) -> Return_t {
402401
Return_t value = 0;
403402
if (is_AA)
404403
if (is_active)
405-
value =
406-
evaluate_spAA(pset.getDistTableAA(myTableIndex), pset.Z.first_address(), va_sample, listeners);
404+
value = evaluate_spAA(pset.getDistTableAA(myTableIndex), pset.Z.first_address(), va_sample, listeners);
407405
else
408-
value =
409-
evaluate_spAA(pset.getDistTableAA(myTableIndex), pset.Z.first_address(), va_sample, ion_listeners);
406+
value = evaluate_spAA(pset.getDistTableAA(myTableIndex), pset.Z.first_address(), va_sample, ion_listeners);
410407
else
411-
value = evaluate_spAB(pset.getDistTableAB(myTableIndex), pset_ions.Z.first_address(), pset.Z.first_address(), va_sample, vb_sample, listeners, ion_listeners);
408+
value = evaluate_spAB(pset.getDistTableAB(myTableIndex), pset_ions.Z.first_address(), pset.Z.first_address(),
409+
va_sample, vb_sample, listeners, ion_listeners);
412410
return value;
413411
};
414412

415-
auto name = o_leader.name_;
413+
auto name = o_leader.name_;
416414
for (int iw = 0; iw < o_list.size(); ++iw)
417415
{
418416
auto& coulomb_pot = o_list.getCastedElement<CoulombPotential>(iw);
@@ -441,16 +439,6 @@ void CoulombPotential::mw_evaluatePerParticle(const RefVectorWithLeader<Operator
441439
}
442440
}
443441

444-
void CoulombPotential::mw_evaluatePerParticleWithToperator(
445-
const RefVectorWithLeader<OperatorBase>& o_list,
446-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
447-
const RefVectorWithLeader<ParticleSet>& p_list,
448-
const std::vector<ListenerVector<RealType>>& listeners,
449-
const std::vector<ListenerVector<RealType>>& ion_listeners) const
450-
{
451-
mw_evaluatePerParticle(o_list, wf_list, p_list, listeners, ion_listeners);
452-
}
453-
454442
void CoulombPotential::evaluateIonDerivs(ParticleSet& P,
455443
ParticleSet& ions,
456444
TrialWaveFunction& psi,

src/QMCHamiltonians/CoulombPotential.h

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,16 @@ class CoulombPotential : public OperatorDependsOnlyOnParticleSet, public ForceBa
100100
Return_t evaluateAB(const DistanceTableAB& d, const ParticleScalar* restrict Za, const ParticleScalar* restrict Zb);
101101

102102
static Return_t evaluate_spAA(const DistanceTableAA& d,
103-
const ParticleScalar* restrict Z, Vector<RealType>& ve_samples,
103+
const ParticleScalar* restrict Z,
104+
Vector<RealType>& ve_samples,
104105
const std::vector<ListenerVector<RealType>>& listeners);
105106
static Return_t evaluate_spAB(const DistanceTableAB& d,
106107
const ParticleScalar* restrict Za,
107108
const ParticleScalar* restrict Zb,
108-
Vector<RealType>& ve_samples,
109-
Vector<RealType>& vi_samples,
110-
const std::vector<ListenerVector<RealType>>& listeners,
111-
const std::vector<ListenerVector<RealType>>& ion_listeners);
109+
Vector<RealType>& ve_samples,
110+
Vector<RealType>& vi_samples,
111+
const std::vector<ListenerVector<RealType>>& listeners,
112+
const std::vector<ListenerVector<RealType>>& ion_listeners);
112113

113114
#if !defined(REMOVE_TRACEMANAGER)
114115
/** evaluate AA-type interactions */
@@ -124,17 +125,10 @@ class CoulombPotential : public OperatorDependsOnlyOnParticleSet, public ForceBa
124125
Return_t evaluate(ParticleSet& P) override;
125126

126127
void mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase>& o_list,
127-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
128128
const RefVectorWithLeader<ParticleSet>& p_list,
129129
const std::vector<ListenerVector<RealType>>& listeners,
130130
const std::vector<ListenerVector<RealType>>& ion_listeners) const override;
131131

132-
void mw_evaluatePerParticleWithToperator(const RefVectorWithLeader<OperatorBase>& o_list,
133-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
134-
const RefVectorWithLeader<ParticleSet>& p_list,
135-
const std::vector<ListenerVector<RealType>>& listeners,
136-
const std::vector<ListenerVector<RealType>>& ion_listeners) const override;
137-
138132
void evaluateIonDerivs(ParticleSet& P,
139133
ParticleSet& ions,
140134
TrialWaveFunction& psi,
@@ -150,6 +144,7 @@ class CoulombPotential : public OperatorDependsOnlyOnParticleSet, public ForceBa
150144
void setParticlePropertyList(PropertySetType& plist, int offset) override;
151145

152146
std::unique_ptr<OperatorBase> makeClone(ParticleSet& qp) override;
147+
153148
private:
154149
ResourceHandle<CoulombPotentialMultiWalkerResource> mw_res_handle_;
155150
};

src/QMCHamiltonians/LocalECPotential.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ LocalECPotential::Return_t LocalECPotential::evaluate(ParticleSet& P)
143143
}
144144

145145
void LocalECPotential::mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase>& o_list,
146-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
147146
const RefVectorWithLeader<ParticleSet>& p_list,
148147
const std::vector<ListenerVector<RealType>>& listeners,
149148
const std::vector<ListenerVector<RealType>>& ion_listeners) const
@@ -201,16 +200,6 @@ void LocalECPotential::mw_evaluatePerParticle(const RefVectorWithLeader<Operator
201200
}
202201
}
203202

204-
void LocalECPotential::mw_evaluatePerParticleWithToperator(
205-
const RefVectorWithLeader<OperatorBase>& o_list,
206-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
207-
const RefVectorWithLeader<ParticleSet>& p_list,
208-
const std::vector<ListenerVector<RealType>>& listeners,
209-
const std::vector<ListenerVector<RealType>>& ion_listeners) const
210-
{
211-
mw_evaluatePerParticle(o_list, wf_list, p_list, listeners, ion_listeners);
212-
}
213-
214203
void LocalECPotential::evaluateIonDerivs(ParticleSet& P,
215204
ParticleSet& ions,
216205
TrialWaveFunction& psi,

src/QMCHamiltonians/LocalECPotential.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,10 @@ struct LocalECPotential : public OperatorDependsOnlyOnParticleSet
9090

9191
Return_t evaluate(ParticleSet& P) override;
9292
void mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase>& o_list,
93-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
9493
const RefVectorWithLeader<ParticleSet>& p_list,
9594
const std::vector<ListenerVector<RealType>>& listeners,
9695
const std::vector<ListenerVector<RealType>>& ion_listeners) const override;
9796

98-
void mw_evaluatePerParticleWithToperator(const RefVectorWithLeader<OperatorBase>& o_list,
99-
const RefVectorWithLeader<TrialWaveFunction>& wf_list,
100-
const RefVectorWithLeader<ParticleSet>& p_list,
101-
const std::vector<ListenerVector<RealType>>& listeners,
102-
const std::vector<ListenerVector<RealType>>& ion_listeners) const override;
103-
10497
void evaluateIonDerivs(ParticleSet& P,
10598
ParticleSet& ions,
10699
TrialWaveFunction& psi,

src/QMCHamiltonians/OperatorBase.cpp

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -86,31 +86,6 @@ void OperatorBase::mw_evaluate(const RefVectorWithLeader<OperatorBase>& o_list,
8686
const RefVectorWithLeader<ParticleSet>& p_list) const
8787
{
8888
assert(this == &o_list.getLeader());
89-
/** Temporary raw omp pragma for simple thread parallelism
90-
* ignoring the driver level concurrency
91-
*
92-
* TODO: replace this with a proper abstraction. It should adequately describe the behavior
93-
* and strictly limit the activation of this level concurrency to when it is intended.
94-
* It is unlikely to belong in this function.
95-
*
96-
* This implicitly depends on openmp work division logic. Essentially adhoc runtime
97-
* crowds over which we have given up control of thread/global scope.
98-
* How many walkers per thread? How to handle their data movement if any of these
99-
* hamiltonians should be accelerated? We can neither reason about or describe it in C++
100-
*
101-
* As I understand it it should only be required for as long as the AMD openmp offload
102-
* compliler is incapable of running multiple threads. They should/must fix their compiler
103-
* before delivery of frontier and it should be removed at that point at latest
104-
*
105-
* If you want 16 threads of 1 walker that should be 16 crowds of 1
106-
* not one crowd of 16 with openmp thrown in at hamiltonian level.
107-
* If this must be different from the other crowd batching. Make this a reasoned about
108-
* and controlled level of concurency blocking at the driver level.
109-
*
110-
* This is only thread safe only if each walker has a complete
111-
* set of anything involved in an Operator.evaluate.
112-
*/
113-
#pragma omp parallel for
11489
for (int iw = 0; iw < o_list.size(); iw++)
11590
o_list[iw].evaluate(wf_list[iw], p_list[iw]);
11691
}
@@ -121,6 +96,7 @@ void OperatorBase::mw_evaluatePerParticle(const RefVectorWithLeader<OperatorBase
12196
const std::vector<ListenerVector<RealType>>& listeners,
12297
const std::vector<ListenerVector<RealType>>& listeners_ions) const
12398
{
99+
assert(this == &o_list.getLeader());
124100
mw_evaluate(o_list, wf_list, p_list);
125101
}
126102

0 commit comments

Comments
 (0)