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
40891bab
"openmmapi/vscode:/vscode.git/clone" did not exist on "6a09626b6687ea5b88012587f7dd71cd0f0d9552"
Commit
40891bab
authored
Apr 28, 2010
by
Peter Eastman
Browse files
Optimization to OpenCL platform: use tabulated values for erfc()
parent
3f2c29fb
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
102 additions
and
54 deletions
+102
-54
platforms/opencl/src/OpenCLContext.cpp
platforms/opencl/src/OpenCLContext.cpp
+2
-2
platforms/opencl/src/OpenCLContext.h
platforms/opencl/src/OpenCLContext.h
+2
-2
platforms/opencl/src/OpenCLKernels.cpp
platforms/opencl/src/OpenCLKernels.cpp
+58
-27
platforms/opencl/src/OpenCLKernels.h
platforms/opencl/src/OpenCLKernels.h
+2
-1
platforms/opencl/src/OpenCLNonbondedUtilities.cpp
platforms/opencl/src/OpenCLNonbondedUtilities.cpp
+15
-9
platforms/opencl/src/OpenCLNonbondedUtilities.h
platforms/opencl/src/OpenCLNonbondedUtilities.h
+6
-6
platforms/opencl/src/OpenCLParameterSet.cpp
platforms/opencl/src/OpenCLParameterSet.cpp
+7
-7
platforms/opencl/src/kernels/coulombLennardJones.cl
platforms/opencl/src/kernels/coulombLennardJones.cl
+8
-0
platforms/opencl/src/kernels/nonbonded_default.cl
platforms/opencl/src/kernels/nonbonded_default.cl
+1
-0
platforms/opencl/src/kernels/nonbonded_nvidia.cl
platforms/opencl/src/kernels/nonbonded_nvidia.cl
+1
-0
No files found.
platforms/opencl/src/OpenCLContext.cpp
View file @
40891bab
...
...
@@ -214,8 +214,8 @@ void OpenCLContext::clearBuffer(OpenCLArray<mm_float4>& array) {
clearBuffer
(
array
.
getDeviceBuffer
(),
array
.
getSize
()
*
4
);
}
void
OpenCLContext
::
clearBuffer
(
cl
::
Buffer
&
buffer
,
int
size
)
{
clearBufferKernel
.
setArg
<
cl
::
Buffer
>
(
0
,
buffer
);
void
OpenCLContext
::
clearBuffer
(
cl
::
Memory
&
memory
,
int
size
)
{
clearBufferKernel
.
setArg
<
cl
::
Memory
>
(
0
,
memory
);
clearBufferKernel
.
setArg
<
cl_int
>
(
1
,
size
);
executeKernel
(
clearBufferKernel
,
size
);
}
...
...
platforms/opencl/src/OpenCLContext.h
View file @
40891bab
...
...
@@ -230,10 +230,10 @@ public:
/**
* Set all elements of an array to 0.
*
* @param
buffer
the
Buffer
to clear
* @param
memory
the
Memory
to clear
* @param size the number of float elements in the buffer
*/
void
clearBuffer
(
cl
::
Buffer
&
buffer
,
int
size
);
void
clearBuffer
(
cl
::
Memory
&
memory
,
int
size
);
/**
* Given a collection of buffers packed into an array, sum them and store
* the sum in the first buffer.
...
...
platforms/opencl/src/OpenCLKernels.cpp
View file @
40891bab
...
...
@@ -35,10 +35,11 @@
#include "OpenCLIntegrationUtilities.h"
#include "OpenCLNonbondedUtilities.h"
#include "OpenCLKernelSources.h"
#include "lepton/Operation.h"
#include "lepton/Parser.h"
#include "lepton/ParsedExpression.h"
#include "../src/SimTKUtilities/SimTKOpenMMRealType.h"
#include "
lepton/Operation
.h"
#include "
openmm/internal/MSVC_erfc
.h"
#include <cmath>
#include <set>
...
...
@@ -390,7 +391,7 @@ void OpenCLCalcCustomBondForceKernel::executeForces(ContextImpl& context) {
kernel
.
setArg
<
cl
::
Buffer
>
(
nextIndex
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
kernel
.
setArg
<
cl
::
Buffer
>
(
nextIndex
++
,
buffer
.
get
Buffer
());
kernel
.
setArg
<
cl
::
Memory
>
(
nextIndex
++
,
buffer
.
get
Memory
());
}
}
cl
.
executeKernel
(
kernel
,
numBonds
);
...
...
@@ -625,7 +626,7 @@ void OpenCLCalcCustomAngleForceKernel::executeForces(ContextImpl& context) {
kernel
.
setArg
<
cl
::
Buffer
>
(
nextIndex
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
kernel
.
setArg
<
cl
::
Buffer
>
(
nextIndex
++
,
buffer
.
get
Buffer
());
kernel
.
setArg
<
cl
::
Memory
>
(
nextIndex
++
,
buffer
.
get
Memory
());
}
}
cl
.
executeKernel
(
kernel
,
numAngles
);
...
...
@@ -947,7 +948,7 @@ void OpenCLCalcCustomTorsionForceKernel::executeForces(ContextImpl& context) {
kernel
.
setArg
<
cl
::
Buffer
>
(
nextIndex
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
kernel
.
setArg
<
cl
::
Buffer
>
(
nextIndex
++
,
buffer
.
get
Buffer
());
kernel
.
setArg
<
cl
::
Memory
>
(
nextIndex
++
,
buffer
.
get
Memory
());
}
}
cl
.
executeKernel
(
kernel
,
numTorsions
);
...
...
@@ -1015,6 +1016,8 @@ OpenCLCalcNonbondedForceKernel::~OpenCLCalcNonbondedForceKernel() {
delete
pmeAtomRange
;
if
(
pmeAtomGridIndex
!=
NULL
)
delete
pmeAtomGridIndex
;
if
(
erfcTable
!=
NULL
)
delete
erfcTable
;
if
(
sort
!=
NULL
)
delete
sort
;
if
(
fft
!=
NULL
)
...
...
@@ -1079,16 +1082,15 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb
defines
[
"REACTION_FIELD_K"
]
=
doubleToString
(
reactionFieldK
);
defines
[
"REACTION_FIELD_C"
]
=
doubleToString
(
reactionFieldC
);
}
double
alpha
=
0
;
if
(
force
.
getNonbondedMethod
()
==
NonbondedForce
::
Ewald
)
{
// Compute the Ewald parameters.
double
alpha
;
int
kmaxx
,
kmaxy
,
kmaxz
;
NonbondedForceImpl
::
calcEwaldParameters
(
system
,
force
,
alpha
,
kmaxx
,
kmaxy
,
kmaxz
);
defines
[
"EWALD_ALPHA"
]
=
doubleToString
(
alpha
);
defines
[
"TWO_OVER_SQRT_PI"
]
=
doubleToString
(
2.0
/
sqrt
(
M_PI
));
defines
[
"USE_EWALD"
]
=
"1"
;
double
selfEnergyScale
=
ONE_4PI_EPS0
*
alpha
/
std
::
sqrt
(
M_PI
);
ewaldSelfEnergy
=
-
ONE_4PI_EPS0
*
alpha
*
sumSquaredCharges
/
std
::
sqrt
(
M_PI
);
// Create the reciprocal space kernels.
...
...
@@ -1111,7 +1113,6 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb
else
if
(
force
.
getNonbondedMethod
()
==
NonbondedForce
::
PME
)
{
// Compute the PME parameters.
double
alpha
;
int
gridSizeX
,
gridSizeY
,
gridSizeZ
;
NonbondedForceImpl
::
calcPMEParameters
(
system
,
force
,
alpha
,
gridSizeX
,
gridSizeY
,
gridSizeZ
);
gridSizeX
=
OpenCLFFT3D
::
findLegalDimension
(
gridSizeX
);
...
...
@@ -1120,7 +1121,6 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb
defines
[
"EWALD_ALPHA"
]
=
doubleToString
(
alpha
);
defines
[
"TWO_OVER_SQRT_PI"
]
=
doubleToString
(
2.0
/
sqrt
(
M_PI
));
defines
[
"USE_EWALD"
]
=
"1"
;
double
selfEnergyScale
=
ONE_4PI_EPS0
*
alpha
/
std
::
sqrt
(
M_PI
);
ewaldSelfEnergy
=
-
ONE_4PI_EPS0
*
alpha
*
sumSquaredCharges
/
std
::
sqrt
(
M_PI
);
pmeDefines
[
"PME_ORDER"
]
=
intToString
(
PmeOrder
);
pmeDefines
[
"NUM_ATOMS"
]
=
intToString
(
numParticles
);
...
...
@@ -1205,6 +1205,37 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb
}
else
ewaldSelfEnergy
=
0.0
;
// Tabulate values of erfc().
if
(
force
.
getNonbondedMethod
()
==
NonbondedForce
::
Ewald
||
force
.
getNonbondedMethod
()
==
NonbondedForce
::
PME
)
{
if
(
cl
.
getDevice
().
getInfo
<
CL_DEVICE_IMAGE_SUPPORT
>
())
{
try
{
const
int
tableSize
=
2048
;
defines
[
"USE_TABULATED_ERFC"
]
=
"1"
;
defines
[
"ERFC_TABLE_SCALE"
]
=
doubleToString
((
tableSize
-
1
)
/
(
alpha
*
force
.
getCutoffDistance
()));
erfcTable
=
new
cl
::
Image2D
(
cl
.
getContext
(),
CL_MEM_READ_ONLY
,
cl
::
ImageFormat
(
CL_INTENSITY
,
CL_FLOAT
),
tableSize
,
1
,
0
);
vector
<
cl_float
>
erfcVector
(
tableSize
);
for
(
int
i
=
0
;
i
<
tableSize
;
++
i
)
erfcVector
[
i
]
=
(
float
)
erfc
(
i
*
(
alpha
*
force
.
getCutoffDistance
())
/
(
tableSize
-
1
));
cl
::
size_t
<
3
>
origin
,
region
;
origin
.
push_back
(
0
);
origin
.
push_back
(
0
);
origin
.
push_back
(
0
);
region
.
push_back
(
tableSize
);
region
.
push_back
(
1
);
region
.
push_back
(
1
);
cl
.
getQueue
().
enqueueWriteImage
(
*
erfcTable
,
CL_TRUE
,
origin
,
region
,
0
,
0
,
&
erfcVector
[
0
]);
cl
.
getNonbondedUtilities
().
addArgument
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
"erfcTable"
,
"image2d_t"
,
sizeof
(
cl_float
),
*
erfcTable
));
}
catch
(
cl
::
Error
err
)
{
std
::
stringstream
str
;
str
<<
"Error creating erfc() image: "
<<
err
.
what
()
<<
" ("
<<
err
.
err
()
<<
")"
;
throw
OpenMMException
(
str
.
str
());
}
}
}
// Add the interaction to the default nonbonded kernel.
...
...
@@ -1466,7 +1497,7 @@ void OpenCLCalcCustomNonbondedForceKernel::initialize(const System& system, cons
cl
.
getNonbondedUtilities
().
addInteraction
(
useCutoff
,
usePeriodic
,
true
,
force
.
getCutoffDistance
(),
exclusionList
,
source
);
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
cl
.
getNonbondedUtilities
().
addParameter
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
prefix
+
"params"
+
intToString
(
i
+
1
),
buffer
.
getType
(),
buffer
.
getSize
(),
buffer
.
get
Buffer
()));
cl
.
getNonbondedUtilities
().
addParameter
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
prefix
+
"params"
+
intToString
(
i
+
1
),
buffer
.
getType
(),
buffer
.
getSize
(),
buffer
.
get
Memory
()));
}
if
(
globals
!=
NULL
)
{
globals
->
upload
(
globalParamValues
);
...
...
@@ -2149,17 +2180,17 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
string
paramName
=
prefix
+
"params"
+
intToString
(
i
+
1
);
cl
.
getNonbondedUtilities
().
addParameter
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
paramName
,
buffer
.
getType
(),
buffer
.
getSize
(),
buffer
.
get
Buffer
()));
cl
.
getNonbondedUtilities
().
addParameter
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
paramName
,
buffer
.
getType
(),
buffer
.
getSize
(),
buffer
.
get
Memory
()));
}
for
(
int
i
=
0
;
i
<
(
int
)
computedValues
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
computedValues
->
getBuffers
()[
i
];
string
paramName
=
prefix
+
"values"
+
intToString
(
i
+
1
);
cl
.
getNonbondedUtilities
().
addParameter
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
paramName
,
buffer
.
getType
(),
buffer
.
getSize
(),
buffer
.
get
Buffer
()));
cl
.
getNonbondedUtilities
().
addParameter
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
paramName
,
buffer
.
getType
(),
buffer
.
getSize
(),
buffer
.
get
Memory
()));
}
for
(
int
i
=
0
;
i
<
(
int
)
energyDerivs
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
energyDerivs
->
getBuffers
()[
i
];
string
paramName
=
prefix
+
"dEdV"
+
intToString
(
i
+
1
);
cl
.
getNonbondedUtilities
().
addParameter
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
paramName
,
buffer
.
getType
(),
buffer
.
getSize
(),
buffer
.
get
Buffer
()));
cl
.
getNonbondedUtilities
().
addParameter
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
paramName
,
buffer
.
getType
(),
buffer
.
getSize
(),
buffer
.
get
Memory
()));
}
if
(
globals
!=
NULL
)
{
globals
->
upload
(
globalParamValues
);
...
...
@@ -2195,7 +2226,7 @@ void OpenCLCalcCustomGBForceKernel::executeForces(ContextImpl& context) {
pairValueKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
pairValueKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
buffer
.
get
Buffer
());
pairValueKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
get
Memory
());
pairValueKernel
.
setArg
(
index
++
,
OpenCLContext
::
ThreadBlockSize
*
buffer
.
getSize
(),
NULL
);
}
if
(
tabulatedFunctionParams
!=
NULL
)
{
...
...
@@ -2210,9 +2241,9 @@ void OpenCLCalcCustomGBForceKernel::executeForces(ContextImpl& context) {
if
(
globals
!=
NULL
)
perParticleValueKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
perParticleValueKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
params
->
getBuffers
()[
i
].
get
Buffer
());
perParticleValueKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
params
->
getBuffers
()[
i
].
get
Memory
());
for
(
int
i
=
0
;
i
<
(
int
)
computedValues
->
getBuffers
().
size
();
i
++
)
perParticleValueKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
computedValues
->
getBuffers
()[
i
].
get
Buffer
());
perParticleValueKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
computedValues
->
getBuffers
()[
i
].
get
Memory
());
if
(
tabulatedFunctionParams
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
int
)
tabulatedFunctions
.
size
();
i
++
)
perParticleValueKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
tabulatedFunctions
[
i
]
->
getDeviceBuffer
());
...
...
@@ -2240,17 +2271,17 @@ void OpenCLCalcCustomGBForceKernel::executeForces(ContextImpl& context) {
pairEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
pairEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
buffer
.
get
Buffer
());
pairEnergyKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
get
Memory
());
pairEnergyKernel
.
setArg
(
index
++
,
OpenCLContext
::
ThreadBlockSize
*
buffer
.
getSize
(),
NULL
);
}
for
(
int
i
=
0
;
i
<
(
int
)
computedValues
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
computedValues
->
getBuffers
()[
i
];
pairEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
buffer
.
get
Buffer
());
pairEnergyKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
get
Memory
());
pairEnergyKernel
.
setArg
(
index
++
,
OpenCLContext
::
ThreadBlockSize
*
buffer
.
getSize
(),
NULL
);
}
for
(
int
i
=
0
;
i
<
(
int
)
energyDerivs
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
energyDerivs
->
getBuffers
()[
i
];
pairEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
buffer
.
get
Buffer
());
pairEnergyKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
get
Memory
());
pairEnergyKernel
.
setArg
(
index
++
,
OpenCLContext
::
ThreadBlockSize
*
buffer
.
getSize
(),
NULL
);
}
if
(
tabulatedFunctionParams
!=
NULL
)
{
...
...
@@ -2265,11 +2296,11 @@ void OpenCLCalcCustomGBForceKernel::executeForces(ContextImpl& context) {
if
(
globals
!=
NULL
)
perParticleEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
perParticleEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
params
->
getBuffers
()[
i
].
get
Buffer
());
perParticleEnergyKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
params
->
getBuffers
()[
i
].
get
Memory
());
for
(
int
i
=
0
;
i
<
(
int
)
computedValues
->
getBuffers
().
size
();
i
++
)
perParticleEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
computedValues
->
getBuffers
()[
i
].
get
Buffer
());
perParticleEnergyKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
computedValues
->
getBuffers
()[
i
].
get
Memory
());
for
(
int
i
=
0
;
i
<
(
int
)
energyDerivs
->
getBuffers
().
size
();
i
++
)
perParticleEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
energyDerivs
->
getBuffers
()[
i
].
get
Buffer
());
perParticleEnergyKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
energyDerivs
->
getBuffers
()[
i
].
get
Memory
());
if
(
tabulatedFunctionParams
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
int
)
tabulatedFunctions
.
size
();
i
++
)
perParticleEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
tabulatedFunctions
[
i
]
->
getDeviceBuffer
());
...
...
@@ -2290,7 +2321,7 @@ void OpenCLCalcCustomGBForceKernel::executeForces(ContextImpl& context) {
cl
.
clearBuffer
(
*
valueBuffers
);
for
(
int
i
=
0
;
i
<
(
int
)
energyDerivs
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
energyDerivs
->
getBuffers
()[
i
];
cl
.
clearBuffer
(
buffer
.
get
Buffer
(),
buffer
.
getSize
()
*
energyDerivs
->
getNumObjects
()
/
sizeof
(
cl_float
));
cl
.
clearBuffer
(
buffer
.
get
Memory
(),
buffer
.
getSize
()
*
energyDerivs
->
getNumObjects
()
/
sizeof
(
cl_float
));
}
cl
.
executeKernel
(
pairValueKernel
,
nb
.
getTiles
().
getSize
()
*
OpenCLContext
::
TileSize
);
cl
.
executeKernel
(
perParticleValueKernel
,
cl
.
getPaddedNumAtoms
());
...
...
@@ -2440,7 +2471,7 @@ void OpenCLCalcCustomExternalForceKernel::executeForces(ContextImpl& context) {
kernel
.
setArg
<
cl
::
Buffer
>
(
nextIndex
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
kernel
.
setArg
<
cl
::
Buffer
>
(
nextIndex
++
,
buffer
.
get
Buffer
());
kernel
.
setArg
<
cl
::
Memory
>
(
nextIndex
++
,
buffer
.
get
Memory
());
}
}
cl
.
executeKernel
(
kernel
,
numParticles
);
...
...
@@ -2905,11 +2936,11 @@ void OpenCLCalcCustomHbondForceKernel::executeForces(ContextImpl& context) {
donorKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
donorParams
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
donorParams
->
getBuffers
()[
i
];
donorKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
buffer
.
get
Buffer
());
donorKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
get
Memory
());
}
for
(
int
i
=
0
;
i
<
(
int
)
acceptorParams
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
acceptorParams
->
getBuffers
()[
i
];
donorKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
buffer
.
get
Buffer
());
donorKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
get
Memory
());
}
if
(
tabulatedFunctionParams
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
int
)
tabulatedFunctions
.
size
();
i
++
)
...
...
@@ -2929,11 +2960,11 @@ void OpenCLCalcCustomHbondForceKernel::executeForces(ContextImpl& context) {
acceptorKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
donorParams
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
donorParams
->
getBuffers
()[
i
];
acceptorKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
buffer
.
get
Buffer
());
acceptorKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
get
Memory
());
}
for
(
int
i
=
0
;
i
<
(
int
)
acceptorParams
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
acceptorParams
->
getBuffers
()[
i
];
acceptorKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
buffer
.
get
Buffer
());
acceptorKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
get
Memory
());
}
if
(
tabulatedFunctionParams
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
int
)
tabulatedFunctions
.
size
();
i
++
)
...
...
platforms/opencl/src/OpenCLKernels.h
View file @
40891bab
...
...
@@ -438,7 +438,7 @@ public:
OpenCLCalcNonbondedForceKernel
(
std
::
string
name
,
const
Platform
&
platform
,
OpenCLContext
&
cl
,
System
&
system
)
:
CalcNonbondedForceKernel
(
name
,
platform
),
hasInitializedKernel
(
false
),
cl
(
cl
),
sigmaEpsilon
(
NULL
),
exceptionParams
(
NULL
),
exceptionIndices
(
NULL
),
cosSinSums
(
NULL
),
pmeGrid
(
NULL
),
pmeBsplineModuliX
(
NULL
),
pmeBsplineModuliY
(
NULL
),
pmeBsplineModuliZ
(
NULL
),
pmeBsplineTheta
(
NULL
),
pmeBsplineDtheta
(
NULL
),
pmeAtomRange
(
NULL
),
pmeAtomGridIndex
(
NULL
),
sort
(
NULL
),
fft
(
NULL
)
{
pmeAtomGridIndex
(
NULL
),
erfcTable
(
NULL
),
sort
(
NULL
),
fft
(
NULL
)
{
}
~
OpenCLCalcNonbondedForceKernel
();
/**
...
...
@@ -478,6 +478,7 @@ private:
OpenCLArray
<
mm_float2
>*
pmeAtomGridIndex
;
OpenCLSort
<
mm_float2
>*
sort
;
OpenCLFFT3D
*
fft
;
cl
::
Image2D
*
erfcTable
;
cl
::
Kernel
exceptionsKernel
;
cl
::
Kernel
ewaldSumsKernel
;
cl
::
Kernel
ewaldForcesKernel
;
...
...
platforms/opencl/src/OpenCLNonbondedUtilities.cpp
View file @
40891bab
...
...
@@ -294,13 +294,19 @@ cl::Kernel OpenCLNonbondedUtilities::createInteractionKernel(const string& sourc
args
<<
params
[
i
].
getName
();
}
for
(
int
i
=
0
;
i
<
(
int
)
arguments
.
size
();
i
++
)
{
if
((
arguments
[
i
].
getBuffer
().
getInfo
<
CL_MEM_FLAGS
>
()
&
CL_MEM_READ_ONLY
)
==
0
)
args
<<
", __global "
;
else
args
<<
", __constant "
;
args
<<
arguments
[
i
].
getType
();
args
<<
"* "
;
args
<<
arguments
[
i
].
getName
();
if
(
arguments
[
i
].
getMemory
().
getInfo
<
CL_MEM_TYPE
>
()
==
CL_MEM_OBJECT_IMAGE2D
)
{
args
<<
", __read_only image2d_t "
;
args
<<
arguments
[
i
].
getName
();
}
else
{
if
((
arguments
[
i
].
getMemory
().
getInfo
<
CL_MEM_FLAGS
>
()
&
CL_MEM_READ_ONLY
)
==
0
)
args
<<
", __global "
;
else
args
<<
", __constant "
;
args
<<
arguments
[
i
].
getType
();
args
<<
"* "
;
args
<<
arguments
[
i
].
getName
();
}
}
replacements
[
"PARAMETER_ARGUMENTS"
]
=
args
.
str
();
stringstream
loadLocal1
;
...
...
@@ -388,12 +394,12 @@ cl::Kernel OpenCLNonbondedUtilities::createInteractionKernel(const string& sourc
kernel
.
setArg
<
cl_uint
>
(
9
,
tiles
->
getSize
());
}
for
(
int
i
=
0
;
i
<
(
int
)
params
.
size
();
i
++
)
{
kernel
.
setArg
<
cl
::
Buffer
>
(
i
*
2
+
paramBase
,
params
[
i
].
get
Buffer
());
kernel
.
setArg
<
cl
::
Memory
>
(
i
*
2
+
paramBase
,
params
[
i
].
get
Memory
());
kernel
.
setArg
(
i
*
2
+
paramBase
+
1
,
OpenCLContext
::
ThreadBlockSize
*
params
[
i
].
getSize
(),
NULL
);
}
paramBase
+=
2
*
params
.
size
();
for
(
int
i
=
0
;
i
<
(
int
)
arguments
.
size
();
i
++
)
{
kernel
.
setArg
<
cl
::
Buffer
>
(
i
+
paramBase
,
arguments
[
i
].
get
Buffer
());
kernel
.
setArg
<
cl
::
Memory
>
(
i
+
paramBase
,
arguments
[
i
].
get
Memory
());
}
return
kernel
;
}
platforms/opencl/src/OpenCLNonbondedUtilities.h
View file @
40891bab
...
...
@@ -231,10 +231,10 @@ public:
* @param name the name of the parameter
* @param type the data type of the parameter
* @param size the size of the parameter in bytes
* @param
buffer
the
buffer
containing the parameter values
* @param
memory
the
memory
containing the parameter values
*/
ParameterInfo
(
const
std
::
string
&
name
,
const
std
::
string
&
type
,
int
size
,
cl
::
Buffer
&
buffer
)
:
name
(
name
),
type
(
type
),
size
(
size
),
buffer
(
&
buffer
)
{
ParameterInfo
(
const
std
::
string
&
name
,
const
std
::
string
&
type
,
int
size
,
cl
::
Memory
&
memory
)
:
name
(
name
),
type
(
type
),
size
(
size
),
memory
(
&
memory
)
{
}
const
std
::
string
&
getName
()
const
{
return
name
;
...
...
@@ -245,14 +245,14 @@ public:
int
getSize
()
const
{
return
size
;
}
cl
::
Buffer
&
getBuffer
()
const
{
return
*
buffer
;
cl
::
Memory
&
getMemory
()
const
{
return
*
memory
;
}
private:
std
::
string
name
;
std
::
string
type
;
int
size
;
cl
::
Buffer
*
buffer
;
cl
::
Memory
*
memory
;
};
}
// namespace OpenMM
...
...
platforms/opencl/src/OpenCLParameterSet.cpp
View file @
40891bab
...
...
@@ -67,7 +67,7 @@ OpenCLParameterSet::OpenCLParameterSet(OpenCLContext& context, int numParameters
OpenCLParameterSet
::~
OpenCLParameterSet
()
{
for
(
int
i
=
0
;
i
<
(
int
)
buffers
.
size
();
i
++
)
delete
&
buffers
[
i
].
get
Buffer
();
delete
&
buffers
[
i
].
get
Memory
();
}
void
OpenCLParameterSet
::
getParameterValues
(
vector
<
vector
<
cl_float
>
>&
values
)
const
{
...
...
@@ -79,7 +79,7 @@ void OpenCLParameterSet::getParameterValues(vector<vector<cl_float> >& values) c
for
(
int
i
=
0
;
i
<
(
int
)
buffers
.
size
();
i
++
)
{
if
(
buffers
[
i
].
getType
()
==
"float4"
)
{
vector
<
mm_float4
>
data
(
numObjects
);
context
.
getQueue
().
enqueueReadBuffer
(
buffers
[
i
].
get
Buffer
(
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
context
.
getQueue
().
enqueueReadBuffer
(
reinterpret_cast
<
cl
::
Buffer
&>
(
buffers
[
i
].
get
Memory
()
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
for
(
int
j
=
0
;
j
<
numObjects
;
j
++
)
{
values
[
j
][
base
]
=
data
[
j
].
x
;
if
(
base
+
1
<
numParameters
)
...
...
@@ -93,7 +93,7 @@ void OpenCLParameterSet::getParameterValues(vector<vector<cl_float> >& values) c
}
else
if
(
buffers
[
i
].
getType
()
==
"float2"
)
{
vector
<
mm_float2
>
data
(
numObjects
);
context
.
getQueue
().
enqueueReadBuffer
(
buffers
[
i
].
get
Buffer
(
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
context
.
getQueue
().
enqueueReadBuffer
(
reinterpret_cast
<
cl
::
Buffer
&>
(
buffers
[
i
].
get
Memory
()
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
for
(
int
j
=
0
;
j
<
numObjects
;
j
++
)
{
values
[
j
][
base
]
=
data
[
j
].
x
;
if
(
base
+
1
<
numParameters
)
...
...
@@ -103,7 +103,7 @@ void OpenCLParameterSet::getParameterValues(vector<vector<cl_float> >& values) c
}
else
if
(
buffers
[
i
].
getType
()
==
"float"
)
{
vector
<
cl_float
>
data
(
numObjects
);
context
.
getQueue
().
enqueueReadBuffer
(
buffers
[
i
].
get
Buffer
(
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
context
.
getQueue
().
enqueueReadBuffer
(
reinterpret_cast
<
cl
::
Buffer
&>
(
buffers
[
i
].
get
Memory
()
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
for
(
int
j
=
0
;
j
<
numObjects
;
j
++
)
values
[
j
][
base
]
=
data
[
j
];
}
...
...
@@ -133,7 +133,7 @@ void OpenCLParameterSet::setParameterValues(const vector<vector<cl_float> >& val
if
(
base
+
3
<
numParameters
)
data
[
j
].
w
=
values
[
j
][
base
+
3
];
}
context
.
getQueue
().
enqueueWriteBuffer
(
buffers
[
i
].
get
Buffer
(
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
context
.
getQueue
().
enqueueWriteBuffer
(
reinterpret_cast
<
cl
::
Buffer
&>
(
buffers
[
i
].
get
Memory
()
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
base
+=
4
;
}
else
if
(
buffers
[
i
].
getType
()
==
"float2"
)
{
...
...
@@ -143,14 +143,14 @@ void OpenCLParameterSet::setParameterValues(const vector<vector<cl_float> >& val
if
(
base
+
1
<
numParameters
)
data
[
j
].
y
=
values
[
j
][
base
+
1
];
}
context
.
getQueue
().
enqueueWriteBuffer
(
buffers
[
i
].
get
Buffer
(
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
context
.
getQueue
().
enqueueWriteBuffer
(
reinterpret_cast
<
cl
::
Buffer
&>
(
buffers
[
i
].
get
Memory
()
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
base
+=
2
;
}
else
if
(
buffers
[
i
].
getType
()
==
"float"
)
{
vector
<
cl_float
>
data
(
numObjects
);
for
(
int
j
=
0
;
j
<
numObjects
;
j
++
)
data
[
j
]
=
values
[
j
][
base
];
context
.
getQueue
().
enqueueWriteBuffer
(
buffers
[
i
].
get
Buffer
(
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
context
.
getQueue
().
enqueueWriteBuffer
(
reinterpret_cast
<
cl
::
Buffer
&>
(
buffers
[
i
].
get
Memory
()
),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
}
else
throw
OpenMMException
(
"Internal error: Unknown buffer type in OpenCLParameterSet"
);
...
...
platforms/opencl/src/kernels/coulombLennardJones.cl
View file @
40891bab
...
...
@@ -3,7 +3,15 @@ bool needCorrection = isExcluded && atom1 != atom2 && atom1 < NUM_ATOMS && atom2
if
(
!isExcluded
||
needCorrection
)
{
const
float
prefactor
=
138.935456f*posq1.w*posq2.w*invR
;
float
alphaR
=
EWALD_ALPHA*r
;
#
ifdef
USE_TABULATED_ERFC
float
normalized
=
ERFC_TABLE_SCALE*alphaR
;
int
tableIndex
=
(
int
)
normalized
;
float
fract2
=
normalized-tableIndex
;
float
fract1
=
1.0f-fract2
;
float
erfcAlphaR
=
fract1*read_imagef
(
erfcTable,
sampler,
(
int2
)(
tableIndex,
0
))
.
x
+
fract2*read_imagef
(
erfcTable,
sampler,
(
int2
)(
tableIndex+1,
0
))
.
x
;
#
else
float
erfcAlphaR
=
erfc
(
alphaR
)
;
#
endif
float
tempForce
=
0.0f
;
if
(
needCorrection
)
{
//
Subtract
off
the
part
of
this
interaction
that
was
included
in
the
reciprocal
space
contribution.
...
...
platforms/opencl/src/kernels/nonbonded_default.cl
View file @
40891bab
#
define
TILE_SIZE
32
const
sampler_t
sampler
=
CLK_NORMALIZED_COORDS_FALSE
| CLK_ADDRESS_CLAMP_TO_EDGE |
CLK_FILTER_NEAREST
;
/**
*
Compute
nonbonded
interactions.
...
...
platforms/opencl/src/kernels/nonbonded_nvidia.cl
View file @
40891bab
#
define
TILE_SIZE
32
const
sampler_t
sampler
=
CLK_NORMALIZED_COORDS_FALSE
| CLK_ADDRESS_CLAMP_TO_EDGE |
CLK_FILTER_NEAREST
;
/**
*
Compute
nonbonded
interactions.
...
...
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