Unverified Commit 03ed8ff2 authored by Christopher Woods's avatar Christopher Woods Committed by GitHub
Browse files

WIP - looking for a way to optimise performance of creating contexts by...

WIP - looking for a way to optimise performance of creating contexts by removing temporary arrays (and their associated mallocs/frees) (#4261)

* Suggesting a "haveSameParameters" function for CustomNonbondedForce which could be
used to avoid creating temporary copies of arrays when testing if particles are
the same.

Also updating "getParticleParameters" so that it re-uses the memory of the
passed vector argument, rather than deallocating and reallocating it
via a copy.

* Revert "Suggesting a "haveSameParameters" function for CustomNonbondedForce which could be"

This reverts commit e80ec2d2e9981abb90711636bf3a78d0c49e43fc.

* Moved to `thread_local static` as suggested to prevent new vector allocations on each function call.

Updated `getParameters` and `getBondParameters` to re-use the memory from the argument rather
than re-allocating via the copy.

* Forgot to reuse the memory for the groups...

* Reverted back the manual copies via memcpy as they aren't needed. Looking at the header
file and benchmarking shows that std::vector does the right thing.

* Confined `thread_local static` only to ForceInfo methods, and have also put declarations
for multiple variables back onto a single line

* Removed `thread_local static` from the constructor

* Moved constructor declarations back into the for loop
parent 0363c38d
...@@ -236,7 +236,7 @@ public: ...@@ -236,7 +236,7 @@ public:
} }
void getParticlesInGroup(int index, vector<int>& particles) { void getParticlesInGroup(int index, vector<int>& particles) {
int particle1, particle2; int particle1, particle2;
vector<double> parameters; thread_local static vector<double> parameters;
force.getBondParameters(index, particle1, particle2, parameters); force.getBondParameters(index, particle1, particle2, parameters);
particles.resize(2); particles.resize(2);
particles[0] = particle1; particles[0] = particle1;
...@@ -244,7 +244,7 @@ public: ...@@ -244,7 +244,7 @@ public:
} }
bool areGroupsIdentical(int group1, int group2) { bool areGroupsIdentical(int group1, int group2) {
int particle1, particle2; int particle1, particle2;
vector<double> parameters1, parameters2; thread_local static vector<double> parameters1, parameters2;
force.getBondParameters(group1, particle1, particle2, parameters1); force.getBondParameters(group1, particle1, particle2, parameters1);
force.getBondParameters(group2, particle1, particle2, parameters2); force.getBondParameters(group2, particle1, particle2, parameters2);
for (int i = 0; i < (int) parameters1.size(); i++) for (int i = 0; i < (int) parameters1.size(); i++)
...@@ -474,7 +474,7 @@ public: ...@@ -474,7 +474,7 @@ public:
} }
void getParticlesInGroup(int index, vector<int>& particles) { void getParticlesInGroup(int index, vector<int>& particles) {
int particle1, particle2, particle3; int particle1, particle2, particle3;
vector<double> parameters; thread_local static vector<double> parameters;
force.getAngleParameters(index, particle1, particle2, particle3, parameters); force.getAngleParameters(index, particle1, particle2, particle3, parameters);
particles.resize(3); particles.resize(3);
particles[0] = particle1; particles[0] = particle1;
...@@ -483,7 +483,7 @@ public: ...@@ -483,7 +483,7 @@ public:
} }
bool areGroupsIdentical(int group1, int group2) { bool areGroupsIdentical(int group1, int group2) {
int particle1, particle2, particle3; int particle1, particle2, particle3;
vector<double> parameters1, parameters2; thread_local static vector<double> parameters1, parameters2;
force.getAngleParameters(group1, particle1, particle2, particle3, parameters1); force.getAngleParameters(group1, particle1, particle2, particle3, parameters1);
force.getAngleParameters(group2, particle1, particle2, particle3, parameters2); force.getAngleParameters(group2, particle1, particle2, particle3, parameters2);
for (int i = 0; i < (int) parameters1.size(); i++) for (int i = 0; i < (int) parameters1.size(); i++)
...@@ -807,7 +807,7 @@ public: ...@@ -807,7 +807,7 @@ public:
} }
void getParticlesInGroup(int index, vector<int>& particles) { void getParticlesInGroup(int index, vector<int>& particles) {
int particle1, particle2, particle3, particle4; int particle1, particle2, particle3, particle4;
vector<double> parameters; thread_local static vector<double> parameters;
force.getTorsionParameters(index, particle1, particle2, particle3, particle4, parameters); force.getTorsionParameters(index, particle1, particle2, particle3, particle4, parameters);
particles.resize(4); particles.resize(4);
particles[0] = particle1; particles[0] = particle1;
...@@ -817,7 +817,7 @@ public: ...@@ -817,7 +817,7 @@ public:
} }
bool areGroupsIdentical(int group1, int group2) { bool areGroupsIdentical(int group1, int group2) {
int particle1, particle2, particle3, particle4; int particle1, particle2, particle3, particle4;
vector<double> parameters1, parameters2; thread_local static vector<double> parameters1, parameters2;
force.getTorsionParameters(group1, particle1, particle2, particle3, particle4, parameters1); force.getTorsionParameters(group1, particle1, particle2, particle3, particle4, parameters1);
force.getTorsionParameters(group2, particle1, particle2, particle3, particle4, parameters2); force.getTorsionParameters(group2, particle1, particle2, particle3, particle4, parameters2);
for (int i = 0; i < (int) parameters1.size(); i++) for (int i = 0; i < (int) parameters1.size(); i++)
...@@ -1095,8 +1095,7 @@ public: ...@@ -1095,8 +1095,7 @@ public:
if (particle1 == -1 || particle2 == -1) if (particle1 == -1 || particle2 == -1)
return false; return false;
int temp; int temp;
vector<double> params1; thread_local static vector<double> params1, params2;
vector<double> params2;
force.getParticleParameters(particle1, temp, params1); force.getParticleParameters(particle1, temp, params1);
force.getParticleParameters(particle2, temp, params2); force.getParticleParameters(particle2, temp, params2);
for (int i = 0; i < (int) params1.size(); i++) for (int i = 0; i < (int) params1.size(); i++)
...@@ -1243,12 +1242,12 @@ public: ...@@ -1243,12 +1242,12 @@ public:
return force.getNumBonds(); return force.getNumBonds();
} }
void getParticlesInGroup(int index, vector<int>& particles) { void getParticlesInGroup(int index, vector<int>& particles) {
vector<double> parameters; thread_local static vector<double> parameters;
force.getBondParameters(index, particles, parameters); force.getBondParameters(index, particles, parameters);
} }
bool areGroupsIdentical(int group1, int group2) { bool areGroupsIdentical(int group1, int group2) {
vector<int> particles; thread_local static vector<int> particles;
vector<double> parameters1, parameters2; thread_local static vector<double> parameters1, parameters2;
force.getBondParameters(group1, particles, parameters1); force.getBondParameters(group1, particles, parameters1);
force.getBondParameters(group2, particles, parameters2); force.getBondParameters(group2, particles, parameters2);
for (int i = 0; i < (int) parameters1.size(); i++) for (int i = 0; i < (int) parameters1.size(); i++)
...@@ -1442,8 +1441,8 @@ public: ...@@ -1442,8 +1441,8 @@ public:
return force.getNumBonds(); return force.getNumBonds();
} }
void getParticlesInGroup(int index, vector<int>& particles) { void getParticlesInGroup(int index, vector<int>& particles) {
vector<double> parameters; thread_local static vector<double> parameters;
vector<int> groups; thread_local static vector<int> groups;
force.getBondParameters(index, groups, parameters); force.getBondParameters(index, groups, parameters);
for (int group : groups) { for (int group : groups) {
vector<int> groupParticles; vector<int> groupParticles;
...@@ -1453,8 +1452,8 @@ public: ...@@ -1453,8 +1452,8 @@ public:
} }
} }
bool areGroupsIdentical(int group1, int group2) { bool areGroupsIdentical(int group1, int group2) {
vector<int> groups1, groups2; thread_local static vector<int> groups1, groups2;
vector<double> parameters1, parameters2; thread_local static vector<double> parameters1, parameters2;
force.getBondParameters(group1, groups1, parameters1); force.getBondParameters(group1, groups1, parameters1);
force.getBondParameters(group2, groups2, parameters2); force.getBondParameters(group2, groups2, parameters2);
for (int i = 0; i < (int) parameters1.size(); i++) for (int i = 0; i < (int) parameters1.size(); i++)
...@@ -1778,8 +1777,7 @@ public: ...@@ -1778,8 +1777,7 @@ public:
} }
} }
bool areParticlesIdentical(int particle1, int particle2) { bool areParticlesIdentical(int particle1, int particle2) {
vector<double> params1; thread_local static vector<double> params1, params2;
vector<double> params2;
force.getParticleParameters(particle1, params1); force.getParticleParameters(particle1, params1);
force.getParticleParameters(particle2, params2); force.getParticleParameters(particle2, params2);
for (int i = 0; i < (int) params1.size(); i++) for (int i = 0; i < (int) params1.size(); i++)
...@@ -2683,8 +2681,7 @@ public: ...@@ -2683,8 +2681,7 @@ public:
ForceInfo(const CustomGBForce& force) : force(force) { ForceInfo(const CustomGBForce& force) : force(force) {
} }
bool areParticlesIdentical(int particle1, int particle2) { bool areParticlesIdentical(int particle1, int particle2) {
vector<double> params1; thread_local static vector<double> params1, params2;
vector<double> params2;
force.getParticleParameters(particle1, params1); force.getParticleParameters(particle1, params1);
force.getParticleParameters(particle2, params2); force.getParticleParameters(particle2, params2);
for (int i = 0; i < (int) params1.size(); i++) for (int i = 0; i < (int) params1.size(); i++)
...@@ -3710,7 +3707,7 @@ public: ...@@ -3710,7 +3707,7 @@ public:
} }
void getParticlesInGroup(int index, vector<int>& particles) { void getParticlesInGroup(int index, vector<int>& particles) {
int p1, p2, p3; int p1, p2, p3;
vector<double> parameters; thread_local static vector<double> parameters;
if (index < force.getNumDonors()) { if (index < force.getNumDonors()) {
force.getDonorParameters(index, p1, p2, p3, parameters); force.getDonorParameters(index, p1, p2, p3, parameters);
particles.clear(); particles.clear();
...@@ -3751,7 +3748,7 @@ public: ...@@ -3751,7 +3748,7 @@ public:
} }
bool areGroupsIdentical(int group1, int group2) { bool areGroupsIdentical(int group1, int group2) {
int p1, p2, p3; int p1, p2, p3;
vector<double> params1, params2; thread_local static vector<double> params1, params2;
if (group1 < force.getNumDonors() && group2 < force.getNumDonors()) { if (group1 < force.getNumDonors() && group2 < force.getNumDonors()) {
force.getDonorParameters(group1, p1, p2, p3, params1); force.getDonorParameters(group1, p1, p2, p3, params1);
force.getDonorParameters(group2, p1, p2, p3, params2); force.getDonorParameters(group2, p1, p2, p3, params2);
...@@ -4195,7 +4192,7 @@ public: ...@@ -4195,7 +4192,7 @@ public:
ForceInfo(const CustomManyParticleForce& force) : force(force) { ForceInfo(const CustomManyParticleForce& force) : force(force) {
} }
bool areParticlesIdentical(int particle1, int particle2) { bool areParticlesIdentical(int particle1, int particle2) {
vector<double> params1, params2; thread_local static vector<double> params1, params2;
int type1, type2; int type1, type2;
force.getParticleParameters(particle1, params1, type1); force.getParticleParameters(particle1, params1, type1);
force.getParticleParameters(particle2, params2, type2); force.getParticleParameters(particle2, params2, type2);
......
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