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
0c4af105
"plugins/drude/openmmapi/vscode:/vscode.git/clone" did not exist on "f5df1076c7f2d75fe1b9dc65969b965ff0e37b58"
Commit
0c4af105
authored
May 24, 2012
by
Peter Eastman
Browse files
Optimizations to CustomGBForce
parent
e7a00c6a
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
144 additions
and
118 deletions
+144
-118
platforms/opencl/src/OpenCLKernels.cpp
platforms/opencl/src/OpenCLKernels.cpp
+117
-100
platforms/opencl/src/OpenCLKernels.h
platforms/opencl/src/OpenCLKernels.h
+1
-0
platforms/opencl/src/OpenCLParameterSet.cpp
platforms/opencl/src/OpenCLParameterSet.cpp
+20
-15
platforms/opencl/src/OpenCLParameterSet.h
platforms/opencl/src/OpenCLParameterSet.h
+3
-1
platforms/opencl/src/kernels/customGBEnergyPerParticle.cl
platforms/opencl/src/kernels/customGBEnergyPerParticle.cl
+3
-2
No files found.
platforms/opencl/src/OpenCLKernels.cpp
View file @
0c4af105
...
...
@@ -1799,8 +1799,8 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
// Record parameters and exclusions.
int
numParticles
=
force
.
getNumParticles
();
params
=
new
OpenCLParameterSet
(
cl
,
force
.
getNumPerParticleParameters
(),
numParticles
,
"customGBParameters"
);
computedValues
=
new
OpenCLParameterSet
(
cl
,
force
.
getNumComputedValues
(),
numParticles
,
"customGBComputedValues"
);
params
=
new
OpenCLParameterSet
(
cl
,
force
.
getNumPerParticleParameters
(),
numParticles
,
"customGBParameters"
,
true
);
computedValues
=
new
OpenCLParameterSet
(
cl
,
force
.
getNumComputedValues
(),
numParticles
,
"customGBComputedValues"
,
true
);
if
(
force
.
getNumGlobalParameters
()
>
0
)
globals
=
new
OpenCLArray
<
cl_float
>
(
cl
,
force
.
getNumGlobalParameters
(),
"customGBGlobals"
,
false
,
CL_MEM_READ_ONLY
);
vector
<
vector
<
cl_float
>
>
paramVector
(
numParticles
);
...
...
@@ -1877,17 +1877,25 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
valueDerivExpressions
[
i
].
push_back
(
ex
.
differentiate
(
computedValueNames
[
j
]).
optimize
());
}
vector
<
vector
<
Lepton
::
ParsedExpression
>
>
energyDerivExpressions
(
force
.
getNumEnergyTerms
());
vector
<
bool
>
needChainForValue
(
force
.
getNumComputedValues
(),
false
);
for
(
int
i
=
0
;
i
<
force
.
getNumEnergyTerms
();
i
++
)
{
string
expression
;
CustomGBForce
::
ComputationType
type
;
force
.
getEnergyTermParameters
(
i
,
expression
,
type
);
Lepton
::
ParsedExpression
ex
=
Lepton
::
Parser
::
parse
(
expression
,
functions
).
optimize
();
for
(
int
j
=
0
;
j
<
force
.
getNumComputedValues
();
j
++
)
{
if
(
type
==
CustomGBForce
::
SingleParticle
)
if
(
type
==
CustomGBForce
::
SingleParticle
)
{
energyDerivExpressions
[
i
].
push_back
(
ex
.
differentiate
(
computedValueNames
[
j
]).
optimize
());
if
(
!
isZeroExpression
(
energyDerivExpressions
[
i
].
back
()))
needChainForValue
[
j
]
=
true
;
}
else
{
energyDerivExpressions
[
i
].
push_back
(
ex
.
differentiate
(
computedValueNames
[
j
]
+
"1"
).
optimize
());
if
(
!
isZeroExpression
(
energyDerivExpressions
[
i
].
back
()))
needChainForValue
[
j
]
=
true
;
energyDerivExpressions
[
i
].
push_back
(
ex
.
differentiate
(
computedValueNames
[
j
]
+
"2"
).
optimize
());
if
(
!
isZeroExpression
(
energyDerivExpressions
[
i
].
back
()))
needChainForValue
[
j
]
=
true
;
}
}
}
...
...
@@ -1895,10 +1903,10 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
bool
useLong
=
(
cl
.
getSupports64BitGlobalAtomics
()
&&
!
deviceIsCpu
);
if
(
useLong
)
{
longEnergyDerivs
=
new
OpenCLArray
<
cl_long
>
(
cl
,
force
.
getNumComputedValues
()
*
cl
.
getPaddedNumAtoms
(),
"customGBLongEnergyDerivatives"
);
energyDerivs
=
new
OpenCLParameterSet
(
cl
,
force
.
getNumComputedValues
(),
cl
.
getPaddedNumAtoms
(),
"customGBEnergyDerivatives"
);
energyDerivs
=
new
OpenCLParameterSet
(
cl
,
force
.
getNumComputedValues
(),
cl
.
getPaddedNumAtoms
(),
"customGBEnergyDerivatives"
,
true
);
}
else
energyDerivs
=
new
OpenCLParameterSet
(
cl
,
force
.
getNumComputedValues
(),
cl
.
getPaddedNumAtoms
()
*
cl
.
getNonbondedUtilities
().
getNumForceBuffers
(),
"customGBEnergyDerivatives"
);
energyDerivs
=
new
OpenCLParameterSet
(
cl
,
force
.
getNumComputedValues
(),
cl
.
getPaddedNumAtoms
()
*
cl
.
getNonbondedUtilities
().
getNumForceBuffers
(),
"customGBEnergyDerivatives"
,
true
);
// Create the kernels.
...
...
@@ -1932,18 +1940,23 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
n2ValueExpressions
[
"tempValue2 = "
]
=
ex
.
renameVariables
(
rename
);
n2ValueSource
<<
OpenCLExpressionUtilities
::
createExpressions
(
n2ValueExpressions
,
variables
,
functionDefinitions
,
"temp"
,
prefix
+
"functionParams"
);
map
<
string
,
string
>
replacements
;
replacements
[
"COMPUTE_VALUE"
]
=
n2ValueSource
.
str
();
string
n2ValueStr
=
n2ValueSource
.
str
();
replacements
[
"COMPUTE_VALUE"
]
=
n2ValueStr
;
stringstream
extraArgs
,
loadLocal1
,
loadLocal2
,
load1
,
load2
;
if
(
force
.
getNumGlobalParameters
()
>
0
)
extraArgs
<<
", __global const float* globals"
;
pairValueUsesParam
.
resize
(
params
->
getBuffers
().
size
(),
false
);
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
string
paramName
=
"params"
+
intToString
(
i
+
1
);
if
(
n2ValueStr
.
find
(
paramName
+
"1"
)
!=
n2ValueStr
.
npos
||
n2ValueStr
.
find
(
paramName
+
"2"
)
!=
n2ValueStr
.
npos
)
{
extraArgs
<<
", __global const "
<<
buffer
.
getType
()
<<
"* restrict global_"
<<
paramName
<<
", __local "
<<
buffer
.
getType
()
<<
"* restrict local_"
<<
paramName
;
loadLocal1
<<
"local_"
<<
paramName
<<
"[localAtomIndex] = "
<<
paramName
<<
"1;
\n
"
;
loadLocal2
<<
"local_"
<<
paramName
<<
"[localAtomIndex] = global_"
<<
paramName
<<
"[j];
\n
"
;
load1
<<
buffer
.
getType
()
<<
" "
<<
paramName
<<
"1 = global_"
<<
paramName
<<
"[atom1];
\n
"
;
load2
<<
buffer
.
getType
()
<<
" "
<<
paramName
<<
"2 = local_"
<<
paramName
<<
"[atom2];
\n
"
;
pairValueUsesParam
[
i
]
=
true
;
}
}
replacements
[
"PARAMETER_ARGUMENTS"
]
=
extraArgs
.
str
()
+
tableArgs
.
str
();
replacements
[
"LOAD_LOCAL_PARAMETERS_FROM_1"
]
=
loadLocal1
.
str
();
...
...
@@ -2054,17 +2067,21 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
n2EnergyExpressions
[
"dEdR += "
]
=
Lepton
::
Parser
::
parse
(
expression
,
functions
).
differentiate
(
"r"
).
optimize
();
if
(
useLong
)
{
for
(
int
j
=
0
;
j
<
force
.
getNumComputedValues
();
j
++
)
{
if
(
needChainForValue
[
j
])
{
string
index
=
intToString
(
j
+
1
);
n2EnergyExpressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ deriv"
+
index
+
"_1 += "
]
=
energyDerivExpressions
[
i
][
2
*
j
];
n2EnergyExpressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ deriv"
+
index
+
"_2 += "
]
=
energyDerivExpressions
[
i
][
2
*
j
+
1
];
}
}
}
else
{
for
(
int
j
=
0
;
j
<
force
.
getNumComputedValues
();
j
++
)
{
if
(
needChainForValue
[
j
])
{
n2EnergyExpressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ deriv"
+
energyDerivs
->
getParameterSuffix
(
j
,
"_1"
)
+
" += "
]
=
energyDerivExpressions
[
i
][
2
*
j
];
n2EnergyExpressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ deriv"
+
energyDerivs
->
getParameterSuffix
(
j
,
"_2"
)
+
" += "
]
=
energyDerivExpressions
[
i
][
2
*
j
+
1
];
}
}
}
if
(
exclude
)
n2EnergySource
<<
"if (!isExcluded) {
\n
"
;
n2EnergySource
<<
OpenCLExpressionUtilities
::
createExpressions
(
n2EnergyExpressions
,
variables
,
functionDefinitions
,
"temp"
,
prefix
+
"functionParams"
);
...
...
@@ -2072,27 +2089,36 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
n2EnergySource
<<
"}
\n
"
;
}
map
<
string
,
string
>
replacements
;
replacements
[
"COMPUTE_INTERACTION"
]
=
n2EnergySource
.
str
();
string
n2EnergyStr
=
n2EnergySource
.
str
();
replacements
[
"COMPUTE_INTERACTION"
]
=
n2EnergyStr
;
stringstream
extraArgs
,
loadLocal1
,
loadLocal2
,
clearLocal
,
load1
,
load2
,
declare1
,
recordDeriv
,
storeDerivs1
,
storeDerivs2
,
declareTemps
,
setTemps
;
if
(
force
.
getNumGlobalParameters
()
>
0
)
extraArgs
<<
", __global const float* globals"
;
pairEnergyUsesParam
.
resize
(
params
->
getBuffers
().
size
(),
false
);
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
string
paramName
=
"params"
+
intToString
(
i
+
1
);
if
(
n2EnergyStr
.
find
(
paramName
+
"1"
)
!=
n2EnergyStr
.
npos
||
n2EnergyStr
.
find
(
paramName
+
"2"
)
!=
n2EnergyStr
.
npos
)
{
extraArgs
<<
", __global const "
<<
buffer
.
getType
()
<<
"* restrict global_"
<<
paramName
<<
", __local "
<<
buffer
.
getType
()
<<
"* restrict local_"
<<
paramName
;
loadLocal1
<<
"local_"
<<
paramName
<<
"[localAtomIndex] = "
<<
paramName
<<
"1;
\n
"
;
loadLocal2
<<
"local_"
<<
paramName
<<
"[localAtomIndex] = global_"
<<
paramName
<<
"[j];
\n
"
;
load1
<<
buffer
.
getType
()
<<
" "
<<
paramName
<<
"1 = global_"
<<
paramName
<<
"[atom1];
\n
"
;
load2
<<
buffer
.
getType
()
<<
" "
<<
paramName
<<
"2 = local_"
<<
paramName
<<
"[atom2];
\n
"
;
pairEnergyUsesParam
[
i
]
=
true
;
}
}
pairEnergyUsesValue
.
resize
(
computedValues
->
getBuffers
().
size
(),
false
);
for
(
int
i
=
0
;
i
<
(
int
)
computedValues
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
computedValues
->
getBuffers
()[
i
];
string
valueName
=
"values"
+
intToString
(
i
+
1
);
if
(
n2EnergyStr
.
find
(
valueName
+
"1"
)
!=
n2EnergyStr
.
npos
||
n2EnergyStr
.
find
(
valueName
+
"2"
)
!=
n2EnergyStr
.
npos
)
{
extraArgs
<<
", __global const "
<<
buffer
.
getType
()
<<
"* restrict global_"
<<
valueName
<<
", __local "
<<
buffer
.
getType
()
<<
"* restrict local_"
<<
valueName
;
loadLocal1
<<
"local_"
<<
valueName
<<
"[localAtomIndex] = "
<<
valueName
<<
"1;
\n
"
;
loadLocal2
<<
"local_"
<<
valueName
<<
"[localAtomIndex] = global_"
<<
valueName
<<
"[j];
\n
"
;
load1
<<
buffer
.
getType
()
<<
" "
<<
valueName
<<
"1 = global_"
<<
valueName
<<
"[atom1];
\n
"
;
load2
<<
buffer
.
getType
()
<<
" "
<<
valueName
<<
"2 = local_"
<<
valueName
<<
"[atom2];
\n
"
;
pairEnergyUsesValue
[
i
]
=
true
;
}
}
if
(
useLong
)
{
extraArgs
<<
", __global long* restrict derivBuffers"
;
...
...
@@ -2193,6 +2219,9 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
for
(
int
i
=
0
;
i
<
(
int
)
energyDerivs
->
getBuffers
().
size
();
i
++
)
reduce
<<
"REDUCE_VALUE(derivBuffers"
<<
intToString
(
i
+
1
)
<<
", "
<<
energyDerivs
->
getBuffers
()[
i
].
getType
()
<<
")
\n
"
;
}
// Compute the various expressions.
map
<
string
,
string
>
variables
;
variables
[
"x"
]
=
"pos.x"
;
variables
[
"y"
]
=
"pos.y"
;
...
...
@@ -2203,7 +2232,7 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
variables
[
force
.
getGlobalParameterName
(
i
)]
=
"globals["
+
intToString
(
i
)
+
"]"
;
for
(
int
i
=
0
;
i
<
force
.
getNumComputedValues
();
i
++
)
variables
[
computedValueNames
[
i
]]
=
"values"
+
computedValues
->
getParameterSuffix
(
i
,
"[index]"
);
map
<
string
,
Lepton
::
ParsedExpression
>
e
nergyE
xpressions
;
map
<
string
,
Lepton
::
ParsedExpression
>
expressions
;
for
(
int
i
=
0
;
i
<
force
.
getNumEnergyTerms
();
i
++
)
{
string
expression
;
CustomGBForce
::
ComputationType
type
;
...
...
@@ -2211,25 +2240,38 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
if
(
type
!=
CustomGBForce
::
SingleParticle
)
continue
;
Lepton
::
ParsedExpression
parsed
=
Lepton
::
Parser
::
parse
(
expression
,
functions
).
optimize
();
e
nergyE
xpressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ energy += "
]
=
parsed
;
expressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ energy += "
]
=
parsed
;
for
(
int
j
=
0
;
j
<
force
.
getNumComputedValues
();
j
++
)
e
nergyE
xpressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ deriv"
+
energyDerivs
->
getParameterSuffix
(
j
)
+
" += "
]
=
energyDerivExpressions
[
i
][
j
];
expressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ deriv"
+
energyDerivs
->
getParameterSuffix
(
j
)
+
" += "
]
=
energyDerivExpressions
[
i
][
j
];
Lepton
::
ParsedExpression
gradx
=
parsed
.
differentiate
(
"x"
).
optimize
();
Lepton
::
ParsedExpression
grady
=
parsed
.
differentiate
(
"y"
).
optimize
();
Lepton
::
ParsedExpression
gradz
=
parsed
.
differentiate
(
"z"
).
optimize
();
if
(
!
isZeroExpression
(
gradx
))
e
nergyE
xpressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ force.x -= "
]
=
gradx
;
expressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ force.x -= "
]
=
gradx
;
if
(
!
isZeroExpression
(
grady
))
e
nergyE
xpressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ force.y -= "
]
=
grady
;
expressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ force.y -= "
]
=
grady
;
if
(
!
isZeroExpression
(
gradz
))
energyExpressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ force.z -= "
]
=
gradz
;
expressions
[
"/*"
+
intToString
(
i
+
1
)
+
"*/ force.z -= "
]
=
gradz
;
}
for
(
int
i
=
1
;
i
<
force
.
getNumComputedValues
();
i
++
)
for
(
int
j
=
0
;
j
<
i
;
j
++
)
expressions
[
"float dV"
+
intToString
(
i
)
+
"dV"
+
intToString
(
j
)
+
" = "
]
=
valueDerivExpressions
[
i
][
j
];
compute
<<
OpenCLExpressionUtilities
::
createExpressions
(
expressions
,
variables
,
functionDefinitions
,
"temp"
,
prefix
+
"functionParams"
);
// Record values.
compute
<<
"forceBuffers[index] = forceBuffers[index]+force;
\n
"
;
for
(
int
i
=
1
;
i
<
force
.
getNumComputedValues
();
i
++
)
{
compute
<<
"float totalDeriv"
<<
i
<<
" = dV"
<<
i
<<
"dV0"
;
for
(
int
j
=
1
;
j
<
i
;
j
++
)
compute
<<
" + totalDeriv"
<<
j
<<
"*dV"
<<
i
<<
"dV"
<<
j
;
compute
<<
";
\n
"
;
compute
<<
"deriv"
<<
(
i
+
1
)
<<
" *= totalDeriv"
<<
i
<<
";
\n
"
;
}
compute
<<
OpenCLExpressionUtilities
::
createExpressions
(
energyExpressions
,
variables
,
functionDefinitions
,
"temp"
,
prefix
+
"functionParams"
);
for
(
int
i
=
0
;
i
<
(
int
)
energyDerivs
->
getBuffers
().
size
();
i
++
)
{
string
index
=
intToString
(
i
+
1
);
compute
<<
"derivBuffers"
<<
index
<<
"[index] = deriv"
<<
index
<<
";
\n
"
;
}
compute
<<
"forceBuffers[index] = forceBuffers[index]+force;
\n
"
;
map
<
string
,
string
>
replacements
;
replacements
[
"PARAMETER_ARGUMENTS"
]
=
extraArgs
.
str
()
+
tableArgs
.
str
();
replacements
[
"REDUCE_DERIVATIVES"
]
=
reduce
.
str
();
...
...
@@ -2333,76 +2375,45 @@ void OpenCLCalcCustomGBForceKernel::initialize(const System& system, const Custo
derivExpressions
[
"float dV0dR1 = "
]
=
dVdR
;
derivExpressions
[
"float dV0dR2 = "
]
=
dVdR
.
renameVariables
(
rename
);
chainSource
<<
OpenCLExpressionUtilities
::
createExpressions
(
derivExpressions
,
variables
,
functionDefinitions
,
prefix
+
"temp0_"
,
prefix
+
"functionParams"
);
if
(
needChainForValue
[
0
])
{
if
(
useExclusionsForValue
)
chainSource
<<
"if (!isExcluded) {
\n
"
;
chainSource
<<
"tempForce -= dV0dR1*"
<<
prefix
<<
"dEdV"
<<
energyDerivs
->
getParameterSuffix
(
0
,
"1"
)
<<
";
\n
"
;
chainSource
<<
"tempForce -= dV0dR2*"
<<
prefix
<<
"dEdV"
<<
energyDerivs
->
getParameterSuffix
(
0
,
"2"
)
<<
";
\n
"
;
if
(
useExclusionsForValue
)
chainSource
<<
"}
\n
"
;
variables
=
globalVariables
;
map
<
string
,
string
>
rename1
;
map
<
string
,
string
>
rename2
;
variables
.
push_back
(
makeVariable
(
"x1"
,
"posq1.x"
));
variables
.
push_back
(
makeVariable
(
"y1"
,
"posq1.y"
));
variables
.
push_back
(
makeVariable
(
"z1"
,
"posq1.z"
));
variables
.
push_back
(
makeVariable
(
"x2"
,
"posq2.x"
));
variables
.
push_back
(
makeVariable
(
"y2"
,
"posq2.y"
));
variables
.
push_back
(
makeVariable
(
"z2"
,
"posq2.z"
));
rename1
[
"x"
]
=
"x1"
;
rename1
[
"y"
]
=
"y1"
;
rename1
[
"z"
]
=
"z1"
;
rename2
[
"x"
]
=
"x2"
;
rename2
[
"y"
]
=
"y2"
;
rename2
[
"z"
]
=
"z2"
;
for
(
int
i
=
0
;
i
<
force
.
getNumPerParticleParameters
();
i
++
)
{
const
string
&
name
=
force
.
getPerParticleParameterName
(
i
);
variables
.
push_back
(
makeVariable
(
name
+
"1"
,
prefix
+
"params"
+
params
->
getParameterSuffix
(
i
,
"1"
)));
variables
.
push_back
(
makeVariable
(
name
+
"2"
,
prefix
+
"params"
+
params
->
getParameterSuffix
(
i
,
"2"
)));
rename1
[
name
]
=
name
+
"1"
;
rename2
[
name
]
=
name
+
"2"
;
}
for
(
int
i
=
0
;
i
<
force
.
getNumComputedValues
();
i
++
)
{
const
string
&
name
=
computedValueNames
[
i
];
variables
.
push_back
(
makeVariable
(
name
+
"1"
,
prefix
+
"values"
+
computedValues
->
getParameterSuffix
(
i
,
"1"
)));
variables
.
push_back
(
makeVariable
(
name
+
"2"
,
prefix
+
"values"
+
computedValues
->
getParameterSuffix
(
i
,
"2"
)));
rename1
[
name
]
=
name
+
"1"
;
rename2
[
name
]
=
name
+
"2"
;
if
(
i
==
0
)
continue
;
string
is
=
intToString
(
i
);
chainSource
<<
"float dV"
+
is
+
"dR1 = 0;
\n
"
;
chainSource
<<
"float dV"
+
is
+
"dR2 = 0;
\n
"
;
for
(
int
j
=
0
;
j
<
i
;
j
++
)
{
string
js
=
intToString
(
j
);
Lepton
::
ParsedExpression
dVdV
=
Lepton
::
Parser
::
parse
(
computedValueExpressions
[
i
],
functions
).
differentiate
(
computedValueNames
[
j
]).
optimize
();
derivExpressions
.
clear
();
derivExpressions
[
"dV"
+
is
+
"dR1 += dV"
+
js
+
"dR1*"
]
=
dVdV
.
renameVariables
(
rename1
);
derivExpressions
[
"dV"
+
is
+
"dR2 += dV"
+
js
+
"dR2*"
]
=
dVdV
.
renameVariables
(
rename2
);
chainSource
<<
OpenCLExpressionUtilities
::
createExpressions
(
derivExpressions
,
variables
,
functionDefinitions
,
prefix
+
"temp"
+
is
+
"_"
+
js
+
"_"
,
prefix
+
"functionParams"
);
for
(
int
i
=
1
;
i
<
force
.
getNumComputedValues
();
i
++
)
{
if
(
needChainForValue
[
i
])
{
chainSource
<<
"tempForce -= dV0dR1*"
<<
prefix
<<
"dEdV"
<<
energyDerivs
->
getParameterSuffix
(
i
,
"1"
)
<<
";
\n
"
;
chainSource
<<
"tempForce -= dV0dR2*"
<<
prefix
<<
"dEdV"
<<
energyDerivs
->
getParameterSuffix
(
i
,
"2"
)
<<
";
\n
"
;
}
chainSource
<<
"tempForce -= dV"
<<
is
<<
"dR1*"
<<
prefix
<<
"dEdV"
<<
energyDerivs
->
getParameterSuffix
(
i
,
"1"
)
<<
";
\n
"
;
chainSource
<<
"tempForce -= dV"
<<
is
<<
"dR2*"
<<
prefix
<<
"dEdV"
<<
energyDerivs
->
getParameterSuffix
(
i
,
"2"
)
<<
";
\n
"
;
}
map
<
string
,
string
>
replacements
;
replacements
[
"COMPUTE_FORCE"
]
=
chainSource
.
str
();
string
chainStr
=
chainSource
.
str
();
replacements
[
"COMPUTE_FORCE"
]
=
chainStr
;
string
source
=
cl
.
replaceStrings
(
OpenCLKernelSources
::
customGBChainRule
,
replacements
);
vector
<
OpenCLNonbondedUtilities
::
ParameterInfo
>
parameters
;
vector
<
OpenCLNonbondedUtilities
::
ParameterInfo
>
arguments
;
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
string
paramName
=
prefix
+
"params"
+
intToString
(
i
+
1
);
if
(
chainStr
.
find
(
paramName
+
"1"
)
!=
chainStr
.
npos
||
chainStr
.
find
(
paramName
+
"2"
)
!=
chainStr
.
npos
)
parameters
.
push_back
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
paramName
,
buffer
.
getComponentType
(),
buffer
.
getNumComponents
(),
buffer
.
getSize
(),
buffer
.
getMemory
()));
}
for
(
int
i
=
0
;
i
<
(
int
)
computedValues
->
getBuffers
().
size
();
i
++
)
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
computedValues
->
getBuffers
()[
i
];
string
paramName
=
prefix
+
"values"
+
intToString
(
i
+
1
);
if
(
chainStr
.
find
(
paramName
+
"1"
)
!=
chainStr
.
npos
||
chainStr
.
find
(
paramName
+
"2"
)
!=
chainStr
.
npos
)
parameters
.
push_back
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
paramName
,
buffer
.
getComponentType
(),
buffer
.
getNumComponents
(),
buffer
.
getSize
(),
buffer
.
getMemory
()));
}
for
(
int
i
=
0
;
i
<
(
int
)
energyDerivs
->
getBuffers
().
size
();
i
++
)
{
if
(
needChainForValue
[
i
])
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
energyDerivs
->
getBuffers
()[
i
];
string
paramName
=
prefix
+
"dEdV"
+
intToString
(
i
+
1
);
parameters
.
push_back
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
paramName
,
buffer
.
getComponentType
(),
buffer
.
getNumComponents
(),
buffer
.
getSize
(),
buffer
.
getMemory
()));
}
}
if
(
globals
!=
NULL
)
{
globals
->
upload
(
globalParamValues
);
arguments
.
push_back
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
prefix
+
"globals"
,
"float"
,
1
,
sizeof
(
cl_float
),
globals
->
getDeviceBuffer
()));
...
...
@@ -2465,10 +2476,12 @@ double OpenCLCalcCustomGBForceKernel::execute(ContextImpl& context, bool include
if
(
globals
!=
NULL
)
pairValueKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
if
(
pairValueUsesParam
[
i
])
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
pairValueKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
getMemory
());
pairValueKernel
.
setArg
(
index
++
,
(
deviceIsCpu
?
OpenCLContext
::
TileSize
:
nb
.
getForceThreadBlockSize
())
*
buffer
.
getSize
(),
NULL
);
}
}
if
(
tabulatedFunctionParams
!=
NULL
)
{
for
(
int
i
=
0
;
i
<
(
int
)
tabulatedFunctions
.
size
();
i
++
)
pairValueKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
tabulatedFunctions
[
i
]
->
getDeviceBuffer
());
...
...
@@ -2515,15 +2528,19 @@ double OpenCLCalcCustomGBForceKernel::execute(ContextImpl& context, bool include
if
(
globals
!=
NULL
)
pairEnergyKernel
.
setArg
<
cl
::
Buffer
>
(
index
++
,
globals
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
(
int
)
params
->
getBuffers
().
size
();
i
++
)
{
if
(
pairEnergyUsesParam
[
i
])
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
params
->
getBuffers
()[
i
];
pairEnergyKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
getMemory
());
pairEnergyKernel
.
setArg
(
index
++
,
(
deviceIsCpu
?
OpenCLContext
::
TileSize
:
nb
.
getForceThreadBlockSize
())
*
buffer
.
getSize
(),
NULL
);
}
}
for
(
int
i
=
0
;
i
<
(
int
)
computedValues
->
getBuffers
().
size
();
i
++
)
{
if
(
pairEnergyUsesValue
[
i
])
{
const
OpenCLNonbondedUtilities
::
ParameterInfo
&
buffer
=
computedValues
->
getBuffers
()[
i
];
pairEnergyKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
buffer
.
getMemory
());
pairEnergyKernel
.
setArg
(
index
++
,
(
deviceIsCpu
?
OpenCLContext
::
TileSize
:
nb
.
getForceThreadBlockSize
())
*
buffer
.
getSize
(),
NULL
);
}
}
if
(
useLong
)
{
pairEnergyKernel
.
setArg
<
cl
::
Memory
>
(
index
++
,
longEnergyDerivs
->
getDeviceBuffer
());
for
(
int
i
=
0
;
i
<
numComputedValues
;
++
i
)
...
...
platforms/opencl/src/OpenCLKernels.h
View file @
0c4af105
...
...
@@ -687,6 +687,7 @@ private:
std
::
vector
<
std
::
string
>
globalParamNames
;
std
::
vector
<
cl_float
>
globalParamValues
;
std
::
vector
<
OpenCLArray
<
mm_float4
>*>
tabulatedFunctions
;
std
::
vector
<
bool
>
pairValueUsesParam
,
pairEnergyUsesParam
,
pairEnergyUsesValue
;
System
&
system
;
cl
::
Kernel
pairValueKernel
,
perParticleValueKernel
,
pairEnergyKernel
,
perParticleEnergyKernel
,
gradientChainRuleKernel
;
};
...
...
platforms/opencl/src/OpenCLParameterSet.cpp
View file @
0c4af105
...
...
@@ -32,11 +32,12 @@
using
namespace
OpenMM
;
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
)
{
int
params
=
numParameters
;
int
bufferCount
=
0
;
try
{
if
(
!
bufferPerParameter
)
{
while
(
params
>
2
)
{
cl
::
Buffer
*
buf
=
new
cl
::
Buffer
(
context
.
getContext
(),
CL_MEM_READ_WRITE
,
numObjects
*
sizeof
(
mm_float4
));
std
::
stringstream
name
;
...
...
@@ -51,11 +52,13 @@ OpenCLParameterSet::OpenCLParameterSet(OpenCLContext& context, int numParameters
buffers
.
push_back
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
name
.
str
(),
"float"
,
2
,
sizeof
(
mm_float2
),
*
buf
));
params
-=
2
;
}
if
(
params
>
0
)
{
}
while
(
params
>
0
)
{
cl
::
Buffer
*
buf
=
new
cl
::
Buffer
(
context
.
getContext
(),
CL_MEM_READ_WRITE
,
numObjects
*
sizeof
(
cl_float
));
std
::
stringstream
name
;
name
<<
"param"
<<
(
++
bufferCount
);
buffers
.
push_back
(
OpenCLNonbondedUtilities
::
ParameterInfo
(
name
.
str
(),
"float"
,
1
,
sizeof
(
cl_float
),
*
buf
));
params
--
;
}
}
catch
(
cl
::
Error
err
)
{
...
...
@@ -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
]);
for
(
int
j
=
0
;
j
<
numObjects
;
j
++
)
values
[
j
][
base
]
=
data
[
j
];
base
++
;
}
else
throw
OpenMMException
(
"Internal error: Unknown buffer type in OpenCLParameterSet"
);
...
...
@@ -151,6 +155,7 @@ void OpenCLParameterSet::setParameterValues(const vector<vector<cl_float> >& val
for
(
int
j
=
0
;
j
<
numObjects
;
j
++
)
data
[
j
]
=
values
[
j
][
base
];
context
.
getQueue
().
enqueueWriteBuffer
(
reinterpret_cast
<
cl
::
Buffer
&>
(
buffers
[
i
].
getMemory
()),
CL_TRUE
,
0
,
numObjects
*
buffers
[
i
].
getSize
(),
&
data
[
0
]);
base
++
;
}
else
throw
OpenMMException
(
"Internal error: Unknown buffer type in OpenCLParameterSet"
);
...
...
platforms/opencl/src/OpenCLParameterSet.h
View file @
0c4af105
...
...
@@ -49,8 +49,10 @@ public:
* @param numParameters the number of parameters for each object
* @param numObjects the number of objects to store parameter values for
* @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
();
/**
* Get the number of parameters.
...
...
platforms/opencl/src/kernels/customGBEnergyPerParticle.cl
View file @
0c4af105
#
define
REDUCE_VALUE
(
NAME,
TYPE
)
\
#
define
REDUCE_VALUE
(
NAME,
TYPE
)
{
\
TYPE
sum
=
NAME[index]
; \
for
(
int
i
=
index+bufferSize
; i < totalSize; i += bufferSize) \
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.
...
...
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