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,6 +1119,7 @@ bool CudaContext::invalidateMolecules(CudaForceInfo* force) { ...@@ -1119,6 +1119,7 @@ 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;
getPlatformData().threads.execute([&] (ThreadPool& threads, int threadIndex) {
for (int group = 0; valid && group < (int) moleculeGroups.size(); group++) { for (int group = 0; valid && group < (int) moleculeGroups.size(); group++) {
MoleculeGroup& mol = moleculeGroups[group]; MoleculeGroup& mol = moleculeGroups[group];
vector<int>& instances = mol.instances; vector<int>& instances = mol.instances;
...@@ -1127,7 +1128,10 @@ bool CudaContext::invalidateMolecules(CudaForceInfo* force) { ...@@ -1127,7 +1128,10 @@ bool CudaContext::invalidateMolecules(CudaForceInfo* force) {
int numMolecules = instances.size(); int numMolecules = instances.size();
Molecule& m1 = molecules[instances[0]]; Molecule& m1 = molecules[instances[0]];
int offset1 = offsets[0]; int offset1 = offsets[0];
for (int j = 1; valid && j < numMolecules; j++) { int numThreads = threads.getNumThreads();
int start = max(1, threadIndex*numMolecules/numThreads);
int end = (threadIndex+1)*numMolecules/numThreads;
for (int j = start; j < end; j++) {
// See if the atoms are identical. // See if the atoms are identical.
Molecule& m2 = molecules[instances[j]]; Molecule& m2 = molecules[instances[j]];
...@@ -1146,6 +1150,8 @@ bool CudaContext::invalidateMolecules(CudaForceInfo* force) { ...@@ -1146,6 +1150,8 @@ bool CudaContext::invalidateMolecules(CudaForceInfo* force) {
} }
} }
} }
});
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,6 +1006,7 @@ bool OpenCLContext::invalidateMolecules(OpenCLForceInfo* force) { ...@@ -1006,6 +1006,7 @@ 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;
getPlatformData().threads.execute([&] (ThreadPool& threads, int threadIndex) {
for (int group = 0; valid && group < (int) moleculeGroups.size(); group++) { for (int group = 0; valid && group < (int) moleculeGroups.size(); group++) {
MoleculeGroup& mol = moleculeGroups[group]; MoleculeGroup& mol = moleculeGroups[group];
vector<int>& instances = mol.instances; vector<int>& instances = mol.instances;
...@@ -1014,12 +1015,15 @@ bool OpenCLContext::invalidateMolecules(OpenCLForceInfo* force) { ...@@ -1014,12 +1015,15 @@ bool OpenCLContext::invalidateMolecules(OpenCLForceInfo* force) {
int numMolecules = instances.size(); int numMolecules = instances.size();
Molecule& m1 = molecules[instances[0]]; Molecule& m1 = molecules[instances[0]];
int offset1 = offsets[0]; int offset1 = offsets[0];
for (int j = 1; valid && j < numMolecules; j++) { int numThreads = threads.getNumThreads();
int start = max(1, threadIndex*numMolecules/numThreads);
int end = (threadIndex+1)*numMolecules/numThreads;
for (int j = start; j < end; j++) {
// See if the atoms are identical. // See if the atoms are identical.
Molecule& m2 = molecules[instances[j]]; Molecule& m2 = molecules[instances[j]];
int offset2 = offsets[j]; int offset2 = offsets[j];
for (int i = 0; i < (int) atoms.size() && valid; i++) { for (int i = 0; i < (int) atoms.size(); i++) {
if (!force->areParticlesIdentical(atoms[i]+offset1, atoms[i]+offset2)) if (!force->areParticlesIdentical(atoms[i]+offset1, atoms[i]+offset2))
valid = false; valid = false;
} }
...@@ -1027,12 +1031,14 @@ bool OpenCLContext::invalidateMolecules(OpenCLForceInfo* force) { ...@@ -1027,12 +1031,14 @@ bool OpenCLContext::invalidateMolecules(OpenCLForceInfo* force) {
// 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