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