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
73c0da63
"...reference/tests/TestReferenceCustomExternalForce.cpp" did not exist on "3eb561ad211cf8fbcca9e28ac90aa9dacdda42c1"
Commit
73c0da63
authored
Aug 21, 2009
by
Peter Eastman
Browse files
Implemented tabulated functions in CUDA platform
parent
2eff991e
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
183 additions
and
9 deletions
+183
-9
libraries/lepton/include/lepton/Operation.h
libraries/lepton/include/lepton/Operation.h
+3
-0
platforms/cuda/src/CudaKernels.cpp
platforms/cuda/src/CudaKernels.cpp
+11
-0
platforms/cuda/src/kernels/cudatypes.h
platforms/cuda/src/kernels/cudatypes.h
+4
-1
platforms/cuda/src/kernels/gpu.cpp
platforms/cuda/src/kernels/gpu.cpp
+99
-4
platforms/cuda/src/kernels/gputypes.h
platforms/cuda/src/kernels/gputypes.h
+11
-0
platforms/cuda/src/kernels/kCalculateCustomNonbondedForces.cu
...forms/cuda/src/kernels/kCalculateCustomNonbondedForces.cu
+17
-0
platforms/cuda/tests/TestCudaCustomNonbondedForce.cpp
platforms/cuda/tests/TestCudaCustomNonbondedForce.cpp
+34
-0
platforms/reference/src/ReferenceKernels.cpp
platforms/reference/src/ReferenceKernels.cpp
+4
-4
No files found.
libraries/lepton/include/lepton/Operation.h
View file @
73c0da63
...
@@ -211,6 +211,9 @@ public:
...
@@ -211,6 +211,9 @@ public:
return
function
->
evaluate
(
args
);
return
function
->
evaluate
(
args
);
}
}
ExpressionTreeNode
differentiate
(
const
std
::
vector
<
ExpressionTreeNode
>&
children
,
const
std
::
vector
<
ExpressionTreeNode
>&
childDerivs
,
const
std
::
string
&
variable
)
const
;
ExpressionTreeNode
differentiate
(
const
std
::
vector
<
ExpressionTreeNode
>&
children
,
const
std
::
vector
<
ExpressionTreeNode
>&
childDerivs
,
const
std
::
string
&
variable
)
const
;
const
std
::
vector
<
int
>&
getDerivOrder
()
const
{
return
derivOrder
;
}
private:
private:
std
::
string
name
;
std
::
string
name
;
CustomFunction
*
function
;
CustomFunction
*
function
;
...
...
platforms/cuda/src/CudaKernels.cpp
View file @
73c0da63
...
@@ -423,6 +423,17 @@ void CudaCalcCustomNonbondedForceKernel::initialize(const System& system, const
...
@@ -423,6 +423,17 @@ void CudaCalcCustomNonbondedForceKernel::initialize(const System& system, const
for
(
int
i
=
0
;
i
<
numExceptions
;
i
++
)
for
(
int
i
=
0
;
i
<
numExceptions
;
i
++
)
force
.
getExceptionParameters
(
exceptions
[
i
],
exceptionParticle1
[
i
],
exceptionParticle2
[
i
],
exceptionParams
[
i
]);
force
.
getExceptionParameters
(
exceptions
[
i
],
exceptionParticle1
[
i
],
exceptionParticle2
[
i
],
exceptionParams
[
i
]);
// Record the tabulated functions.
for
(
int
i
=
0
;
i
<
force
.
getNumFunctions
();
i
++
)
{
string
name
;
vector
<
double
>
values
;
double
min
,
max
;
bool
interpolating
;
force
.
getFunctionParameters
(
i
,
name
,
values
,
min
,
max
,
interpolating
);
gpuSetTabulatedFunction
(
gpu
,
i
,
name
,
values
,
min
,
max
,
interpolating
);
}
// Record information for the expressions.
// Record information for the expressions.
vector
<
string
>
paramNames
;
vector
<
string
>
paramNames
;
...
...
platforms/cuda/src/kernels/cudatypes.h
View file @
73c0da63
...
@@ -232,6 +232,7 @@ static const int GT2XX_RANDOM_THREADS_PER_BLOCK = 384;
...
@@ -232,6 +232,7 @@ static const int GT2XX_RANDOM_THREADS_PER_BLOCK = 384;
static
const
int
G8X_NONBOND_WORKUNITS_PER_SM
=
220
;
static
const
int
G8X_NONBOND_WORKUNITS_PER_SM
=
220
;
static
const
int
GT2XX_NONBOND_WORKUNITS_PER_SM
=
256
;
static
const
int
GT2XX_NONBOND_WORKUNITS_PER_SM
=
256
;
static
const
unsigned
int
MAX_STACK_SIZE
=
8
;
static
const
unsigned
int
MAX_STACK_SIZE
=
8
;
static
const
unsigned
int
MAX_TABULATED_FUNCTIONS
=
8
;
static
const
float
PI
=
3.14159265358979323846
f
;
static
const
float
PI
=
3.14159265358979323846
f
;
...
@@ -244,7 +245,7 @@ enum CudaNonbondedMethod
...
@@ -244,7 +245,7 @@ enum CudaNonbondedMethod
};
};
enum
ExpressionOp
{
enum
ExpressionOp
{
CONSTANT
=
0
,
VARIABLE0
,
VARIABLE1
,
VARIABLE2
,
VARIABLE3
,
VARIABLE4
,
VARIABLE5
,
VARIABLE6
,
VARIABLE7
,
VARIABLE8
,
GLOBAL
,
CUSTOM
,
ADD
,
SUBTRACT
,
MULTIPLY
,
DIVIDE
,
CONSTANT
=
0
,
VARIABLE0
,
VARIABLE1
,
VARIABLE2
,
VARIABLE3
,
VARIABLE4
,
VARIABLE5
,
VARIABLE6
,
VARIABLE7
,
VARIABLE8
,
GLOBAL
,
CUSTOM
,
CUSTOM_DERIV
,
ADD
,
SUBTRACT
,
MULTIPLY
,
DIVIDE
,
POWER
,
NEGATE
,
SQRT
,
EXP
,
LOG
,
SIN
,
COS
,
SEC
,
CSC
,
TAN
,
COT
,
ASIN
,
ACOS
,
ATAN
,
SQUARE
,
CUBE
,
RECIPROCAL
,
ADD_CONSTANT
,
MULTIPLY_CONSTANT
,
POWER_CONSTANT
POWER
,
NEGATE
,
SQRT
,
EXP
,
LOG
,
SIN
,
COS
,
SEC
,
CSC
,
TAN
,
COT
,
ASIN
,
ACOS
,
ATAN
,
SQUARE
,
CUBE
,
RECIPROCAL
,
ADD_CONSTANT
,
MULTIPLY_CONSTANT
,
POWER_CONSTANT
};
};
...
@@ -350,6 +351,8 @@ struct cudaGmxSimulation {
...
@@ -350,6 +351,8 @@ struct cudaGmxSimulation {
float4
*
pCustomExceptionParams
;
// Parameters for custom nonbonded exceptions
float4
*
pCustomExceptionParams
;
// Parameters for custom nonbonded exceptions
unsigned
int
customExceptions
;
// Number of custom nonbonded exceptions
unsigned
int
customExceptions
;
// Number of custom nonbonded exceptions
unsigned
int
customParameters
;
// Number of parameters for custom nonbonded interactions
unsigned
int
customParameters
;
// Number of parameters for custom nonbonded interactions
float4
*
pTabulatedFunctionCoefficients
[
MAX_TABULATED_FUNCTIONS
];
// The spline coefficients for each tabulated function
float4
*
pTabulatedFunctionParams
;
// The min, max, and spacing for each tabulated function
float2
*
pEwaldCosSinSum
;
// Pointer to the cos/sin sums (ewald)
float2
*
pEwaldCosSinSum
;
// Pointer to the cos/sin sums (ewald)
unsigned
int
bonds
;
// Number of bonds
unsigned
int
bonds
;
// Number of bonds
int4
*
pBondID
;
// Bond atom and output buffer IDs
int4
*
pBondID
;
// Bond atom and output buffer IDs
...
...
platforms/cuda/src/kernels/gpu.cpp
View file @
73c0da63
...
@@ -133,7 +133,7 @@ static const float BOLTZ = (RGAS / KILO); // (k
...
@@ -133,7 +133,7 @@ static const float BOLTZ = (RGAS / KILO); // (k
#define DUMP_PARAMETERS 0
#define DUMP_PARAMETERS 0
template
<
int
SIZE
>
template
<
int
SIZE
>
static
Expression
<
SIZE
>
createExpression
(
const
string
&
expression
,
const
Lepton
::
ExpressionProgram
&
program
,
const
vector
<
string
>&
variables
,
static
Expression
<
SIZE
>
createExpression
(
gpuContext
gpu
,
const
string
&
expression
,
const
Lepton
::
ExpressionProgram
&
program
,
const
vector
<
string
>&
variables
,
const
vector
<
string
>&
globalParamNames
,
unsigned
int
&
maxStackSize
)
{
const
vector
<
string
>&
globalParamNames
,
unsigned
int
&
maxStackSize
)
{
Expression
<
SIZE
>
exp
;
Expression
<
SIZE
>
exp
;
if
(
program
.
getNumOperations
()
>
SIZE
)
if
(
program
.
getNumOperations
()
>
SIZE
)
...
@@ -177,6 +177,14 @@ static Expression<SIZE> createExpression(const string& expression, const Lepton:
...
@@ -177,6 +177,14 @@ static Expression<SIZE> createExpression(const string& expression, const Lepton:
exp
.
arg
[
i
]
=
j
;
exp
.
arg
[
i
]
=
j
;
}
}
break
;
break
;
case
Operation
::
CUSTOM
:
exp
.
op
[
i
]
=
dynamic_cast
<
const
Operation
::
Custom
*>
(
&
op
)
->
getDerivOrder
()[
0
]
==
0
?
CUSTOM
:
CUSTOM_DERIV
;
for
(
int
j
=
0
;
j
<
MAX_TABULATED_FUNCTIONS
;
j
++
)
if
(
op
.
getName
()
==
gpu
->
tabulatedFunctions
[
j
].
name
)
{
exp
.
arg
[
i
]
=
j
;
break
;
}
break
;
case
Operation
::
ADD
:
case
Operation
::
ADD
:
exp
.
op
[
i
]
=
ADD
;
exp
.
op
[
i
]
=
ADD
;
break
;
break
;
...
@@ -573,6 +581,52 @@ void gpuSetNonbondedCutoff(gpuContext gpu, float cutoffDistance, float solventDi
...
@@ -573,6 +581,52 @@ void gpuSetNonbondedCutoff(gpuContext gpu, float cutoffDistance, float solventDi
gpu
->
sim
.
reactionFieldC
=
(
1.0
f
/
cutoffDistance
)
*
(
3.0
f
*
solventDielectric
)
/
(
2.0
f
*
solventDielectric
+
1.0
f
);
gpu
->
sim
.
reactionFieldC
=
(
1.0
f
/
cutoffDistance
)
*
(
3.0
f
*
solventDielectric
)
/
(
2.0
f
*
solventDielectric
+
1.0
f
);
}
}
extern
"C"
void
gpuSetTabulatedFunction
(
gpuContext
gpu
,
int
index
,
const
string
&
name
,
const
vector
<
double
>&
values
,
double
min
,
double
max
,
bool
interpolating
)
{
if
(
index
<
0
||
index
>=
MAX_TABULATED_FUNCTIONS
)
{
stringstream
str
;
str
<<
"Only "
<<
MAX_TABULATED_FUNCTIONS
<<
" tabulated functions are supported"
;
throw
OpenMMException
(
str
.
str
());
}
if
(
gpu
->
tabulatedFunctions
[
index
].
coefficients
!=
NULL
)
delete
gpu
->
tabulatedFunctions
[
index
].
coefficients
;
CUDAStream
<
float4
>*
coeff
=
new
CUDAStream
<
float4
>
((
int
)
values
.
size
()
-
1
,
1
,
"TabulatedFunction"
);
gpu
->
tabulatedFunctions
[
index
].
coefficients
=
coeff
;
gpu
->
sim
.
pTabulatedFunctionCoefficients
[
index
]
=
coeff
->
_pDevData
;
gpu
->
tabulatedFunctions
[
index
].
name
=
name
;
gpu
->
tabulatedFunctions
[
index
].
min
=
min
;
gpu
->
tabulatedFunctions
[
index
].
max
=
max
;
// First create a padded set of function values.
vector
<
double
>
padded
(
values
.
size
()
+
2
);
padded
[
0
]
=
2
*
values
[
0
]
-
values
[
1
];
for
(
int
i
=
0
;
i
<
(
int
)
values
.
size
();
i
++
)
padded
[
i
+
1
]
=
values
[
i
];
padded
[
padded
.
size
()
-
1
]
=
2
*
values
[
values
.
size
()
-
1
]
-
values
[
values
.
size
()
-
2
];
// Now compute the spline coefficients.
for
(
int
i
=
0
;
i
<
(
int
)
values
.
size
()
-
1
;
i
++
)
{
float4
c
;
if
(
interpolating
)
{
c
.
x
=
padded
[
i
+
1
];
c
.
y
=
0.5
*
(
-
padded
[
i
]
+
padded
[
i
+
2
]);
c
.
z
=
0.5
*
(
2.0
*
padded
[
i
]
-
5.0
*
padded
[
i
+
1
]
+
4.0
*
padded
[
i
+
2
]
-
padded
[
i
+
3
]);
c
.
w
=
0.5
*
(
-
padded
[
i
]
+
3.0
*
padded
[
i
+
1
]
-
3.0
*
padded
[
i
+
2
]
+
padded
[
i
+
3
]);
}
else
{
c
.
x
=
(
padded
[
i
]
+
4.0
*
padded
[
i
+
1
]
+
padded
[
i
+
2
])
/
6.0
;
c
.
y
=
(
-
3.0
*
padded
[
i
]
+
3.0
*
padded
[
i
+
2
])
/
6.0
;
c
.
z
=
(
3.0
*
padded
[
i
]
-
6.0
*
padded
[
i
+
1
]
+
3.0
*
padded
[
i
+
2
])
/
6.0
;
c
.
w
=
(
-
padded
[
i
]
+
3.0
*
padded
[
i
+
1
]
-
3.0
*
padded
[
i
+
2
]
+
padded
[
i
+
3
])
/
6.0
;
}
(
*
coeff
)[
i
]
=
c
;
}
coeff
->
Upload
();
}
extern
"C"
extern
"C"
void
gpuSetCustomNonbondedParameters
(
gpuContext
gpu
,
const
vector
<
vector
<
double
>
>&
parameters
,
const
vector
<
vector
<
int
>
>&
exclusions
,
void
gpuSetCustomNonbondedParameters
(
gpuContext
gpu
,
const
vector
<
vector
<
double
>
>&
parameters
,
const
vector
<
vector
<
int
>
>&
exclusions
,
const
vector
<
int
>&
exceptionAtom1
,
const
vector
<
int
>&
exceptionAtom2
,
const
vector
<
vector
<
double
>
>&
exceptionParams
,
const
vector
<
int
>&
exceptionAtom1
,
const
vector
<
int
>&
exceptionAtom2
,
const
vector
<
vector
<
double
>
>&
exceptionParams
,
...
@@ -630,6 +684,39 @@ void gpuSetCustomNonbondedParameters(gpuContext gpu, const vector<vector<double>
...
@@ -630,6 +684,39 @@ void gpuSetCustomNonbondedParameters(gpuContext gpu, const vector<vector<double>
gpu
->
psCustomExceptionID
->
Upload
();
gpu
->
psCustomExceptionID
->
Upload
();
gpu
->
psCustomExceptionParams
->
Upload
();
gpu
->
psCustomExceptionParams
->
Upload
();
// This class serves as a placeholder for custom functions in expressions.
class
FunctionPlaceholder
:
public
Lepton
::
CustomFunction
{
public:
int
getNumArguments
()
const
{
return
1
;
}
double
evaluate
(
const
double
*
arguments
)
const
{
return
0.0
;
}
double
evaluateDerivative
(
const
double
*
arguments
,
const
int
*
derivOrder
)
const
{
return
0.0
;
}
CustomFunction
*
clone
()
const
{
return
new
FunctionPlaceholder
();
}
};
// Record the tabulated functions, which were previously set with calls to gpuSetTabulatedFunction().
FunctionPlaceholder
*
fp
=
new
FunctionPlaceholder
();
map
<
string
,
Lepton
::
CustomFunction
*>
functions
;
gpu
->
psTabulatedFunctionParams
=
new
CUDAStream
<
float4
>
(
MAX_TABULATED_FUNCTIONS
,
1
,
"TabulatedFunctionRange"
);
gpu
->
sim
.
pTabulatedFunctionParams
=
gpu
->
psTabulatedFunctionParams
->
_pDevData
;
for
(
int
i
=
0
;
i
<
MAX_TABULATED_FUNCTIONS
;
i
++
)
{
gpuTabulatedFunction
&
func
=
gpu
->
tabulatedFunctions
[
i
];
if
(
func
.
coefficients
!=
NULL
)
{
(
*
gpu
->
psTabulatedFunctionParams
)[
i
]
=
make_float4
(
func
.
min
,
func
.
max
,
func
.
coefficients
->
_length
/
(
func
.
max
-
func
.
min
),
0.0
f
);
functions
[
func
.
name
]
=
fp
;
}
}
gpu
->
psTabulatedFunctionParams
->
Upload
();
// Create the Expressions.
// Create the Expressions.
vector
<
string
>
variables
;
vector
<
string
>
variables
;
...
@@ -637,8 +724,8 @@ void gpuSetCustomNonbondedParameters(gpuContext gpu, const vector<vector<double>
...
@@ -637,8 +724,8 @@ void gpuSetCustomNonbondedParameters(gpuContext gpu, const vector<vector<double>
for
(
int
i
=
0
;
i
<
paramNames
.
size
();
i
++
)
for
(
int
i
=
0
;
i
<
paramNames
.
size
();
i
++
)
variables
.
push_back
(
paramNames
[
i
]);
variables
.
push_back
(
paramNames
[
i
]);
gpu
->
sim
.
customExpressionStackSize
=
0
;
gpu
->
sim
.
customExpressionStackSize
=
0
;
SetCustomNonbondedEnergyExpression
(
createExpression
<
128
>
(
energyExp
,
Lepton
::
Parser
::
parse
(
energyExp
).
optimize
().
createProgram
(),
variables
,
globalParamNames
,
gpu
->
sim
.
customExpressionStackSize
));
SetCustomNonbondedEnergyExpression
(
createExpression
<
128
>
(
gpu
,
energyExp
,
Lepton
::
Parser
::
parse
(
energyExp
,
functions
).
optimize
().
createProgram
(),
variables
,
globalParamNames
,
gpu
->
sim
.
customExpressionStackSize
));
SetCustomNonbondedForceExpression
(
createExpression
<
128
>
(
energyExp
,
Lepton
::
Parser
::
parse
(
energyExp
).
differentiate
(
"r"
).
optimize
().
createProgram
(),
variables
,
globalParamNames
,
gpu
->
sim
.
customExpressionStackSize
));
SetCustomNonbondedForceExpression
(
createExpression
<
128
>
(
gpu
,
energyExp
,
Lepton
::
Parser
::
parse
(
energyExp
,
functions
).
differentiate
(
"r"
).
optimize
().
createProgram
(),
variables
,
globalParamNames
,
gpu
->
sim
.
customExpressionStackSize
));
Expression
<
64
>
paramExpressions
[
4
];
Expression
<
64
>
paramExpressions
[
4
];
vector
<
string
>
combiningRuleParams
;
vector
<
string
>
combiningRuleParams
;
combiningRuleParams
.
push_back
(
""
);
combiningRuleParams
.
push_back
(
""
);
...
@@ -652,8 +739,9 @@ void gpuSetCustomNonbondedParameters(gpuContext gpu, const vector<vector<double>
...
@@ -652,8 +739,9 @@ void gpuSetCustomNonbondedParameters(gpuContext gpu, const vector<vector<double>
combiningRuleParams
.
push_back
(
""
);
combiningRuleParams
.
push_back
(
""
);
}
}
for
(
int
i
=
0
;
i
<
paramNames
.
size
();
i
++
)
for
(
int
i
=
0
;
i
<
paramNames
.
size
();
i
++
)
paramExpressions
[
i
]
=
createExpression
<
64
>
(
combiningRules
[
i
],
Lepton
::
Parser
::
parse
(
combiningRules
[
i
]).
optimize
().
createProgram
(),
combiningRuleParams
,
globalParamNames
,
gpu
->
sim
.
customExpressionStackSize
);
paramExpressions
[
i
]
=
createExpression
<
64
>
(
gpu
,
combiningRules
[
i
],
Lepton
::
Parser
::
parse
(
combiningRules
[
i
]
,
functions
).
optimize
().
createProgram
(),
combiningRuleParams
,
globalParamNames
,
gpu
->
sim
.
customExpressionStackSize
);
SetCustomNonbondedCombiningRules
(
paramExpressions
);
SetCustomNonbondedCombiningRules
(
paramExpressions
);
delete
fp
;
}
}
extern
"C"
extern
"C"
...
@@ -1522,6 +1610,9 @@ void* gpuInit(int numAtoms, unsigned int device, bool useBlockingSync)
...
@@ -1522,6 +1610,9 @@ void* gpuInit(int numAtoms, unsigned int device, bool useBlockingSync)
gpu
->
psCcmaReducedMass
=
NULL
;
gpu
->
psCcmaReducedMass
=
NULL
;
gpu
->
psConstraintMatrixColumn
=
NULL
;
gpu
->
psConstraintMatrixColumn
=
NULL
;
gpu
->
psConstraintMatrixValue
=
NULL
;
gpu
->
psConstraintMatrixValue
=
NULL
;
gpu
->
psTabulatedFunctionParams
=
NULL
;
for
(
int
i
=
0
;
i
<
MAX_TABULATED_FUNCTIONS
;
i
++
)
gpu
->
tabulatedFunctions
[
i
].
coefficients
=
NULL
;
// Initialize output buffer before reading parameters
// Initialize output buffer before reading parameters
gpu
->
pOutputBufferCounter
=
new
unsigned
int
[
gpu
->
sim
.
paddedNumberOfAtoms
];
gpu
->
pOutputBufferCounter
=
new
unsigned
int
[
gpu
->
sim
.
paddedNumberOfAtoms
];
...
@@ -1705,6 +1796,10 @@ void gpuShutDown(gpuContext gpu)
...
@@ -1705,6 +1796,10 @@ void gpuShutDown(gpuContext gpu)
delete
gpu
->
psCcmaReducedMass
;
delete
gpu
->
psCcmaReducedMass
;
delete
gpu
->
psConstraintMatrixColumn
;
delete
gpu
->
psConstraintMatrixColumn
;
delete
gpu
->
psConstraintMatrixValue
;
delete
gpu
->
psConstraintMatrixValue
;
delete
gpu
->
psTabulatedFunctionParams
;
for
(
int
i
=
0
;
i
<
MAX_TABULATED_FUNCTIONS
;
i
++
)
if
(
gpu
->
tabulatedFunctions
[
i
].
coefficients
!=
NULL
)
delete
gpu
->
tabulatedFunctions
[
i
].
coefficients
;
if
(
gpu
->
cudpp
!=
0
)
if
(
gpu
->
cudpp
!=
0
)
cudppDestroyPlan
(
gpu
->
cudpp
);
cudppDestroyPlan
(
gpu
->
cudpp
);
...
...
platforms/cuda/src/kernels/gputypes.h
View file @
73c0da63
...
@@ -42,6 +42,12 @@ struct gpuMoleculeGroup {
...
@@ -42,6 +42,12 @@ struct gpuMoleculeGroup {
std
::
vector
<
int
>
instances
;
std
::
vector
<
int
>
instances
;
};
};
struct
gpuTabulatedFunction
{
std
::
string
name
;
double
min
,
max
;
CUDAStream
<
float4
>*
coefficients
;
};
enum
SM_VERSION
enum
SM_VERSION
{
{
SM_10
,
SM_10
,
...
@@ -67,6 +73,7 @@ struct _gpuContext {
...
@@ -67,6 +73,7 @@ struct _gpuContext {
std
::
vector
<
std
::
vector
<
int
>
>
exclusions
;
std
::
vector
<
std
::
vector
<
int
>
>
exclusions
;
unsigned
char
*
pAtomSymbol
;
unsigned
char
*
pAtomSymbol
;
std
::
vector
<
gpuMoleculeGroup
>
moleculeGroups
;
std
::
vector
<
gpuMoleculeGroup
>
moleculeGroups
;
gpuTabulatedFunction
tabulatedFunctions
[
MAX_TABULATED_FUNCTIONS
];
float
iterations
;
float
iterations
;
float
epsfac
;
float
epsfac
;
float
solventDielectric
;
float
solventDielectric
;
...
@@ -92,6 +99,7 @@ struct _gpuContext {
...
@@ -92,6 +99,7 @@ struct _gpuContext {
CUDAStream
<
float4
>*
psCustomParams
;
// Atom parameters for custom nonbonded force
CUDAStream
<
float4
>*
psCustomParams
;
// Atom parameters for custom nonbonded force
CUDAStream
<
int4
>*
psCustomExceptionID
;
// Atom indices for custom nonbonded exceptions
CUDAStream
<
int4
>*
psCustomExceptionID
;
// Atom indices for custom nonbonded exceptions
CUDAStream
<
float4
>*
psCustomExceptionParams
;
// Parameters for custom nonbonded exceptions
CUDAStream
<
float4
>*
psCustomExceptionParams
;
// Parameters for custom nonbonded exceptions
CUDAStream
<
float4
>*
psTabulatedFunctionParams
;
// The min, max, and spacing for each tabulated function
CUDAStream
<
float2
>*
psEwaldCosSinSum
;
CUDAStream
<
float2
>*
psEwaldCosSinSum
;
CUDAStream
<
float2
>*
psObcData
;
CUDAStream
<
float2
>*
psObcData
;
CUDAStream
<
float
>*
psObcChain
;
CUDAStream
<
float
>*
psObcChain
;
...
@@ -182,6 +190,9 @@ void gpuSetCoulombParameters(gpuContext gpu, float epsfac, const std::vector<int
...
@@ -182,6 +190,9 @@ void gpuSetCoulombParameters(gpuContext gpu, float epsfac, const std::vector<int
extern
"C"
extern
"C"
void
gpuSetNonbondedCutoff
(
gpuContext
gpu
,
float
cutoffDistance
,
float
solventDielectric
);
void
gpuSetNonbondedCutoff
(
gpuContext
gpu
,
float
cutoffDistance
,
float
solventDielectric
);
extern
"C"
void
gpuSetTabulatedFunction
(
gpuContext
gpu
,
int
index
,
const
std
::
string
&
name
,
const
std
::
vector
<
double
>&
values
,
double
min
,
double
max
,
bool
interpolating
);
extern
"C"
extern
"C"
void
gpuSetCustomNonbondedParameters
(
gpuContext
gpu
,
const
std
::
vector
<
std
::
vector
<
double
>
>&
parameters
,
const
std
::
vector
<
std
::
vector
<
int
>
>&
exclusions
,
void
gpuSetCustomNonbondedParameters
(
gpuContext
gpu
,
const
std
::
vector
<
std
::
vector
<
double
>
>&
parameters
,
const
std
::
vector
<
std
::
vector
<
int
>
>&
exclusions
,
const
std
::
vector
<
int
>&
exceptionAtom1
,
const
std
::
vector
<
int
>&
exceptionAtom2
,
const
std
::
vector
<
std
::
vector
<
double
>
>&
exceptionParams
,
const
std
::
vector
<
int
>&
exceptionAtom1
,
const
std
::
vector
<
int
>&
exceptionAtom2
,
const
std
::
vector
<
std
::
vector
<
double
>
>&
exceptionParams
,
...
...
platforms/cuda/src/kernels/kCalculateCustomNonbondedForces.cu
View file @
73c0da63
...
@@ -148,6 +148,23 @@ __device__ float kEvaluateExpression_kernel(Expression<SIZE>* expression, float*
...
@@ -148,6 +148,23 @@ __device__ float kEvaluateExpression_kernel(Expression<SIZE>* expression, float*
else
if
(
op
==
GLOBAL
)
{
else
if
(
op
==
GLOBAL
)
{
STACK
(
++
stackPointer
)
=
globalParams
[(
int
)
expression
->
arg
[
i
]];
STACK
(
++
stackPointer
)
=
globalParams
[(
int
)
expression
->
arg
[
i
]];
}
}
else
if
(
op
==
CUSTOM
||
op
==
CUSTOM_DERIV
)
{
int
function
=
(
int
)
expression
->
arg
[
i
];
float
x
=
STACK
(
stackPointer
);
float4
params
=
cSim
.
pTabulatedFunctionParams
[
function
];
if
(
x
<
params
.
x
||
x
>
params
.
y
)
STACK
(
stackPointer
)
=
0.0
f
;
else
{
int
index
=
floor
((
x
-
params
.
x
)
*
params
.
z
);
float4
coeff
=
cSim
.
pTabulatedFunctionCoefficients
[
function
][
index
];
x
=
(
x
-
params
.
x
)
*
params
.
z
-
index
;
if
(
op
==
CUSTOM
)
STACK
(
stackPointer
)
=
coeff
.
x
+
x
*
(
coeff
.
y
+
x
*
(
coeff
.
z
+
x
*
coeff
.
w
));
else
STACK
(
stackPointer
)
=
(
coeff
.
y
+
x
*
(
2.0
f
*
coeff
.
z
+
x
*
3.0
f
*
coeff
.
w
))
*
params
.
z
;
}
}
else
if
(
op
==
ADD
)
{
else
if
(
op
==
ADD
)
{
float
temp
=
STACK
(
stackPointer
);
float
temp
=
STACK
(
stackPointer
);
STACK
(
--
stackPointer
)
+=
temp
;
STACK
(
--
stackPointer
)
+=
temp
;
...
...
platforms/cuda/tests/TestCudaCustomNonbondedForce.cpp
View file @
73c0da63
...
@@ -202,6 +202,38 @@ void testPeriodic() {
...
@@ -202,6 +202,38 @@ void testPeriodic() {
ASSERT_EQUAL_TOL
(
1.9
+
1
+
0.9
,
state
.
getPotentialEnergy
(),
TOL
);
ASSERT_EQUAL_TOL
(
1.9
+
1
+
0.9
,
state
.
getPotentialEnergy
(),
TOL
);
}
}
void
testTabulatedFunction
(
bool
interpolating
)
{
CudaPlatform
platform
;
System
system
;
system
.
addParticle
(
1.0
);
system
.
addParticle
(
1.0
);
VerletIntegrator
integrator
(
0.01
);
CustomNonbondedForce
*
forceField
=
new
CustomNonbondedForce
(
"fn(r)+1"
);
forceField
->
addParticle
(
vector
<
double
>
());
forceField
->
addParticle
(
vector
<
double
>
());
vector
<
double
>
table
;
for
(
int
i
=
0
;
i
<
21
;
i
++
)
table
.
push_back
(
std
::
sin
(
0.25
*
i
));
forceField
->
addFunction
(
"fn"
,
table
,
1.0
,
6.0
,
interpolating
);
system
.
addForce
(
forceField
);
Context
context
(
system
,
integrator
,
platform
);
vector
<
Vec3
>
positions
(
2
);
positions
[
0
]
=
Vec3
(
0
,
0
,
0
);
double
tol
=
0.01
;
for
(
int
i
=
1
;
i
<
30
;
i
++
)
{
double
x
=
(
7.0
/
30.0
)
*
i
;
positions
[
1
]
=
Vec3
(
x
,
0
,
0
);
context
.
setPositions
(
positions
);
State
state
=
context
.
getState
(
State
::
Forces
|
State
::
Energy
);
const
vector
<
Vec3
>&
forces
=
state
.
getForces
();
double
force
=
(
x
<
1.0
||
x
>
6.0
?
0.0
:
-
std
::
cos
(
x
-
1.0
));
double
energy
=
(
x
<
1.0
||
x
>
6.0
?
0.0
:
std
::
sin
(
x
-
1.0
))
+
1.0
;
ASSERT_EQUAL_VEC
(
Vec3
(
-
force
,
0
,
0
),
forces
[
0
],
0.1
);
ASSERT_EQUAL_VEC
(
Vec3
(
force
,
0
,
0
),
forces
[
1
],
0.1
);
ASSERT_EQUAL_TOL
(
energy
,
state
.
getPotentialEnergy
(),
0.02
);
}
}
int
main
()
{
int
main
()
{
try
{
try
{
testSimpleExpression
();
testSimpleExpression
();
...
@@ -209,6 +241,8 @@ int main() {
...
@@ -209,6 +241,8 @@ int main() {
testExceptions
();
testExceptions
();
testCutoff
();
testCutoff
();
testPeriodic
();
testPeriodic
();
testTabulatedFunction
(
true
);
testTabulatedFunction
(
false
);
}
}
catch
(
const
exception
&
e
)
{
catch
(
const
exception
&
e
)
{
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
cout
<<
"exception: "
<<
e
.
what
()
<<
endl
;
...
...
platforms/reference/src/ReferenceKernels.cpp
View file @
73c0da63
...
@@ -487,8 +487,8 @@ public:
...
@@ -487,8 +487,8 @@ public:
*/
*/
void
findCoefficients
(
double
&
x
,
double
*
coeff
)
const
{
void
findCoefficients
(
double
&
x
,
double
*
coeff
)
const
{
int
length
=
values
.
size
();
int
length
=
values
.
size
();
double
s
pacing
=
(
max
-
min
)
/
(
length
-
1
);
double
s
cale
=
(
length
-
1
)
/
(
max
-
min
);
int
index
=
std
::
floor
((
x
-
min
)
/
spacing
);
int
index
=
std
::
floor
((
x
-
min
)
*
scale
);
double
points
[
4
];
double
points
[
4
];
points
[
0
]
=
(
index
==
0
?
2
*
values
[
0
]
-
values
[
1
]
:
values
[
index
-
1
]);
points
[
0
]
=
(
index
==
0
?
2
*
values
[
0
]
-
values
[
1
]
:
values
[
index
-
1
]);
points
[
1
]
=
values
[
index
];
points
[
1
]
=
values
[
index
];
...
@@ -506,7 +506,7 @@ public:
...
@@ -506,7 +506,7 @@ public:
coeff
[
2
]
=
(
3.0
*
points
[
0
]
-
6.0
*
points
[
1
]
+
3.0
*
points
[
2
])
/
6.0
;
coeff
[
2
]
=
(
3.0
*
points
[
0
]
-
6.0
*
points
[
1
]
+
3.0
*
points
[
2
])
/
6.0
;
coeff
[
3
]
=
(
-
points
[
0
]
+
3.0
*
points
[
1
]
-
3.0
*
points
[
2
]
+
points
[
3
])
/
6.0
;
coeff
[
3
]
=
(
-
points
[
0
]
+
3.0
*
points
[
1
]
-
3.0
*
points
[
2
]
+
points
[
3
])
/
6.0
;
}
}
x
=
(
x
-
min
)
/
spacing
-
index
;
x
=
(
x
-
min
)
*
scale
-
index
;
}
}
double
evaluate
(
const
double
*
arguments
)
const
{
double
evaluate
(
const
double
*
arguments
)
const
{
double
x
=
arguments
[
0
];
double
x
=
arguments
[
0
];
...
@@ -523,7 +523,7 @@ public:
...
@@ -523,7 +523,7 @@ public:
double
coeff
[
4
];
double
coeff
[
4
];
findCoefficients
(
x
,
coeff
);
findCoefficients
(
x
,
coeff
);
double
scale
=
(
values
.
size
()
-
1
)
/
(
max
-
min
);
double
scale
=
(
values
.
size
()
-
1
)
/
(
max
-
min
);
return
scale
*
(
coeff
[
1
]
+
x
*
(
2.0
*
coeff
[
2
]
+
x
*
3.0
*
coeff
[
3
]));
return
scale
*
(
coeff
[
1
]
+
x
*
(
2.0
*
coeff
[
2
]
+
x
*
3.0
*
coeff
[
3
]));
// We assume a first derivative, because that's the only order ever used by CustomNonbondedForce.
}
}
CustomFunction
*
clone
()
const
{
CustomFunction
*
clone
()
const
{
return
new
TabulatedFunction
(
min
,
max
,
values
,
interpolating
);
return
new
TabulatedFunction
(
min
,
max
,
values
,
interpolating
);
...
...
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