Commit d98bd6b0 authored by Peter Eastman's avatar Peter Eastman
Browse files

Optimized CCMA

parent 0ab00340
...@@ -88,7 +88,7 @@ OpenCLIntegrationUtilities::OpenCLIntegrationUtilities(OpenCLContext& context, c ...@@ -88,7 +88,7 @@ OpenCLIntegrationUtilities::OpenCLIntegrationUtilities(OpenCLContext& context, c
random(NULL), randomSeed(NULL), randomPos(0), stepSize(NULL), ccmaAtoms(NULL), ccmaDistance(NULL), random(NULL), randomSeed(NULL), randomPos(0), stepSize(NULL), ccmaAtoms(NULL), ccmaDistance(NULL),
ccmaReducedMass(NULL), ccmaAtomConstraints(NULL), ccmaNumAtomConstraints(NULL), ccmaConstraintMatrixColumn(NULL), ccmaReducedMass(NULL), ccmaAtomConstraints(NULL), ccmaNumAtomConstraints(NULL), ccmaConstraintMatrixColumn(NULL),
ccmaConstraintMatrixValue(NULL), ccmaDelta1(NULL), ccmaDelta2(NULL), ccmaConverged(NULL), ccmaConstraintMatrixValue(NULL), ccmaDelta1(NULL), ccmaDelta2(NULL), ccmaConverged(NULL),
hasInitializedConstraintKernels(false) { ccmaConvergedBuffer(NULL), hasInitializedConstraintKernels(false) {
// Create workspace arrays. // Create workspace arrays.
posDelta = new OpenCLArray<mm_float4>(context, context.getPaddedNumAtoms(), "posDelta"); posDelta = new OpenCLArray<mm_float4>(context, context.getPaddedNumAtoms(), "posDelta");
...@@ -450,7 +450,9 @@ OpenCLIntegrationUtilities::OpenCLIntegrationUtilities(OpenCLContext& context, c ...@@ -450,7 +450,9 @@ OpenCLIntegrationUtilities::OpenCLIntegrationUtilities(OpenCLContext& context, c
ccmaNumAtomConstraints = new OpenCLArray<cl_int>(context, numAtoms, "CcmaAtomConstraintsIndex"); ccmaNumAtomConstraints = new OpenCLArray<cl_int>(context, numAtoms, "CcmaAtomConstraintsIndex");
ccmaDelta1 = new OpenCLArray<cl_float>(context, numCCMA, "CcmaDelta1"); ccmaDelta1 = new OpenCLArray<cl_float>(context, numCCMA, "CcmaDelta1");
ccmaDelta2 = new OpenCLArray<cl_float>(context, numCCMA, "CcmaDelta2"); ccmaDelta2 = new OpenCLArray<cl_float>(context, numCCMA, "CcmaDelta2");
ccmaConverged = new OpenCLArray<cl_int>(context, 1, "CcmaConverged", true); ccmaConverged = new OpenCLArray<cl_int>(context, 1, "CcmaConverged");
ccmaConvergedBuffer = new cl::Buffer(context.getContext(), CL_MEM_ALLOC_HOST_PTR, sizeof(cl_int));
ccmaConvergedMemory = (cl_int*) context.getQueue().enqueueMapBuffer(*ccmaConvergedBuffer, CL_TRUE, CL_MAP_READ | CL_MAP_WRITE, 0, sizeof(cl_int));
ccmaReducedMass = new OpenCLArray<cl_float>(context, numCCMA, "CcmaReducedMass"); ccmaReducedMass = new OpenCLArray<cl_float>(context, numCCMA, "CcmaReducedMass");
ccmaConstraintMatrixColumn = new OpenCLArray<cl_int>(context, numCCMA*maxRowElements, "ConstraintMatrixColumn"); ccmaConstraintMatrixColumn = new OpenCLArray<cl_int>(context, numCCMA*maxRowElements, "ConstraintMatrixColumn");
ccmaConstraintMatrixValue = new OpenCLArray<cl_float>(context, numCCMA*maxRowElements, "ConstraintMatrixValue"); ccmaConstraintMatrixValue = new OpenCLArray<cl_float>(context, numCCMA*maxRowElements, "ConstraintMatrixValue");
...@@ -539,6 +541,8 @@ OpenCLIntegrationUtilities::~OpenCLIntegrationUtilities() { ...@@ -539,6 +541,8 @@ OpenCLIntegrationUtilities::~OpenCLIntegrationUtilities() {
delete ccmaDelta2; delete ccmaDelta2;
if (ccmaConverged != NULL) if (ccmaConverged != NULL)
delete ccmaConverged; delete ccmaConverged;
if (ccmaConvergedBuffer != NULL)
delete ccmaConvergedBuffer;
} }
void OpenCLIntegrationUtilities::applyConstraints(double tol) { void OpenCLIntegrationUtilities::applyConstraints(double tol) {
...@@ -595,20 +599,24 @@ void OpenCLIntegrationUtilities::applyConstraints(double tol) { ...@@ -595,20 +599,24 @@ void OpenCLIntegrationUtilities::applyConstraints(double tol) {
ccmaForceKernel.setArg<cl_float>(6, (cl_float) tol); ccmaForceKernel.setArg<cl_float>(6, (cl_float) tol);
context.executeKernel(ccmaDirectionsKernel, ccmaAtoms->getSize()); context.executeKernel(ccmaDirectionsKernel, ccmaAtoms->getSize());
const int checkInterval = 3; const int checkInterval = 3;
cl::Event event;
for (int i = 0; i < 150; i++) { for (int i = 0; i < 150; i++) {
if ((i+1)%checkInterval == 0) { if ((i+1)%checkInterval == 0) {
(*ccmaConverged)[0] = 1; ccmaConvergedMemory[0] = 1;
ccmaConverged->upload(); context.getQueue().enqueueWriteBuffer(ccmaConverged->getDeviceBuffer(), CL_FALSE, 0, sizeof(cl_int), ccmaConvergedMemory);
} }
context.executeKernel(ccmaForceKernel, ccmaAtoms->getSize()); context.executeKernel(ccmaForceKernel, ccmaAtoms->getSize());
if ((i+1)%checkInterval == 0) { if ((i+1)%checkInterval == 0) {
ccmaConverged->download(); context.getQueue().enqueueReadBuffer(ccmaConverged->getDeviceBuffer(), CL_FALSE, 0, sizeof(cl_int), ccmaConvergedMemory, NULL, &event);
if ((*ccmaConverged)[0])
break;
} }
context.executeKernel(ccmaMultiplyKernel, ccmaAtoms->getSize()); context.executeKernel(ccmaMultiplyKernel, ccmaAtoms->getSize());
ccmaUpdateKernel.setArg<cl_int>(8, i); ccmaUpdateKernel.setArg<cl_int>(8, i);
context.executeKernel(ccmaUpdateKernel, context.getNumAtoms()); context.executeKernel(ccmaUpdateKernel, context.getNumAtoms());
if ((i+1)%checkInterval == 0) {
event.wait();
if (ccmaConvergedMemory[0])
break;
}
} }
} }
hasInitializedConstraintKernels = true; hasInitializedConstraintKernels = true;
......
...@@ -105,6 +105,8 @@ private: ...@@ -105,6 +105,8 @@ private:
OpenCLArray<cl_float>* ccmaDelta1; OpenCLArray<cl_float>* ccmaDelta1;
OpenCLArray<cl_float>* ccmaDelta2; OpenCLArray<cl_float>* ccmaDelta2;
OpenCLArray<cl_int>* ccmaConverged; OpenCLArray<cl_int>* ccmaConverged;
cl::Buffer* ccmaConvergedBuffer;
cl_int* ccmaConvergedMemory;
int randomPos; int randomPos;
int lastSeed; int lastSeed;
bool hasInitializedConstraintKernels; bool hasInitializedConstraintKernels;
......
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