"platforms/reference/include/ReferenceCustomManyParticleIxn.h" did not exist on "be137f98b09f0a68b2b5f7479314b647f18c7598"
Commit 0c4af105 authored by Peter Eastman's avatar Peter Eastman
Browse files

Optimizations to CustomGBForce

parent e7a00c6a
This diff is collapsed.
...@@ -687,6 +687,7 @@ private: ...@@ -687,6 +687,7 @@ private:
std::vector<std::string> globalParamNames; std::vector<std::string> globalParamNames;
std::vector<cl_float> globalParamValues; std::vector<cl_float> globalParamValues;
std::vector<OpenCLArray<mm_float4>*> tabulatedFunctions; std::vector<OpenCLArray<mm_float4>*> tabulatedFunctions;
std::vector<bool> pairValueUsesParam, pairEnergyUsesParam, pairEnergyUsesValue;
System& system; System& system;
cl::Kernel pairValueKernel, perParticleValueKernel, pairEnergyKernel, perParticleEnergyKernel, gradientChainRuleKernel; cl::Kernel pairValueKernel, perParticleValueKernel, pairEnergyKernel, perParticleEnergyKernel, gradientChainRuleKernel;
}; };
......
...@@ -32,11 +32,12 @@ ...@@ -32,11 +32,12 @@
using namespace OpenMM; using namespace OpenMM;
using namespace std; using namespace std;
OpenCLParameterSet::OpenCLParameterSet(OpenCLContext& context, int numParameters, int numObjects, const string& name) : OpenCLParameterSet::OpenCLParameterSet(OpenCLContext& context, int numParameters, int numObjects, const string& name, bool bufferPerParameter) :
context(context), numParameters(numParameters), numObjects(numObjects), name(name) { context(context), numParameters(numParameters), numObjects(numObjects), name(name) {
int params = numParameters; int params = numParameters;
int bufferCount = 0; int bufferCount = 0;
try { try {
if (!bufferPerParameter) {
while (params > 2) { while (params > 2) {
cl::Buffer* buf = new cl::Buffer(context.getContext(), CL_MEM_READ_WRITE, numObjects*sizeof(mm_float4)); cl::Buffer* buf = new cl::Buffer(context.getContext(), CL_MEM_READ_WRITE, numObjects*sizeof(mm_float4));
std::stringstream name; std::stringstream name;
...@@ -51,11 +52,13 @@ OpenCLParameterSet::OpenCLParameterSet(OpenCLContext& context, int numParameters ...@@ -51,11 +52,13 @@ OpenCLParameterSet::OpenCLParameterSet(OpenCLContext& context, int numParameters
buffers.push_back(OpenCLNonbondedUtilities::ParameterInfo(name.str(), "float", 2, sizeof(mm_float2), *buf)); buffers.push_back(OpenCLNonbondedUtilities::ParameterInfo(name.str(), "float", 2, sizeof(mm_float2), *buf));
params -= 2; params -= 2;
} }
if (params > 0) { }
while (params > 0) {
cl::Buffer* buf = new cl::Buffer(context.getContext(), CL_MEM_READ_WRITE, numObjects*sizeof(cl_float)); cl::Buffer* buf = new cl::Buffer(context.getContext(), CL_MEM_READ_WRITE, numObjects*sizeof(cl_float));
std::stringstream name; std::stringstream name;
name << "param" << (++bufferCount); name << "param" << (++bufferCount);
buffers.push_back(OpenCLNonbondedUtilities::ParameterInfo(name.str(), "float", 1, sizeof(cl_float), *buf)); buffers.push_back(OpenCLNonbondedUtilities::ParameterInfo(name.str(), "float", 1, sizeof(cl_float), *buf));
params--;
} }
} }
catch (cl::Error err) { catch (cl::Error err) {
...@@ -106,6 +109,7 @@ void OpenCLParameterSet::getParameterValues(vector<vector<cl_float> >& values) c ...@@ -106,6 +109,7 @@ void OpenCLParameterSet::getParameterValues(vector<vector<cl_float> >& values) c
context.getQueue().enqueueReadBuffer(reinterpret_cast<cl::Buffer&>(buffers[i].getMemory()), CL_TRUE, 0, numObjects*buffers[i].getSize(), &data[0]); context.getQueue().enqueueReadBuffer(reinterpret_cast<cl::Buffer&>(buffers[i].getMemory()), CL_TRUE, 0, numObjects*buffers[i].getSize(), &data[0]);
for (int j = 0; j < numObjects; j++) for (int j = 0; j < numObjects; j++)
values[j][base] = data[j]; values[j][base] = data[j];
base++;
} }
else else
throw OpenMMException("Internal error: Unknown buffer type in OpenCLParameterSet"); throw OpenMMException("Internal error: Unknown buffer type in OpenCLParameterSet");
...@@ -151,6 +155,7 @@ void OpenCLParameterSet::setParameterValues(const vector<vector<cl_float> >& val ...@@ -151,6 +155,7 @@ void OpenCLParameterSet::setParameterValues(const vector<vector<cl_float> >& val
for (int j = 0; j < numObjects; j++) for (int j = 0; j < numObjects; j++)
data[j] = values[j][base]; data[j] = values[j][base];
context.getQueue().enqueueWriteBuffer(reinterpret_cast<cl::Buffer&>(buffers[i].getMemory()), CL_TRUE, 0, numObjects*buffers[i].getSize(), &data[0]); context.getQueue().enqueueWriteBuffer(reinterpret_cast<cl::Buffer&>(buffers[i].getMemory()), CL_TRUE, 0, numObjects*buffers[i].getSize(), &data[0]);
base++;
} }
else else
throw OpenMMException("Internal error: Unknown buffer type in OpenCLParameterSet"); throw OpenMMException("Internal error: Unknown buffer type in OpenCLParameterSet");
......
...@@ -49,8 +49,10 @@ public: ...@@ -49,8 +49,10 @@ public:
* @param numParameters the number of parameters for each object * @param numParameters the number of parameters for each object
* @param numObjects the number of objects to store parameter values for * @param numObjects the number of objects to store parameter values for
* @param name the name of the parameter set * @param name the name of the parameter set
* @param bufferPerParameter if true, a separate cl::Buffer is created for each parameter. If false,
* multiple parameters may be combined into a single buffer.
*/ */
OpenCLParameterSet(OpenCLContext& context, int numParameters, int numObjects, const std::string& name); OpenCLParameterSet(OpenCLContext& context, int numParameters, int numObjects, const std::string& name, bool bufferPerParameter=false);
~OpenCLParameterSet(); ~OpenCLParameterSet();
/** /**
* Get the number of parameters. * Get the number of parameters.
......
#define REDUCE_VALUE(NAME, TYPE) \ #define REDUCE_VALUE(NAME, TYPE) {\
TYPE sum = NAME[index]; \ TYPE sum = NAME[index]; \
for (int i = index+bufferSize; i < totalSize; i += bufferSize) \ for (int i = index+bufferSize; i < totalSize; i += bufferSize) \
sum += NAME[i]; \ sum += NAME[i]; \
NAME[index] = sum; NAME[index] = sum; \
}
/** /**
* Reduce the derivatives computed in the N^2 energy kernel, and compute all per-particle energy terms. * Reduce the derivatives computed in the N^2 energy kernel, and compute all per-particle energy terms.
......
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