Unverified Commit 8fe2b5a5 authored by peastman's avatar peastman Committed by GitHub
Browse files

Merge pull request #2024 from peastman/copyparams

Optimizations to updateParametersInContext()
parents 6b32fc32 af57bf98
...@@ -1119,33 +1119,39 @@ bool CudaContext::invalidateMolecules(CudaForceInfo* force) { ...@@ -1119,33 +1119,39 @@ bool CudaContext::invalidateMolecules(CudaForceInfo* force) {
for (int i = 0; i < forces.size(); i++) for (int i = 0; i < forces.size(); i++)
if (forces[i] == force) if (forces[i] == force)
forceIndex = i; forceIndex = i;
for (int group = 0; valid && group < (int) moleculeGroups.size(); group++) { getPlatformData().threads.execute([&] (ThreadPool& threads, int threadIndex) {
MoleculeGroup& mol = moleculeGroups[group]; for (int group = 0; valid && group < (int) moleculeGroups.size(); group++) {
vector<int>& instances = mol.instances; MoleculeGroup& mol = moleculeGroups[group];
vector<int>& offsets = mol.offsets; vector<int>& instances = mol.instances;
vector<int>& atoms = mol.atoms; vector<int>& offsets = mol.offsets;
int numMolecules = instances.size(); vector<int>& atoms = mol.atoms;
Molecule& m1 = molecules[instances[0]]; int numMolecules = instances.size();
int offset1 = offsets[0]; Molecule& m1 = molecules[instances[0]];
for (int j = 1; valid && j < numMolecules; j++) { int offset1 = offsets[0];
// See if the atoms are identical. int numThreads = threads.getNumThreads();
int start = max(1, threadIndex*numMolecules/numThreads);
Molecule& m2 = molecules[instances[j]]; int end = (threadIndex+1)*numMolecules/numThreads;
int offset2 = offsets[j]; for (int j = start; j < end; j++) {
for (int i = 0; i < (int) atoms.size() && valid; i++) { // See if the atoms are identical.
if (!force->areParticlesIdentical(atoms[i]+offset1, atoms[i]+offset2))
valid = false; Molecule& m2 = molecules[instances[j]];
} int offset2 = offsets[j];
for (int i = 0; i < (int) atoms.size() && valid; i++) {
if (!force->areParticlesIdentical(atoms[i]+offset1, atoms[i]+offset2))
valid = false;
}
// See if the force groups are identical. // See if the force groups are identical.
if (valid && forceIndex > -1) { if (valid && forceIndex > -1) {
for (int k = 0; k < (int) m1.groups[forceIndex].size() && valid; k++) for (int k = 0; k < (int) m1.groups[forceIndex].size() && valid; k++)
if (!force->areGroupsIdentical(m1.groups[forceIndex][k], m2.groups[forceIndex][k])) if (!force->areGroupsIdentical(m1.groups[forceIndex][k], m2.groups[forceIndex][k]))
valid = false; valid = false;
}
} }
} }
} });
getPlatformData().threads.waitForThreads();
if (valid) if (valid)
return false; return false;
......
...@@ -2165,7 +2165,7 @@ void CudaCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context, ...@@ -2165,7 +2165,7 @@ void CudaCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context,
// Record the per-particle parameters. // Record the per-particle parameters.
vector<double> chargeVector(cu.getNumAtoms()); vector<double> chargeVector(cu.getNumAtoms());
vector<float2> sigmaEpsilonVector(cu.getPaddedNumAtoms(), make_float2(0, 0)); vector<float2> sigmaEpsilonVector(cu.getPaddedNumAtoms());
double sumSquaredCharges = 0.0; double sumSquaredCharges = 0.0;
double sumSquaredC6 = 0.0; double sumSquaredC6 = 0.0;
const vector<int>& order = cu.getAtomIndex(); const vector<int>& order = cu.getAtomIndex();
...@@ -2180,6 +2180,8 @@ void CudaCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context, ...@@ -2180,6 +2180,8 @@ void CudaCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context,
sumSquaredC6 += C6*C6; sumSquaredC6 += C6*C6;
sumSquaredCharges += charge*charge; sumSquaredCharges += charge*charge;
} }
for (int i = force.getNumParticles(); i < cu.getPaddedNumAtoms(); i++)
sigmaEpsilonVector[i] = make_float2(0,0);
cu.setCharges(chargeVector); cu.setCharges(chargeVector);
sigmaEpsilon.upload(sigmaEpsilonVector); sigmaEpsilon.upload(sigmaEpsilonVector);
...@@ -2977,7 +2979,7 @@ void CudaCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context, c ...@@ -2977,7 +2979,7 @@ void CudaCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context, c
// Record the per-particle parameters. // Record the per-particle parameters.
vector<double> chargeVector(cu.getNumAtoms()); vector<double> chargeVector(cu.getNumAtoms());
vector<float2> paramsVector(cu.getPaddedNumAtoms(), make_float2(1, 1)); vector<float2> paramsVector(cu.getPaddedNumAtoms());
const double dielectricOffset = 0.009; const double dielectricOffset = 0.009;
for (int i = 0; i < numParticles; i++) { for (int i = 0; i < numParticles; i++) {
double charge, radius, scalingFactor; double charge, radius, scalingFactor;
...@@ -2986,6 +2988,8 @@ void CudaCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context, c ...@@ -2986,6 +2988,8 @@ void CudaCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context, c
radius -= dielectricOffset; radius -= dielectricOffset;
paramsVector[i] = make_float2((float) radius, (float) (scalingFactor*radius)); paramsVector[i] = make_float2((float) radius, (float) (scalingFactor*radius));
} }
for (int i = numParticles; i < cu.getPaddedNumAtoms(); i++)
paramsVector[i] = make_float2(1, 1);
cu.setCharges(chargeVector); cu.setCharges(chargeVector);
params.upload(paramsVector); params.upload(paramsVector);
......
...@@ -1006,33 +1006,39 @@ bool OpenCLContext::invalidateMolecules(OpenCLForceInfo* force) { ...@@ -1006,33 +1006,39 @@ bool OpenCLContext::invalidateMolecules(OpenCLForceInfo* force) {
for (int i = 0; i < forces.size(); i++) for (int i = 0; i < forces.size(); i++)
if (forces[i] == force) if (forces[i] == force)
forceIndex = i; forceIndex = i;
for (int group = 0; valid && group < (int) moleculeGroups.size(); group++) { getPlatformData().threads.execute([&] (ThreadPool& threads, int threadIndex) {
MoleculeGroup& mol = moleculeGroups[group]; for (int group = 0; valid && group < (int) moleculeGroups.size(); group++) {
vector<int>& instances = mol.instances; MoleculeGroup& mol = moleculeGroups[group];
vector<int>& offsets = mol.offsets; vector<int>& instances = mol.instances;
vector<int>& atoms = mol.atoms; vector<int>& offsets = mol.offsets;
int numMolecules = instances.size(); vector<int>& atoms = mol.atoms;
Molecule& m1 = molecules[instances[0]]; int numMolecules = instances.size();
int offset1 = offsets[0]; Molecule& m1 = molecules[instances[0]];
for (int j = 1; valid && j < numMolecules; j++) { int offset1 = offsets[0];
// See if the atoms are identical. int numThreads = threads.getNumThreads();
int start = max(1, threadIndex*numMolecules/numThreads);
Molecule& m2 = molecules[instances[j]]; int end = (threadIndex+1)*numMolecules/numThreads;
int offset2 = offsets[j]; for (int j = start; j < end; j++) {
for (int i = 0; i < (int) atoms.size() && valid; i++) { // See if the atoms are identical.
if (!force->areParticlesIdentical(atoms[i]+offset1, atoms[i]+offset2))
valid = false; Molecule& m2 = molecules[instances[j]];
} int offset2 = offsets[j];
for (int i = 0; i < (int) atoms.size(); i++) {
if (!force->areParticlesIdentical(atoms[i]+offset1, atoms[i]+offset2))
valid = false;
}
// See if the force groups are identical. // See if the force groups are identical.
if (valid && forceIndex > -1) { if (valid && forceIndex > -1) {
for (int k = 0; k < (int) m1.groups[forceIndex].size() && valid; k++) for (int k = 0; k < (int) m1.groups[forceIndex].size(); k++)
if (!force->areGroupsIdentical(m1.groups[forceIndex][k], m2.groups[forceIndex][k])) if (!force->areGroupsIdentical(m1.groups[forceIndex][k], m2.groups[forceIndex][k]))
valid = false; valid = false;
}
} }
} }
} });
getPlatformData().threads.waitForThreads();
if (valid) if (valid)
return false; return false;
......
...@@ -2296,7 +2296,7 @@ void OpenCLCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& contex ...@@ -2296,7 +2296,7 @@ void OpenCLCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& contex
// Record the per-particle parameters. // Record the per-particle parameters.
vector<double> chargeVector(cl.getNumAtoms()); vector<double> chargeVector(cl.getNumAtoms());
vector<mm_float2> sigmaEpsilonVector(cl.getPaddedNumAtoms(), mm_float2(0,0)); vector<mm_float2> sigmaEpsilonVector(cl.getPaddedNumAtoms());
double sumSquaredCharges = 0.0; double sumSquaredCharges = 0.0;
for (int i = 0; i < force.getNumParticles(); i++) { for (int i = 0; i < force.getNumParticles(); i++) {
double charge, sigma, epsilon; double charge, sigma, epsilon;
...@@ -2305,6 +2305,8 @@ void OpenCLCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& contex ...@@ -2305,6 +2305,8 @@ void OpenCLCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& contex
sigmaEpsilonVector[i] = mm_float2((float) (0.5*sigma), (float) (2.0*sqrt(epsilon))); sigmaEpsilonVector[i] = mm_float2((float) (0.5*sigma), (float) (2.0*sqrt(epsilon)));
sumSquaredCharges += charge*charge; sumSquaredCharges += charge*charge;
} }
for (int i = force.getNumParticles(); i < cl.getPaddedNumAtoms(); i++)
sigmaEpsilonVector[i] = mm_float2(0,0);
cl.setCharges(chargeVector); cl.setCharges(chargeVector);
sigmaEpsilon.upload(sigmaEpsilonVector); sigmaEpsilon.upload(sigmaEpsilonVector);
...@@ -3123,7 +3125,7 @@ void OpenCLCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context, ...@@ -3123,7 +3125,7 @@ void OpenCLCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context,
// Record the per-particle parameters. // Record the per-particle parameters.
vector<double> chargeVector(cl.getNumAtoms()); vector<double> chargeVector(cl.getNumAtoms());
vector<mm_float2> paramsVector(cl.getPaddedNumAtoms(), mm_float2(1,1)); vector<mm_float2> paramsVector(cl.getPaddedNumAtoms());
const double dielectricOffset = 0.009; const double dielectricOffset = 0.009;
for (int i = 0; i < numParticles; i++) { for (int i = 0; i < numParticles; i++) {
double charge, radius, scalingFactor; double charge, radius, scalingFactor;
...@@ -3132,6 +3134,8 @@ void OpenCLCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context, ...@@ -3132,6 +3134,8 @@ void OpenCLCalcGBSAOBCForceKernel::copyParametersToContext(ContextImpl& context,
radius -= dielectricOffset; radius -= dielectricOffset;
paramsVector[i] = mm_float2((float) radius, (float) (scalingFactor*radius)); paramsVector[i] = mm_float2((float) radius, (float) (scalingFactor*radius));
} }
for (int i = numParticles; i < cl.getPaddedNumAtoms(); i++)
paramsVector[i] = mm_float2(1,1);
cl.setCharges(chargeVector); cl.setCharges(chargeVector);
params.upload(paramsVector); params.upload(paramsVector);
......
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