Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
tsoc
openmm
Commits
aee84c82
"...src/ssh:/git@developer.sourcefind.cn:2222/tsoc/openmm.git" did not exist on "b619675415da2666ed773109b025da6541a7eb4a"
Commit
aee84c82
authored
Jun 15, 2017
by
peastman
Browse files
Completed OpenCL implementation of CustomCVForce
parent
48378da7
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
107 additions
and
34 deletions
+107
-34
olla/include/openmm/Platform.h
olla/include/openmm/Platform.h
+8
-0
olla/include/openmm/kernels.h
olla/include/openmm/kernels.h
+2
-1
olla/src/Platform.cpp
olla/src/Platform.cpp
+11
-0
openmmapi/include/openmm/Context.h
openmmapi/include/openmm/Context.h
+2
-0
openmmapi/include/openmm/internal/ContextImpl.h
openmmapi/include/openmm/internal/ContextImpl.h
+11
-1
openmmapi/src/Context.cpp
openmmapi/src/Context.cpp
+6
-0
openmmapi/src/ContextImpl.cpp
openmmapi/src/ContextImpl.cpp
+9
-2
openmmapi/src/CustomCVForceImpl.cpp
openmmapi/src/CustomCVForceImpl.cpp
+2
-6
platforms/opencl/include/OpenCLContext.h
platforms/opencl/include/OpenCLContext.h
+2
-1
platforms/opencl/include/OpenCLKernels.h
platforms/opencl/include/OpenCLKernels.h
+2
-1
platforms/opencl/include/OpenCLPlatform.h
platforms/opencl/include/OpenCLPlatform.h
+2
-1
platforms/opencl/src/OpenCLContext.cpp
platforms/opencl/src/OpenCLContext.cpp
+9
-3
platforms/opencl/src/OpenCLKernels.cpp
platforms/opencl/src/OpenCLKernels.cpp
+14
-8
platforms/opencl/src/OpenCLPlatform.cpp
platforms/opencl/src/OpenCLPlatform.cpp
+20
-4
platforms/opencl/src/kernels/customCVForce.cl
platforms/opencl/src/kernels/customCVForce.cl
+1
-1
platforms/opencl/tests/TestOpenCLFFT.cpp
platforms/opencl/tests/TestOpenCLFFT.cpp
+1
-1
platforms/opencl/tests/TestOpenCLRandom.cpp
platforms/opencl/tests/TestOpenCLRandom.cpp
+1
-1
platforms/opencl/tests/TestOpenCLSort.cpp
platforms/opencl/tests/TestOpenCLSort.cpp
+1
-1
platforms/reference/include/ReferenceKernels.h
platforms/reference/include/ReferenceKernels.h
+2
-1
platforms/reference/src/ReferenceKernels.cpp
platforms/reference/src/ReferenceKernels.cpp
+1
-1
No files found.
olla/include/openmm/Platform.h
View file @
aee84c82
...
@@ -127,6 +127,14 @@ public:
...
@@ -127,6 +127,14 @@ public:
* @param properties a set of values for platform-specific properties. Keys are the property names.
* @param properties a set of values for platform-specific properties. Keys are the property names.
*/
*/
virtual
void
contextCreated
(
ContextImpl
&
context
,
const
std
::
map
<
std
::
string
,
std
::
string
>&
properties
)
const
;
virtual
void
contextCreated
(
ContextImpl
&
context
,
const
std
::
map
<
std
::
string
,
std
::
string
>&
properties
)
const
;
/**
* This is called whenever a new Context is created using ContextImpl::createLinkedContext(). It gives the
* Platform a chance to initialize the context and store platform-specific data in it.
*
* @param context the newly created context
* @param originalContext the original context it is linked to
*/
virtual
void
linkedContextCreated
(
ContextImpl
&
context
,
ContextImpl
&
originalContext
)
const
;
/**
/**
* This is called whenever a Context is deleted. It gives the Platform a chance to clean up
* This is called whenever a Context is deleted. It gives the Platform a chance to clean up
* any platform-specific data that was stored in it.
* any platform-specific data that was stored in it.
...
...
olla/include/openmm/kernels.h
View file @
aee84c82
...
@@ -959,8 +959,9 @@ public:
...
@@ -959,8 +959,9 @@ public:
*
*
* @param system the System this kernel will be applied to
* @param system the System this kernel will be applied to
* @param force the CustomCVForce this kernel will be used for
* @param force the CustomCVForce this kernel will be used for
* @param innerContext the context created by the CustomCVForce for computing collective variables
*/
*/
virtual
void
initialize
(
const
System
&
system
,
const
CustomCVForce
&
force
)
=
0
;
virtual
void
initialize
(
const
System
&
system
,
const
CustomCVForce
&
force
,
ContextImpl
&
innerContext
)
=
0
;
/**
/**
* Execute the kernel to calculate the forces and/or energy.
* Execute the kernel to calculate the forces and/or energy.
*
*
...
...
olla/src/Platform.cpp
View file @
aee84c82
...
@@ -34,6 +34,7 @@
...
@@ -34,6 +34,7 @@
#include "openmm/OpenMMException.h"
#include "openmm/OpenMMException.h"
#include "openmm/Kernel.h"
#include "openmm/Kernel.h"
#include "openmm/KernelFactory.h"
#include "openmm/KernelFactory.h"
#include "openmm/internal/ContextImpl.h"
#ifdef WIN32
#ifdef WIN32
#include <windows.h>
#include <windows.h>
#include <sstream>
#include <sstream>
...
@@ -113,6 +114,16 @@ void Platform::setPropertyDefaultValue(const string& property, const string& val
...
@@ -113,6 +114,16 @@ void Platform::setPropertyDefaultValue(const string& property, const string& val
void
Platform
::
contextCreated
(
ContextImpl
&
context
,
const
map
<
string
,
string
>&
properties
)
const
{
void
Platform
::
contextCreated
(
ContextImpl
&
context
,
const
map
<
string
,
string
>&
properties
)
const
{
}
}
void
Platform
::
linkedContextCreated
(
ContextImpl
&
context
,
ContextImpl
&
originalContext
)
const
{
// The default implementation just copies over the properties and calls contextCreated().
// Subclasses may override this to do something different.
map
<
string
,
string
>
properties
;
for
(
auto
&
name
:
getPropertyNames
())
properties
[
name
]
=
getPropertyValue
(
originalContext
.
getOwner
(),
name
);
contextCreated
(
context
,
properties
);
}
void
Platform
::
contextDestroyed
(
ContextImpl
&
context
)
const
{
void
Platform
::
contextDestroyed
(
ContextImpl
&
context
)
const
{
}
}
...
...
openmmapi/include/openmm/Context.h
View file @
aee84c82
...
@@ -263,9 +263,11 @@ public:
...
@@ -263,9 +263,11 @@ public:
*/
*/
const
std
::
vector
<
std
::
vector
<
int
>
>&
getMolecules
()
const
;
const
std
::
vector
<
std
::
vector
<
int
>
>&
getMolecules
()
const
;
private:
private:
friend
class
ContextImpl
;
friend
class
Force
;
friend
class
Force
;
friend
class
ForceImpl
;
friend
class
ForceImpl
;
friend
class
Platform
;
friend
class
Platform
;
Context
(
const
System
&
system
,
Integrator
&
integrator
,
ContextImpl
&
linked
);
ContextImpl
&
getImpl
();
ContextImpl
&
getImpl
();
const
ContextImpl
&
getImpl
()
const
;
const
ContextImpl
&
getImpl
()
const
;
ContextImpl
*
impl
;
ContextImpl
*
impl
;
...
...
openmmapi/include/openmm/internal/ContextImpl.h
View file @
aee84c82
...
@@ -55,7 +55,8 @@ public:
...
@@ -55,7 +55,8 @@ public:
/**
/**
* Create an ContextImpl for a Context;
* Create an ContextImpl for a Context;
*/
*/
ContextImpl
(
Context
&
owner
,
const
System
&
system
,
Integrator
&
integrator
,
Platform
*
platform
,
const
std
::
map
<
std
::
string
,
std
::
string
>&
properties
);
ContextImpl
(
Context
&
owner
,
const
System
&
system
,
Integrator
&
integrator
,
Platform
*
platform
,
const
std
::
map
<
std
::
string
,
std
::
string
>&
properties
,
ContextImpl
*
originalContext
=
NULL
);
~
ContextImpl
();
~
ContextImpl
();
/**
/**
* Get the Context for which this is the implementation.
* Get the Context for which this is the implementation.
...
@@ -264,6 +265,15 @@ public:
...
@@ -264,6 +265,15 @@ public:
* you should never call it. It is exposed here because the same logic is useful to other classes too.
* you should never call it. It is exposed here because the same logic is useful to other classes too.
*/
*/
static
std
::
vector
<
std
::
vector
<
int
>
>
findMolecules
(
int
numParticles
,
std
::
vector
<
std
::
vector
<
int
>
>&
particleBonds
);
static
std
::
vector
<
std
::
vector
<
int
>
>
findMolecules
(
int
numParticles
,
std
::
vector
<
std
::
vector
<
int
>
>&
particleBonds
);
/**
* Create a new Context based on this one. The new context will use the same Platform, device, and property
* values as this one. With the CUDA and OpenCL platforms, it also shares the same GPU context, allowing data
* to be transferred between them without leaving the GPU.
*
* This method exists for very specialized purposes. If you aren't certain whether you should use it, that probably
* means you shouldn't.
*/
Context
*
createLinkedContext
(
const
System
&
system
,
Integrator
&
integrator
);
private:
private:
friend
class
Context
;
friend
class
Context
;
void
initialize
();
void
initialize
();
...
...
openmmapi/src/Context.cpp
View file @
aee84c82
...
@@ -40,6 +40,12 @@
...
@@ -40,6 +40,12 @@
using
namespace
OpenMM
;
using
namespace
OpenMM
;
using
namespace
std
;
using
namespace
std
;
Context
::
Context
(
const
System
&
system
,
Integrator
&
integrator
,
ContextImpl
&
linked
)
:
properties
(
linked
.
getOwner
().
properties
)
{
// This is used by ContextImpl::createLinkedContext().
impl
=
new
ContextImpl
(
*
this
,
system
,
integrator
,
&
linked
.
getPlatform
(),
properties
,
&
linked
);
impl
->
initialize
();
}
Context
::
Context
(
const
System
&
system
,
Integrator
&
integrator
)
:
properties
(
map
<
string
,
string
>
())
{
Context
::
Context
(
const
System
&
system
,
Integrator
&
integrator
)
:
properties
(
map
<
string
,
string
>
())
{
impl
=
new
ContextImpl
(
*
this
,
system
,
integrator
,
0
,
properties
);
impl
=
new
ContextImpl
(
*
this
,
system
,
integrator
,
0
,
properties
);
impl
->
initialize
();
impl
->
initialize
();
...
...
openmmapi/src/ContextImpl.cpp
View file @
aee84c82
...
@@ -53,7 +53,7 @@ using namespace std;
...
@@ -53,7 +53,7 @@ using namespace std;
const
static
char
CHECKPOINT_MAGIC_BYTES
[]
=
"OpenMM Binary Checkpoint
\n
"
;
const
static
char
CHECKPOINT_MAGIC_BYTES
[]
=
"OpenMM Binary Checkpoint
\n
"
;
ContextImpl
::
ContextImpl
(
Context
&
owner
,
const
System
&
system
,
Integrator
&
integrator
,
Platform
*
platform
,
const
map
<
string
,
string
>&
properties
)
:
ContextImpl
::
ContextImpl
(
Context
&
owner
,
const
System
&
system
,
Integrator
&
integrator
,
Platform
*
platform
,
const
map
<
string
,
string
>&
properties
,
ContextImpl
*
originalContext
)
:
owner
(
owner
),
system
(
system
),
integrator
(
integrator
),
hasInitializedForces
(
false
),
hasSetPositions
(
false
),
integratorIsDeleted
(
false
),
owner
(
owner
),
system
(
system
),
integrator
(
integrator
),
hasInitializedForces
(
false
),
hasSetPositions
(
false
),
integratorIsDeleted
(
false
),
lastForceGroups
(
-
1
),
platform
(
platform
),
platformData
(
NULL
)
{
lastForceGroups
(
-
1
),
platform
(
platform
),
platformData
(
NULL
)
{
int
numParticles
=
system
.
getNumParticles
();
int
numParticles
=
system
.
getNumParticles
();
...
@@ -152,7 +152,10 @@ ContextImpl::ContextImpl(Context& owner, const System& system, Integrator& integ
...
@@ -152,7 +152,10 @@ ContextImpl::ContextImpl(Context& owner, const System& system, Integrator& integ
for
(
int
i
=
candidatePlatforms
.
size
()
-
1
;
i
>=
0
;
i
--
)
{
for
(
int
i
=
candidatePlatforms
.
size
()
-
1
;
i
>=
0
;
i
--
)
{
try
{
try
{
this
->
platform
=
platform
=
candidatePlatforms
[
i
].
second
;
this
->
platform
=
platform
=
candidatePlatforms
[
i
].
second
;
platform
->
contextCreated
(
*
this
,
validatedProperties
);
if
(
originalContext
==
NULL
)
platform
->
contextCreated
(
*
this
,
validatedProperties
);
else
platform
->
linkedContextCreated
(
*
this
,
*
originalContext
);
break
;
break
;
}
}
catch
(...)
{
catch
(...)
{
...
@@ -481,3 +484,7 @@ void ContextImpl::loadCheckpoint(istream& stream) {
...
@@ -481,3 +484,7 @@ void ContextImpl::loadCheckpoint(istream& stream) {
void
ContextImpl
::
systemChanged
()
{
void
ContextImpl
::
systemChanged
()
{
integrator
.
stateChanged
(
State
::
Energy
);
integrator
.
stateChanged
(
State
::
Energy
);
}
}
Context
*
ContextImpl
::
createLinkedContext
(
const
System
&
system
,
Integrator
&
integrator
)
{
return
new
Context
(
system
,
integrator
,
*
this
);
}
openmmapi/src/CustomCVForceImpl.cpp
View file @
aee84c82
...
@@ -66,18 +66,14 @@ void CustomCVForceImpl::initialize(ContextImpl& context) {
...
@@ -66,18 +66,14 @@ void CustomCVForceImpl::initialize(ContextImpl& context) {
// Create the inner context.
// Create the inner context.
Platform
&
platform
=
context
.
getPlatform
();
innerContext
=
context
.
createLinkedContext
(
innerSystem
,
innerIntegrator
);
map
<
string
,
string
>
properties
;
for
(
auto
&
name
:
platform
.
getPropertyNames
())
properties
[
name
]
=
platform
.
getPropertyValue
(
context
.
getOwner
(),
name
);
innerContext
=
new
Context
(
innerSystem
,
innerIntegrator
,
platform
,
properties
);
vector
<
Vec3
>
positions
(
system
.
getNumParticles
(),
Vec3
());
vector
<
Vec3
>
positions
(
system
.
getNumParticles
(),
Vec3
());
innerContext
->
setPositions
(
positions
);
innerContext
->
setPositions
(
positions
);
// Create the kernel.
// Create the kernel.
kernel
=
context
.
getPlatform
().
createKernel
(
CalcCustomCVForceKernel
::
Name
(),
context
);
kernel
=
context
.
getPlatform
().
createKernel
(
CalcCustomCVForceKernel
::
Name
(),
context
);
kernel
.
getAs
<
CalcCustomCVForceKernel
>
().
initialize
(
context
.
getSystem
(),
owner
);
kernel
.
getAs
<
CalcCustomCVForceKernel
>
().
initialize
(
context
.
getSystem
(),
owner
,
getContextImpl
(
*
innerContext
)
);
}
}
double
CustomCVForceImpl
::
calcForcesAndEnergy
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
,
int
groups
)
{
double
CustomCVForceImpl
::
calcForcesAndEnergy
(
ContextImpl
&
context
,
bool
includeForces
,
bool
includeEnergy
,
int
groups
)
{
...
...
platforms/opencl/include/OpenCLContext.h
View file @
aee84c82
...
@@ -163,7 +163,8 @@ public:
...
@@ -163,7 +163,8 @@ public:
class
ForcePostComputation
;
class
ForcePostComputation
;
static
const
int
ThreadBlockSize
;
static
const
int
ThreadBlockSize
;
static
const
int
TileSize
;
static
const
int
TileSize
;
OpenCLContext
(
const
System
&
system
,
int
platformIndex
,
int
deviceIndex
,
const
std
::
string
&
precision
,
OpenCLPlatform
::
PlatformData
&
platformData
);
OpenCLContext
(
const
System
&
system
,
int
platformIndex
,
int
deviceIndex
,
const
std
::
string
&
precision
,
OpenCLPlatform
::
PlatformData
&
platformData
,
OpenCLContext
*
originalContext
);
~
OpenCLContext
();
~
OpenCLContext
();
/**
/**
* This is called to initialize internal data structures after all Forces in the system
* This is called to initialize internal data structures after all Forces in the system
...
...
platforms/opencl/include/OpenCLKernels.h
View file @
aee84c82
...
@@ -1222,8 +1222,9 @@ public:
...
@@ -1222,8 +1222,9 @@ public:
*
*
* @param system the System this kernel will be applied to
* @param system the System this kernel will be applied to
* @param force the CustomCVForce this kernel will be used for
* @param force the CustomCVForce this kernel will be used for
* @param innerContext the context created by the CustomCVForce for computing collective variables
*/
*/
void
initialize
(
const
System
&
system
,
const
CustomCVForce
&
force
);
void
initialize
(
const
System
&
system
,
const
CustomCVForce
&
force
,
ContextImpl
&
innerContext
);
/**
/**
* Execute the kernel to calculate the forces and/or energy.
* Execute the kernel to calculate the forces and/or energy.
*
*
...
...
platforms/opencl/include/OpenCLPlatform.h
View file @
aee84c82
...
@@ -53,6 +53,7 @@ public:
...
@@ -53,6 +53,7 @@ public:
const
std
::
string
&
getPropertyValue
(
const
Context
&
context
,
const
std
::
string
&
property
)
const
;
const
std
::
string
&
getPropertyValue
(
const
Context
&
context
,
const
std
::
string
&
property
)
const
;
void
setPropertyValue
(
Context
&
context
,
const
std
::
string
&
property
,
const
std
::
string
&
value
)
const
;
void
setPropertyValue
(
Context
&
context
,
const
std
::
string
&
property
,
const
std
::
string
&
value
)
const
;
void
contextCreated
(
ContextImpl
&
context
,
const
std
::
map
<
std
::
string
,
std
::
string
>&
properties
)
const
;
void
contextCreated
(
ContextImpl
&
context
,
const
std
::
map
<
std
::
string
,
std
::
string
>&
properties
)
const
;
void
linkedContextCreated
(
ContextImpl
&
context
,
ContextImpl
&
originalContext
)
const
;
void
contextDestroyed
(
ContextImpl
&
context
)
const
;
void
contextDestroyed
(
ContextImpl
&
context
)
const
;
/**
/**
* This is the name of the parameter for selecting which OpenCL device or devices to use.
* This is the name of the parameter for selecting which OpenCL device or devices to use.
...
@@ -108,7 +109,7 @@ public:
...
@@ -108,7 +109,7 @@ public:
class
OPENMM_EXPORT_OPENCL
OpenCLPlatform
::
PlatformData
{
class
OPENMM_EXPORT_OPENCL
OpenCLPlatform
::
PlatformData
{
public:
public:
PlatformData
(
const
System
&
system
,
const
std
::
string
&
platformPropValue
,
const
std
::
string
&
deviceIndexProperty
,
const
std
::
string
&
precisionProperty
,
PlatformData
(
const
System
&
system
,
const
std
::
string
&
platformPropValue
,
const
std
::
string
&
deviceIndexProperty
,
const
std
::
string
&
precisionProperty
,
const
std
::
string
&
cpuPmeProperty
,
const
std
::
string
&
pmeStreamProperty
,
int
numThreads
);
const
std
::
string
&
cpuPmeProperty
,
const
std
::
string
&
pmeStreamProperty
,
int
numThreads
,
ContextImpl
*
originalContext
);
~
PlatformData
();
~
PlatformData
();
void
initializeContexts
(
const
System
&
system
);
void
initializeContexts
(
const
System
&
system
);
void
syncContexts
();
void
syncContexts
();
...
...
platforms/opencl/src/OpenCLContext.cpp
View file @
aee84c82
...
@@ -67,7 +67,7 @@ static void CL_CALLBACK errorCallback(const char* errinfo, const void* private_i
...
@@ -67,7 +67,7 @@ static void CL_CALLBACK errorCallback(const char* errinfo, const void* private_i
std
::
cerr
<<
"OpenCL internal error: "
<<
errinfo
<<
std
::
endl
;
std
::
cerr
<<
"OpenCL internal error: "
<<
errinfo
<<
std
::
endl
;
}
}
OpenCLContext
::
OpenCLContext
(
const
System
&
system
,
int
platformIndex
,
int
deviceIndex
,
const
string
&
precision
,
OpenCLPlatform
::
PlatformData
&
platformData
)
:
OpenCLContext
::
OpenCLContext
(
const
System
&
system
,
int
platformIndex
,
int
deviceIndex
,
const
string
&
precision
,
OpenCLPlatform
::
PlatformData
&
platformData
,
OpenCLContext
*
originalContext
)
:
system
(
system
),
time
(
0.0
),
platformData
(
platformData
),
stepCount
(
0
),
computeForceCount
(
0
),
stepsSinceReorder
(
99999
),
atomsWereReordered
(
false
),
posq
(
NULL
),
system
(
system
),
time
(
0.0
),
platformData
(
platformData
),
stepCount
(
0
),
computeForceCount
(
0
),
stepsSinceReorder
(
99999
),
atomsWereReordered
(
false
),
posq
(
NULL
),
posqCorrection
(
NULL
),
velm
(
NULL
),
forceBuffers
(
NULL
),
longForceBuffer
(
NULL
),
energyBuffer
(
NULL
),
energyParamDerivBuffer
(
NULL
),
atomIndexDevice
(
NULL
),
posqCorrection
(
NULL
),
velm
(
NULL
),
forceBuffers
(
NULL
),
longForceBuffer
(
NULL
),
energyBuffer
(
NULL
),
energyParamDerivBuffer
(
NULL
),
atomIndexDevice
(
NULL
),
chargeBuffer
(
NULL
),
integration
(
NULL
),
expression
(
NULL
),
bonded
(
NULL
),
nonbonded
(
NULL
),
thread
(
NULL
)
{
chargeBuffer
(
NULL
),
integration
(
NULL
),
expression
(
NULL
),
bonded
(
NULL
),
nonbonded
(
NULL
),
thread
(
NULL
)
{
...
@@ -261,8 +261,14 @@ OpenCLContext::OpenCLContext(const System& system, int platformIndex, int device
...
@@ -261,8 +261,14 @@ OpenCLContext::OpenCLContext(const System& system, int platformIndex, int device
vector
<
cl
::
Device
>
contextDevices
;
vector
<
cl
::
Device
>
contextDevices
;
contextDevices
.
push_back
(
device
);
contextDevices
.
push_back
(
device
);
cl_context_properties
cprops
[]
=
{
CL_CONTEXT_PLATFORM
,
(
cl_context_properties
)
platforms
[
bestPlatform
](),
0
};
cl_context_properties
cprops
[]
=
{
CL_CONTEXT_PLATFORM
,
(
cl_context_properties
)
platforms
[
bestPlatform
](),
0
};
context
=
cl
::
Context
(
contextDevices
,
cprops
,
errorCallback
);
if
(
originalContext
==
NULL
)
{
defaultQueue
=
cl
::
CommandQueue
(
context
,
device
);
context
=
cl
::
Context
(
contextDevices
,
cprops
,
errorCallback
);
defaultQueue
=
cl
::
CommandQueue
(
context
,
device
);
}
else
{
context
=
originalContext
->
context
;
defaultQueue
=
originalContext
->
defaultQueue
;
}
currentQueue
=
defaultQueue
;
currentQueue
=
defaultQueue
;
numAtoms
=
system
.
getNumParticles
();
numAtoms
=
system
.
getNumParticles
();
paddedNumAtoms
=
TileSize
*
((
numAtoms
+
TileSize
-
1
)
/
TileSize
);
paddedNumAtoms
=
TileSize
*
((
numAtoms
+
TileSize
-
1
)
/
TileSize
);
...
...
platforms/opencl/src/OpenCLKernels.cpp
View file @
aee84c82
...
@@ -6879,12 +6879,11 @@ public:
...
@@ -6879,12 +6879,11 @@ public:
ReorderListener(OpenCLContext& cl, OpenCLArray& invAtomOrder) : cl(cl), invAtomOrder(invAtomOrder) {
ReorderListener(OpenCLContext& cl, OpenCLArray& invAtomOrder) : cl(cl), invAtomOrder(invAtomOrder) {
}
}
void execute() {
void execute() {
vector<cl_int> invOrder(cl.getNumAtoms());
vector<cl_int> invOrder(cl.get
Padded
NumAtoms());
const vector<int>& order = cl.getAtomIndex();
const vector<int>& order = cl.getAtomIndex();
for (int i = 0; i < order.size(); i++)
for (int i = 0; i < order.size(); i++)
invOrder[order[i]] = i;
invOrder[order[i]] = i;
invAtomOrder.upload(invOrder);
invAtomOrder.upload(invOrder);
cl.getQueue().finish();
}
}
private:
private:
OpenCLContext& cl;
OpenCLContext& cl;
...
@@ -6900,7 +6899,7 @@ OpenCLCalcCustomCVForceKernel::~OpenCLCalcCustomCVForceKernel() {
...
@@ -6900,7 +6899,7 @@ OpenCLCalcCustomCVForceKernel::~OpenCLCalcCustomCVForceKernel() {
delete innerInvAtomOrder;
delete innerInvAtomOrder;
}
}
void OpenCLCalcCustomCVForceKernel::initialize(const System& system, const CustomCVForce& force) {
void OpenCLCalcCustomCVForceKernel::initialize(const System& system, const CustomCVForce& force
, ContextImpl& innerContext
) {
int numCVs = force.getNumCollectiveVariables();
int numCVs = force.getNumCollectiveVariables();
cl.addForce(new OpenCLForceInfo(1));
cl.addForce(new OpenCLForceInfo(1));
for (int i = 0; i < force.getNumGlobalParameters(); i++)
for (int i = 0; i < force.getNumGlobalParameters(); i++)
...
@@ -6925,20 +6924,27 @@ void OpenCLCalcCustomCVForceKernel::initialize(const System& system, const Custo
...
@@ -6925,20 +6924,27 @@ void OpenCLCalcCustomCVForceKernel::initialize(const System& system, const Custo
string name = force.getEnergyParameterDerivativeName(i);
string name = force.getEnergyParameterDerivativeName(i);
paramDerivNames.push_back(name);
paramDerivNames.push_back(name);
paramDerivExpressions.push_back(energyExpr.differentiate(name).optimize().createProgram());
paramDerivExpressions.push_back(energyExpr.differentiate(name).optimize().createProgram());
cl.addEnergyParameterDerivative(name);
}
}
// Delete the custom functions.
// Delete the custom functions.
for (auto& function : functions)
for (auto& function : functions)
delete function.second;
delete function.second;
// Copy parameter derivatives from the inner context.
OpenCLContext& cl2 = *reinterpret_cast<OpenCLPlatform::PlatformData*>(innerContext.getPlatformData())->contexts[0];
for (auto& param : cl2.getEnergyParamDerivNames())
cl.addEnergyParameterDerivative(param);
// Create arrays for storing information.
// Create arrays for storing information.
int elementSize = (cl.getUseDoublePrecision() || cl.getUseMixedPrecision() ? sizeof(double) : sizeof(float));
int elementSize = (cl.getUseDoublePrecision() || cl.getUseMixedPrecision() ? sizeof(double) : sizeof(float));
for (int i = 0; i < numCVs; i++)
for (int i = 0; i < numCVs; i++)
cvForces.push_back(new OpenCLArray(cl, cl.getNumAtoms(), elementSize, "cvForce"));
cvForces.push_back(new OpenCLArray(cl, cl.getNumAtoms(),
4*
elementSize, "cvForce"));
invAtomOrder = OpenCLArray::create<cl_int>(cl, cl.getNumAtoms(), "invAtomOrder");
invAtomOrder = OpenCLArray::create<cl_int>(cl, cl.get
Padded
NumAtoms(), "invAtomOrder");
innerInvAtomOrder = OpenCLArray::create<cl_int>(cl, cl.getNumAtoms(), "innerInvAtomOrder");
innerInvAtomOrder = OpenCLArray::create<cl_int>(cl, cl.get
Padded
NumAtoms(), "innerInvAtomOrder");
// Create the kernels.
// Create the kernels.
...
@@ -6984,8 +6990,8 @@ double OpenCLCalcCustomCVForceKernel::execute(ContextImpl& context, ContextImpl&
...
@@ -6984,8 +6990,8 @@ double OpenCLCalcCustomCVForceKernel::execute(ContextImpl& context, ContextImpl&
addForcesKernel.setArg<cl_double>(2*i+3, dEdV);
addForcesKernel.setArg<cl_double>(2*i+3, dEdV);
else
else
addForcesKernel.setArg<cl_float>(2*i+3, dEdV);
addForcesKernel.setArg<cl_float>(2*i+3, dEdV);
cl.executeKernel(addForcesKernel, numAtoms);
}
}
cl.executeKernel(addForcesKernel, numAtoms);
// Compute the energy parameter derivatives.
// Compute the energy parameter derivatives.
...
@@ -7002,12 +7008,12 @@ double OpenCLCalcCustomCVForceKernel::execute(ContextImpl& context, ContextImpl&
...
@@ -7002,12 +7008,12 @@ double OpenCLCalcCustomCVForceKernel::execute(ContextImpl& context, ContextImpl&
void OpenCLCalcCustomCVForceKernel::copyState(ContextImpl& context, ContextImpl& innerContext) {
void OpenCLCalcCustomCVForceKernel::copyState(ContextImpl& context, ContextImpl& innerContext) {
int numAtoms = cl.getNumAtoms();
int numAtoms = cl.getNumAtoms();
OpenCLContext& cl2 = *reinterpret_cast<OpenCLPlatform::PlatformData*>(innerContext.getPlatformData())->contexts[0];
if (!hasInitializedKernels) {
if (!hasInitializedKernels) {
hasInitializedKernels = true;
hasInitializedKernels = true;
// Initialize the listeners.
// Initialize the listeners.
OpenCLContext& cl2 = *reinterpret_cast<OpenCLPlatform::PlatformData*>(innerContext.getPlatformData())->contexts[0];
ReorderListener* listener1 = new ReorderListener(cl, *invAtomOrder);
ReorderListener* listener1 = new ReorderListener(cl, *invAtomOrder);
ReorderListener* listener2 = new ReorderListener(cl2, *innerInvAtomOrder);
ReorderListener* listener2 = new ReorderListener(cl2, *innerInvAtomOrder);
cl.addReorderListener(listener1);
cl.addReorderListener(listener1);
...
...
platforms/opencl/src/OpenCLPlatform.cpp
View file @
aee84c82
...
@@ -180,7 +180,20 @@ void OpenCLPlatform::contextCreated(ContextImpl& context, const map<string, stri
...
@@ -180,7 +180,20 @@ void OpenCLPlatform::contextCreated(ContextImpl& context, const map<string, stri
char
*
threadsEnv
=
getenv
(
"OPENMM_CPU_THREADS"
);
char
*
threadsEnv
=
getenv
(
"OPENMM_CPU_THREADS"
);
if
(
threadsEnv
!=
NULL
)
if
(
threadsEnv
!=
NULL
)
stringstream
(
threadsEnv
)
>>
threads
;
stringstream
(
threadsEnv
)
>>
threads
;
context
.
setPlatformData
(
new
PlatformData
(
context
.
getSystem
(),
platformPropValue
,
devicePropValue
,
precisionPropValue
,
cpuPmePropValue
,
pmeStreamPropValue
,
threads
));
context
.
setPlatformData
(
new
PlatformData
(
context
.
getSystem
(),
platformPropValue
,
devicePropValue
,
precisionPropValue
,
cpuPmePropValue
,
pmeStreamPropValue
,
threads
,
NULL
));
}
void
OpenCLPlatform
::
linkedContextCreated
(
ContextImpl
&
context
,
ContextImpl
&
originalContext
)
const
{
Platform
&
platform
=
originalContext
.
getPlatform
();
string
platformPropValue
=
platform
.
getPropertyValue
(
originalContext
.
getOwner
(),
OpenCLPlatformIndex
());
string
devicePropValue
=
platform
.
getPropertyValue
(
originalContext
.
getOwner
(),
OpenCLDeviceIndex
());
string
precisionPropValue
=
platform
.
getPropertyValue
(
originalContext
.
getOwner
(),
OpenCLPrecision
());
string
cpuPmePropValue
=
platform
.
getPropertyValue
(
originalContext
.
getOwner
(),
OpenCLUseCpuPme
());
string
pmeStreamPropValue
=
platform
.
getPropertyValue
(
originalContext
.
getOwner
(),
OpenCLDisablePmeStream
());
int
threads
=
reinterpret_cast
<
PlatformData
*>
(
originalContext
.
getPlatformData
())
->
threads
.
getNumThreads
();
context
.
setPlatformData
(
new
PlatformData
(
context
.
getSystem
(),
platformPropValue
,
devicePropValue
,
precisionPropValue
,
cpuPmePropValue
,
pmeStreamPropValue
,
threads
,
&
originalContext
));
}
}
void
OpenCLPlatform
::
contextDestroyed
(
ContextImpl
&
context
)
const
{
void
OpenCLPlatform
::
contextDestroyed
(
ContextImpl
&
context
)
const
{
...
@@ -189,7 +202,7 @@ void OpenCLPlatform::contextDestroyed(ContextImpl& context) const {
...
@@ -189,7 +202,7 @@ void OpenCLPlatform::contextDestroyed(ContextImpl& context) const {
}
}
OpenCLPlatform
::
PlatformData
::
PlatformData
(
const
System
&
system
,
const
string
&
platformPropValue
,
const
string
&
deviceIndexProperty
,
OpenCLPlatform
::
PlatformData
::
PlatformData
(
const
System
&
system
,
const
string
&
platformPropValue
,
const
string
&
deviceIndexProperty
,
const
string
&
precisionProperty
,
const
string
&
cpuPmeProperty
,
const
string
&
pmeStreamProperty
,
int
numThreads
)
:
const
string
&
precisionProperty
,
const
string
&
cpuPmeProperty
,
const
string
&
pmeStreamProperty
,
int
numThreads
,
ContextImpl
*
originalContext
)
:
removeCM
(
false
),
stepCount
(
0
),
computeForceCount
(
0
),
time
(
0.0
),
hasInitializedContexts
(
false
),
threads
(
numThreads
)
{
removeCM
(
false
),
stepCount
(
0
),
computeForceCount
(
0
),
time
(
0.0
),
hasInitializedContexts
(
false
),
threads
(
numThreads
)
{
int
platformIndex
=
-
1
;
int
platformIndex
=
-
1
;
if
(
platformPropValue
.
length
()
>
0
)
if
(
platformPropValue
.
length
()
>
0
)
...
@@ -201,16 +214,19 @@ OpenCLPlatform::PlatformData::PlatformData(const System& system, const string& p
...
@@ -201,16 +214,19 @@ OpenCLPlatform::PlatformData::PlatformData(const System& system, const string& p
searchPos
=
nextPos
+
1
;
searchPos
=
nextPos
+
1
;
}
}
devices
.
push_back
(
deviceIndexProperty
.
substr
(
searchPos
));
devices
.
push_back
(
deviceIndexProperty
.
substr
(
searchPos
));
PlatformData
*
originalData
=
NULL
;
if
(
originalContext
!=
NULL
)
originalData
=
reinterpret_cast
<
PlatformData
*>
(
originalContext
->
getPlatformData
());
try
{
try
{
for
(
int
i
=
0
;
i
<
(
int
)
devices
.
size
();
i
++
)
{
for
(
int
i
=
0
;
i
<
(
int
)
devices
.
size
();
i
++
)
{
if
(
devices
[
i
].
length
()
>
0
)
{
if
(
devices
[
i
].
length
()
>
0
)
{
int
deviceIndex
;
int
deviceIndex
;
stringstream
(
devices
[
i
])
>>
deviceIndex
;
stringstream
(
devices
[
i
])
>>
deviceIndex
;
contexts
.
push_back
(
new
OpenCLContext
(
system
,
platformIndex
,
deviceIndex
,
precisionProperty
,
*
this
));
contexts
.
push_back
(
new
OpenCLContext
(
system
,
platformIndex
,
deviceIndex
,
precisionProperty
,
*
this
,
(
originalData
==
NULL
?
NULL
:
originalData
->
contexts
[
i
])
));
}
}
}
}
if
(
contexts
.
size
()
==
0
)
if
(
contexts
.
size
()
==
0
)
contexts
.
push_back
(
new
OpenCLContext
(
system
,
platformIndex
,
-
1
,
precisionProperty
,
*
this
));
contexts
.
push_back
(
new
OpenCLContext
(
system
,
platformIndex
,
-
1
,
precisionProperty
,
*
this
,
(
originalData
==
NULL
?
NULL
:
originalData
->
contexts
[
0
])
));
}
}
catch
(...)
{
catch
(...)
{
// If an exception was thrown, do our best to clean up memory.
// If an exception was thrown, do our best to clean up memory.
...
...
platforms/opencl/src/kernels/customCVForce.cl
View file @
aee84c82
...
@@ -28,7 +28,7 @@ __kernel void copyForces(__global real4* forces, __global int* restrict invAtomO
...
@@ -28,7 +28,7 @@ __kernel void copyForces(__global real4* forces, __global int* restrict invAtomO
/**
/**
*
Add
all
the
forces
from
the
CVs.
*
Add
all
the
forces
from
the
CVs.
*/
*/
__kernel
void
addForces
(
__global
real4*
forces,
int
numAtoms
,
int
numCVs
__kernel
void
addForces
(
__global
real4*
forces,
int
numAtoms
PARAMETER_ARGUMENTS
)
{
PARAMETER_ARGUMENTS
)
{
for
(
int
i
=
get_global_id
(
0
)
; i < numAtoms; i += get_global_size(0)) {
for
(
int
i
=
get_global_id
(
0
)
; i < numAtoms; i += get_global_size(0)) {
real4
f
=
forces[i]
;
real4
f
=
forces[i]
;
...
...
platforms/opencl/tests/TestOpenCLFFT.cpp
View file @
aee84c82
...
@@ -54,7 +54,7 @@ template <class Real2>
...
@@ -54,7 +54,7 @@ template <class Real2>
void
testTransform
(
bool
realToComplex
,
int
xsize
,
int
ysize
,
int
zsize
)
{
void
testTransform
(
bool
realToComplex
,
int
xsize
,
int
ysize
,
int
zsize
)
{
System
system
;
System
system
;
system
.
addParticle
(
0.0
);
system
.
addParticle
(
0.0
);
OpenCLPlatform
::
PlatformData
platformData
(
system
,
""
,
""
,
platform
.
getPropertyDefaultValue
(
"OpenCLPrecision"
),
"false"
,
"false"
,
1
);
OpenCLPlatform
::
PlatformData
platformData
(
system
,
""
,
""
,
platform
.
getPropertyDefaultValue
(
"OpenCLPrecision"
),
"false"
,
"false"
,
1
,
NULL
);
OpenCLContext
&
context
=
*
platformData
.
contexts
[
0
];
OpenCLContext
&
context
=
*
platformData
.
contexts
[
0
];
context
.
initialize
();
context
.
initialize
();
OpenMM_SFMT
::
SFMT
sfmt
;
OpenMM_SFMT
::
SFMT
sfmt
;
...
...
platforms/opencl/tests/TestOpenCLRandom.cpp
View file @
aee84c82
...
@@ -54,7 +54,7 @@ void testGaussian() {
...
@@ -54,7 +54,7 @@ void testGaussian() {
System
system
;
System
system
;
for
(
int
i
=
0
;
i
<
numAtoms
;
i
++
)
for
(
int
i
=
0
;
i
<
numAtoms
;
i
++
)
system
.
addParticle
(
1.0
);
system
.
addParticle
(
1.0
);
OpenCLPlatform
::
PlatformData
platformData
(
system
,
""
,
""
,
platform
.
getPropertyDefaultValue
(
"OpenCLPrecision"
),
"false"
,
"false"
,
1
);
OpenCLPlatform
::
PlatformData
platformData
(
system
,
""
,
""
,
platform
.
getPropertyDefaultValue
(
"OpenCLPrecision"
),
"false"
,
"false"
,
1
,
NULL
);
OpenCLContext
&
context
=
*
platformData
.
contexts
[
0
];
OpenCLContext
&
context
=
*
platformData
.
contexts
[
0
];
context
.
initialize
();
context
.
initialize
();
context
.
getIntegrationUtilities
().
initRandomNumberGenerator
(
0
);
context
.
getIntegrationUtilities
().
initRandomNumberGenerator
(
0
);
...
...
platforms/opencl/tests/TestOpenCLSort.cpp
View file @
aee84c82
...
@@ -64,7 +64,7 @@ void verifySorting(vector<float> array) {
...
@@ -64,7 +64,7 @@ void verifySorting(vector<float> array) {
System
system
;
System
system
;
system
.
addParticle
(
0.0
);
system
.
addParticle
(
0.0
);
OpenCLPlatform
::
PlatformData
platformData
(
system
,
""
,
""
,
platform
.
getPropertyDefaultValue
(
"OpenCLPrecision"
),
"false"
,
"false"
,
1
);
OpenCLPlatform
::
PlatformData
platformData
(
system
,
""
,
""
,
platform
.
getPropertyDefaultValue
(
"OpenCLPrecision"
),
"false"
,
"false"
,
1
,
NULL
);
OpenCLContext
&
context
=
*
platformData
.
contexts
[
0
];
OpenCLContext
&
context
=
*
platformData
.
contexts
[
0
];
context
.
initialize
();
context
.
initialize
();
OpenCLArray
data
(
context
,
array
.
size
(),
sizeof
(
float
),
"sortData"
);
OpenCLArray
data
(
context
,
array
.
size
(),
sizeof
(
float
),
"sortData"
);
...
...
platforms/reference/include/ReferenceKernels.h
View file @
aee84c82
...
@@ -1020,8 +1020,9 @@ public:
...
@@ -1020,8 +1020,9 @@ public:
*
*
* @param system the System this kernel will be applied to
* @param system the System this kernel will be applied to
* @param force the CustomCVForce this kernel will be used for
* @param force the CustomCVForce this kernel will be used for
* @param innerContext the context created by the CustomCVForce for computing collective variables
*/
*/
void
initialize
(
const
System
&
system
,
const
CustomCVForce
&
force
);
void
initialize
(
const
System
&
system
,
const
CustomCVForce
&
force
,
ContextImpl
&
innerContext
);
/**
/**
* Execute the kernel to calculate the forces and/or energy.
* Execute the kernel to calculate the forces and/or energy.
*
*
...
...
platforms/reference/src/ReferenceKernels.cpp
View file @
aee84c82
...
@@ -2021,7 +2021,7 @@ ReferenceCalcCustomCVForceKernel::~ReferenceCalcCustomCVForceKernel() {
...
@@ -2021,7 +2021,7 @@ ReferenceCalcCustomCVForceKernel::~ReferenceCalcCustomCVForceKernel() {
delete
ixn
;
delete
ixn
;
}
}
void
ReferenceCalcCustomCVForceKernel
::
initialize
(
const
System
&
system
,
const
CustomCVForce
&
force
)
{
void
ReferenceCalcCustomCVForceKernel
::
initialize
(
const
System
&
system
,
const
CustomCVForce
&
force
,
ContextImpl
&
innerContext
)
{
for
(
int
i
=
0
;
i
<
force
.
getNumGlobalParameters
();
i
++
)
for
(
int
i
=
0
;
i
<
force
.
getNumGlobalParameters
();
i
++
)
globalParameterNames
.
push_back
(
force
.
getGlobalParameterName
(
i
));
globalParameterNames
.
push_back
(
force
.
getGlobalParameterName
(
i
));
for
(
int
i
=
0
;
i
<
force
.
getNumEnergyParameterDerivatives
();
i
++
)
for
(
int
i
=
0
;
i
<
force
.
getNumEnergyParameterDerivatives
();
i
++
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment