Unverified Commit fdea63e9 authored by Peter Eastman's avatar Peter Eastman Committed by GitHub
Browse files

Reducing sorting overhead for small systems with PME (#5027)

parent d2f76949
...@@ -47,7 +47,7 @@ namespace OpenMM { ...@@ -47,7 +47,7 @@ namespace OpenMM {
class CommonCalcNonbondedForceKernel : public CalcNonbondedForceKernel { class CommonCalcNonbondedForceKernel : public CalcNonbondedForceKernel {
public: public:
CommonCalcNonbondedForceKernel(std::string name, const Platform& platform, ComputeContext& cc, const System& system) : CalcNonbondedForceKernel(name, platform), CommonCalcNonbondedForceKernel(std::string name, const Platform& platform, ComputeContext& cc, const System& system) : CalcNonbondedForceKernel(name, platform),
hasInitializedKernel(false), cc(cc), pmeio(NULL) { hasInitializedKernel(false), cc(cc), pmeio(NULL), stepsToSort(0) {
} }
~CommonCalcNonbondedForceKernel(); ~CommonCalcNonbondedForceKernel();
/** /**
...@@ -168,6 +168,7 @@ private: ...@@ -168,6 +168,7 @@ private:
double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha, totalCharge; double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha, totalCharge;
int gridSizeX, gridSizeY, gridSizeZ; int gridSizeX, gridSizeY, gridSizeZ;
int dispersionGridSizeX, dispersionGridSizeY, dispersionGridSizeZ; int dispersionGridSizeX, dispersionGridSizeY, dispersionGridSizeZ;
int stepsToSort;
bool usePmeQueue, deviceIsCpu, useFixedPointChargeSpreading, useCpuPme; bool usePmeQueue, deviceIsCpu, useFixedPointChargeSpreading, useCpuPme;
bool hasCoulomb, hasLJ, doLJPME, usePosqCharges, recomputeParams, hasOffsets; bool hasCoulomb, hasLJ, doLJPME, usePosqCharges, recomputeParams, hasOffsets;
NonbondedMethod nonbondedMethod; NonbondedMethod nonbondedMethod;
......
...@@ -960,19 +960,24 @@ double CommonCalcNonbondedForceKernel::execute(ContextImpl& context, bool includ ...@@ -960,19 +960,24 @@ double CommonCalcNonbondedForceKernel::execute(ContextImpl& context, bool includ
// Execute the reciprocal space kernels. // Execute the reciprocal space kernels.
if (hasCoulomb) { if (hasCoulomb) {
setPeriodicBoxArgs(cc, pmeGridIndexKernel, 2); if (stepsToSort <= 0 || doLJPME || cc.getNumAtoms() > 15000) {
if (cc.getUseDoublePrecision()) { setPeriodicBoxArgs(cc, pmeGridIndexKernel, 2);
pmeGridIndexKernel->setArg(7, recipBoxVectors[0]); if (cc.getUseDoublePrecision()) {
pmeGridIndexKernel->setArg(8, recipBoxVectors[1]); pmeGridIndexKernel->setArg(7, recipBoxVectors[0]);
pmeGridIndexKernel->setArg(9, recipBoxVectors[2]); pmeGridIndexKernel->setArg(8, recipBoxVectors[1]);
} pmeGridIndexKernel->setArg(9, recipBoxVectors[2]);
else { }
pmeGridIndexKernel->setArg(7, recipBoxVectorsFloat[0]); else {
pmeGridIndexKernel->setArg(8, recipBoxVectorsFloat[1]); pmeGridIndexKernel->setArg(7, recipBoxVectorsFloat[0]);
pmeGridIndexKernel->setArg(9, recipBoxVectorsFloat[2]); pmeGridIndexKernel->setArg(8, recipBoxVectorsFloat[1]);
pmeGridIndexKernel->setArg(9, recipBoxVectorsFloat[2]);
}
pmeGridIndexKernel->execute(cc.getNumAtoms());
sort->sort(pmeAtomGridIndex);
stepsToSort = 3;
} }
pmeGridIndexKernel->execute(cc.getNumAtoms()); else
sort->sort(pmeAtomGridIndex); stepsToSort--;
setPeriodicBoxArgs(cc, pmeSpreadChargeKernel, 2); setPeriodicBoxArgs(cc, pmeSpreadChargeKernel, 2);
if (cc.getUseDoublePrecision()) { if (cc.getUseDoublePrecision()) {
pmeSpreadChargeKernel->setArg(7, recipBoxVectors[0]); pmeSpreadChargeKernel->setArg(7, recipBoxVectors[0]);
...@@ -1038,8 +1043,7 @@ double CommonCalcNonbondedForceKernel::execute(ContextImpl& context, bool includ ...@@ -1038,8 +1043,7 @@ double CommonCalcNonbondedForceKernel::execute(ContextImpl& context, bool includ
pmeDispersionGridIndexKernel->setArg(9, recipBoxVectorsFloat[2]); pmeDispersionGridIndexKernel->setArg(9, recipBoxVectorsFloat[2]);
} }
pmeDispersionGridIndexKernel->execute(cc.getNumAtoms()); pmeDispersionGridIndexKernel->execute(cc.getNumAtoms());
if (!hasCoulomb) sort->sort(pmeAtomGridIndex);
sort->sort(pmeAtomGridIndex);
if (useFixedPointChargeSpreading) if (useFixedPointChargeSpreading)
cc.clearBuffer(pmeGrid2); cc.clearBuffer(pmeGrid2);
else else
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment