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
0e396127
Unverified
Commit
0e396127
authored
Dec 04, 2019
by
Andy Simmonett
Browse files
Fix array resize problems in Cuda and OpenCL kernels
parent
c0f7ca70
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
112 additions
and
26 deletions
+112
-26
platforms/cuda/src/CudaKernels.cpp
platforms/cuda/src/CudaKernels.cpp
+56
-13
platforms/opencl/src/OpenCLKernels.cpp
platforms/opencl/src/OpenCLKernels.cpp
+56
-13
No files found.
platforms/cuda/src/CudaKernels.cpp
View file @
0e396127
...
@@ -7112,19 +7112,28 @@ void CudaIntegrateVelocityVerletStepKernel::execute(ContextImpl& context, const
...
@@ -7112,19 +7112,28 @@ void CudaIntegrateVelocityVerletStepKernel::execute(ContextImpl& context, const
prevMaxPairDistance
=
maxPairDistance
;
prevMaxPairDistance
=
maxPairDistance
;
}
}
if
(
numAtoms
!=
0
&&
(
!
atomListBuffer
.
isInitialized
()
||
atomListBuffer
.
getSize
()
!=
numAtoms
))
{
if
(
numAtoms
!=
0
&&
(
!
atomListBuffer
.
isInitialized
()
||
atomListBuffer
.
getSize
()
!=
numAtoms
))
{
atomListBuffer
.
initialize
<
int
>
(
cu
,
atomList
.
size
(),
"atomListBuffer"
);
if
(
atomListBuffer
.
isInitialized
())
{
atomListBuffer
.
resize
(
atomList
.
size
());
}
else
{
atomListBuffer
.
initialize
<
int
>
(
cu
,
atomList
.
size
(),
"atomListBuffer"
);
}
atomListBuffer
.
upload
(
atomList
);
atomListBuffer
.
upload
(
atomList
);
}
}
if
(
numPairs
!=
0
&&
(
!
pairListBuffer
.
isInitialized
()
||
pairListBuffer
.
getSize
()
!=
numPairs
))
{
if
(
numPairs
!=
0
&&
(
!
pairListBuffer
.
isInitialized
()
||
pairListBuffer
.
getSize
()
!=
numPairs
))
{
if
(
pairListBuffer
.
isInitialized
())
{
pairListBuffer
.
resize
(
pairList
.
size
());
pairTemperatureBuffer
.
resize
(
pairList
.
size
());
}
else
{
pairListBuffer
.
initialize
<
int2
>
(
cu
,
pairList
.
size
(),
"pairListBuffer"
);
pairTemperatureBuffer
.
initialize
<
float
>
(
cu
,
pairList
.
size
(),
"pairTemperatureBuffer"
);
}
std
::
vector
<
int2
>
tmp
;
std
::
vector
<
int2
>
tmp
;
std
::
vector
<
float
>
tmp2
;
std
::
vector
<
float
>
tmp2
;
for
(
const
auto
&
pair
:
pairList
)
{
for
(
const
auto
&
pair
:
pairList
)
{
tmp
.
push_back
(
make_int2
(
std
::
get
<
0
>
(
pair
),
std
::
get
<
1
>
(
pair
)));
tmp
.
push_back
(
make_int2
(
std
::
get
<
0
>
(
pair
),
std
::
get
<
1
>
(
pair
)));
tmp2
.
push_back
(
std
::
get
<
2
>
(
pair
));
tmp2
.
push_back
(
std
::
get
<
2
>
(
pair
));
}
}
pairListBuffer
.
initialize
<
int2
>
(
cu
,
pairList
.
size
(),
"pairListBuffer"
);
pairListBuffer
.
upload
(
tmp
);
pairListBuffer
.
upload
(
tmp
);
pairTemperatureBuffer
.
initialize
<
float
>
(
cu
,
pairList
.
size
(),
"pairTemperatureBuffer"
);
pairTemperatureBuffer
.
upload
(
tmp2
);
pairTemperatureBuffer
.
upload
(
tmp2
);
}
}
//// Call the first integration kernel.
//// Call the first integration kernel.
...
@@ -8447,24 +8456,42 @@ std::pair<double, double> CudaNoseHooverChainKernel::propagateChain(ContextImpl&
...
@@ -8447,24 +8456,42 @@ std::pair<double, double> CudaNoseHooverChainKernel::propagateChain(ContextImpl&
if
(
!
scaleFactorBuffer
.
isInitialized
()
||
scaleFactorBuffer
.
getSize
()
==
0
)
{
if
(
!
scaleFactorBuffer
.
isInitialized
()
||
scaleFactorBuffer
.
getSize
()
==
0
)
{
if
(
useDouble
){
if
(
useDouble
){
std
::
vector
<
double2
>
zeros
{{
0
,
0
}};
std
::
vector
<
double2
>
zeros
{{
0
,
0
}};
scaleFactorBuffer
.
initialize
<
double2
>
(
cu
,
1
,
"scaleFactorBuffer"
);
if
(
scaleFactorBuffer
.
isInitialized
())
{
scaleFactorBuffer
.
resize
(
1
);
}
else
{
scaleFactorBuffer
.
initialize
<
double2
>
(
cu
,
1
,
"scaleFactorBuffer"
);
}
scaleFactorBuffer
.
upload
(
zeros
);
scaleFactorBuffer
.
upload
(
zeros
);
}
else
{
}
else
{
std
::
vector
<
float2
>
zeros
{{
0
,
0
}};
std
::
vector
<
float2
>
zeros
{{
0
,
0
}};
scaleFactorBuffer
.
initialize
<
float2
>
(
cu
,
1
,
"scaleFactorBuffer"
);
if
(
scaleFactorBuffer
.
isInitialized
())
{
scaleFactorBuffer
.
resize
(
1
);
}
else
{
scaleFactorBuffer
.
initialize
<
float2
>
(
cu
,
1
,
"scaleFactorBuffer"
);
}
scaleFactorBuffer
.
upload
(
zeros
);
scaleFactorBuffer
.
upload
(
zeros
);
}
}
}
}
std
::
vector
<
double
>
zeros
(
chainLength
,
0
);
std
::
vector
<
double
>
zeros
(
chainLength
,
0
);
if
(
!
chainForces
.
isInitialized
()
||
!
chainMasses
.
isInitialized
()
){
if
(
!
chainForces
.
isInitialized
()
||
!
chainMasses
.
isInitialized
()
){
if
(
useDouble
){
if
(
useDouble
){
chainMasses
.
initialize
<
double
>
(
cu
,
chainLength
,
"chainMasses"
);
if
(
chainForces
.
isInitialized
())
{
chainForces
.
initialize
<
double
>
(
cu
,
chainLength
,
"chainForces"
);
chainMasses
.
resize
(
chainLength
);
chainForces
.
resize
(
chainLength
);
}
else
{
chainMasses
.
initialize
<
double
>
(
cu
,
chainLength
,
"chainMasses"
);
chainForces
.
initialize
<
double
>
(
cu
,
chainLength
,
"chainForces"
);
}
chainMasses
.
upload
(
zeros
);
chainMasses
.
upload
(
zeros
);
chainForces
.
upload
(
zeros
);
chainForces
.
upload
(
zeros
);
}
else
{
}
else
{
chainMasses
.
initialize
<
float
>
(
cu
,
chainLength
,
"chainMasses"
);
if
(
chainForces
.
isInitialized
())
{
chainForces
.
initialize
<
float
>
(
cu
,
chainLength
,
"chainForces"
);
chainMasses
.
resize
(
chainLength
);
chainForces
.
resize
(
chainLength
);
}
else
{
chainMasses
.
initialize
<
float
>
(
cu
,
chainLength
,
"chainMasses"
);
chainForces
.
initialize
<
float
>
(
cu
,
chainLength
,
"chainForces"
);
}
chainMasses
.
upload
(
zeros
);
chainMasses
.
upload
(
zeros
);
chainForces
.
upload
(
zeros
);
chainForces
.
upload
(
zeros
);
}
}
...
@@ -8479,11 +8506,19 @@ std::pair<double, double> CudaNoseHooverChainKernel::propagateChain(ContextImpl&
...
@@ -8479,11 +8506,19 @@ std::pair<double, double> CudaNoseHooverChainKernel::propagateChain(ContextImpl&
if
(
chainState
.
at
(
2
*
chainID
).
getSize
()
!=
chainLength
)
{
if
(
chainState
.
at
(
2
*
chainID
).
getSize
()
!=
chainLength
)
{
// We need to upload the CUDA array
// We need to upload the CUDA array
if
(
useDouble
){
if
(
useDouble
){
chainState
.
at
(
2
*
chainID
).
initialize
<
double2
>
(
cu
,
chainLength
,
"chainState"
+
std
::
to_string
(
2
*
chainID
));
if
(
chainState
.
at
(
2
*
chainID
).
isInitialized
())
{
chainState
.
at
(
2
*
chainID
).
resize
(
chainLength
);
}
else
{
chainState
.
at
(
2
*
chainID
).
initialize
<
double2
>
(
cu
,
chainLength
,
"chainState"
+
std
::
to_string
(
2
*
chainID
));
}
std
::
vector
<
double2
>
zeros
(
chainLength
,
make_double2
(
0
,
0
));
std
::
vector
<
double2
>
zeros
(
chainLength
,
make_double2
(
0
,
0
));
chainState
.
at
(
2
*
chainID
).
upload
(
zeros
.
data
());
chainState
.
at
(
2
*
chainID
).
upload
(
zeros
.
data
());
}
else
{
}
else
{
chainState
.
at
(
2
*
chainID
).
initialize
<
float2
>
(
cu
,
chainLength
,
"chainState"
+
std
::
to_string
(
2
*
chainID
));
if
(
chainState
.
at
(
2
*
chainID
).
isInitialized
())
{
chainState
.
at
(
2
*
chainID
).
resize
(
chainLength
);
}
else
{
chainState
.
at
(
2
*
chainID
).
initialize
<
float2
>
(
cu
,
chainLength
,
"chainState"
+
std
::
to_string
(
2
*
chainID
));
}
std
::
vector
<
float2
>
zeros
(
chainLength
,
make_float2
(
0
,
0
));
std
::
vector
<
float2
>
zeros
(
chainLength
,
make_float2
(
0
,
0
));
chainState
.
at
(
2
*
chainID
).
upload
(
zeros
.
data
());
chainState
.
at
(
2
*
chainID
).
upload
(
zeros
.
data
());
}
}
...
@@ -8510,11 +8545,19 @@ std::pair<double, double> CudaNoseHooverChainKernel::propagateChain(ContextImpl&
...
@@ -8510,11 +8545,19 @@ std::pair<double, double> CudaNoseHooverChainKernel::propagateChain(ContextImpl&
if
(
chainState
.
at
(
2
*
chainID
+
1
).
getSize
()
!=
chainLength
)
{
if
(
chainState
.
at
(
2
*
chainID
+
1
).
getSize
()
!=
chainLength
)
{
// We need to upload the CUDA array
// We need to upload the CUDA array
if
(
useDouble
){
if
(
useDouble
){
chainState
.
at
(
2
*
chainID
+
1
).
initialize
<
double2
>
(
cu
,
chainLength
,
"chainState"
+
std
::
to_string
(
2
*
chainID
+
1
));
if
(
chainState
.
at
(
2
*
chainID
+
1
).
isInitialized
())
{
chainState
.
at
(
2
*
chainID
+
1
).
resize
(
chainLength
);
}
else
{
chainState
.
at
(
2
*
chainID
+
1
).
initialize
<
double2
>
(
cu
,
chainLength
,
"chainState"
+
std
::
to_string
(
2
*
chainID
+
1
));
}
std
::
vector
<
double2
>
zeros
(
chainLength
,
make_double2
(
0
,
0
));
std
::
vector
<
double2
>
zeros
(
chainLength
,
make_double2
(
0
,
0
));
chainState
.
at
(
2
*
chainID
+
1
).
upload
(
zeros
.
data
());
chainState
.
at
(
2
*
chainID
+
1
).
upload
(
zeros
.
data
());
}
else
{
}
else
{
chainState
.
at
(
2
*
chainID
+
1
).
initialize
<
float2
>
(
cu
,
chainLength
,
"chainState"
+
std
::
to_string
(
2
*
chainID
+
1
));
if
(
chainState
.
at
(
2
*
chainID
+
1
).
isInitialized
())
{
chainState
.
at
(
2
*
chainID
+
1
).
resize
(
chainLength
);
}
else
{
chainState
.
at
(
2
*
chainID
+
1
).
initialize
<
float2
>
(
cu
,
chainLength
,
"chainState"
+
std
::
to_string
(
2
*
chainID
+
1
));
}
std
::
vector
<
float2
>
zeros
(
chainLength
,
make_float2
(
0
,
0
));
std
::
vector
<
float2
>
zeros
(
chainLength
,
make_float2
(
0
,
0
));
chainState
.
at
(
2
*
chainID
+
1
).
upload
(
zeros
.
data
());
chainState
.
at
(
2
*
chainID
+
1
).
upload
(
zeros
.
data
());
}
}
...
...
platforms/opencl/src/OpenCLKernels.cpp
View file @
0e396127
...
@@ -7426,19 +7426,28 @@ void OpenCLIntegrateVelocityVerletStepKernel::execute(ContextImpl& context, cons
...
@@ -7426,19 +7426,28 @@ void OpenCLIntegrateVelocityVerletStepKernel::execute(ContextImpl& context, cons
prevMaxPairDistance = maxPairDistance;
prevMaxPairDistance = maxPairDistance;
}
}
if (numAtoms !=0 && (!atomListBuffer.isInitialized() || atomListBuffer.getSize() != numAtoms)) {
if (numAtoms !=0 && (!atomListBuffer.isInitialized() || atomListBuffer.getSize() != numAtoms)) {
atomListBuffer.initialize<cl_int>(cl, atomList.size(), "atomListBuffer");
if (atomListBuffer.isInitialized()) {
atomListBuffer.resize(atomList.size());
} else {
atomListBuffer.initialize<cl_int>(cl, atomList.size(), "atomListBuffer");
}
atomListBuffer.upload(atomList);
atomListBuffer.upload(atomList);
}
}
if (numPairs !=0 && (!pairListBuffer.isInitialized() || pairListBuffer.getSize() != numPairs)) {
if (numPairs !=0 && (!pairListBuffer.isInitialized() || pairListBuffer.getSize() != numPairs)) {
if (pairListBuffer.isInitialized()) {
pairListBuffer.resize(pairList.size());
pairTemperatureBuffer.resize(pairList.size());
} else {
pairListBuffer.initialize<mm_int2>(cl, pairList.size(), "pairListBuffer");
pairTemperatureBuffer.initialize<cl_float>(cl, pairList.size(), "pairTemperatureBuffer");
}
std::vector<mm_int2> tmp;
std::vector<mm_int2> tmp;
std::vector<float> tmp2;
std::vector<float> tmp2;
for(const auto &pair : pairList) {
for(const auto &pair : pairList) {
tmp.push_back(mm_int2(std::get<0>(pair), std::get<1>(pair)));
tmp.push_back(mm_int2(std::get<0>(pair), std::get<1>(pair)));
tmp2.push_back(std::get<2>(pair));
tmp2.push_back(std::get<2>(pair));
}
}
pairListBuffer.initialize<mm_int2>(cl, pairList.size(), "pairListBuffer");
pairListBuffer.upload(tmp);
pairListBuffer.upload(tmp);
pairTemperatureBuffer.initialize<cl_float>(cl, pairList.size(), "pairTemperatureBuffer");
pairTemperatureBuffer.upload(tmp2);
pairTemperatureBuffer.upload(tmp2);
}
}
...
@@ -8873,25 +8882,43 @@ std::pair<double, double> OpenCLNoseHooverChainKernel::propagateChain(ContextImp
...
@@ -8873,25 +8882,43 @@ std::pair<double, double> OpenCLNoseHooverChainKernel::propagateChain(ContextImp
if (!scaleFactorBuffer.isInitialized() ||scaleFactorBuffer.getSize() == 0) {
if (!scaleFactorBuffer.isInitialized() ||scaleFactorBuffer.getSize() == 0) {
if(useDouble){
if(useDouble){
std::vector<mm_double2> zeros{{0,0}};
std::vector<mm_double2> zeros{{0,0}};
scaleFactorBuffer.initialize<mm_double2>(cl, 1, "scaleFactorBuffer");
if (scaleFactorBuffer.isInitialized()) {
scaleFactorBuffer.resize(1);
} else {
scaleFactorBuffer.initialize<mm_double2>(cl, 1, "scaleFactorBuffer");
}
scaleFactorBuffer.upload(zeros);
scaleFactorBuffer.upload(zeros);
} else {
} else {
std::vector<mm_float2> zeros{{0,0}};
std::vector<mm_float2> zeros{{0,0}};
scaleFactorBuffer.initialize<mm_float2>(cl, 1, "scaleFactorBuffer");
if (scaleFactorBuffer.isInitialized()) {
scaleFactorBuffer.resize(1);
} else {
scaleFactorBuffer.initialize<mm_float2>(cl, 1, "scaleFactorBuffer");
}
scaleFactorBuffer.upload(zeros);
scaleFactorBuffer.upload(zeros);
}
}
}
}
if (!chainForces.isInitialized() || !chainMasses.isInitialized() ){
if (!chainForces.isInitialized() || !chainMasses.isInitialized() ){
if(useDouble){
if(useDouble){
std::vector<cl_double> zeros(chainLength,0);
std::vector<cl_double> zeros(chainLength,0);
chainMasses.initialize<cl_double>(cl, chainLength, "chainMasses");
if (chainForces.isInitialized()) {
chainForces.initialize<cl_double>(cl, chainLength, "chainForces");
chainMasses.resize(chainLength);
chainForces.resize(chainLength);
} else {
chainMasses.initialize<cl_double>(cl, chainLength, "chainMasses");
chainForces.initialize<cl_double>(cl, chainLength, "chainForces");
}
chainMasses.upload(zeros);
chainMasses.upload(zeros);
chainForces.upload(zeros);
chainForces.upload(zeros);
} else {
} else {
std::vector<cl_float> zeros(chainLength,0);
std::vector<cl_float> zeros(chainLength,0);
chainMasses.initialize<cl_float>(cl, chainLength, "chainMasses");
if (chainForces.isInitialized()) {
chainForces.initialize<cl_float>(cl, chainLength, "chainForces");
chainMasses.resize(chainLength);
chainForces.resize(chainLength);
} else {
chainMasses.initialize<cl_float>(cl, chainLength, "chainMasses");
chainForces.initialize<cl_float>(cl, chainLength, "chainForces");
}
chainMasses.upload(zeros);
chainMasses.upload(zeros);
chainForces.upload(zeros);
chainForces.upload(zeros);
}
}
...
@@ -8906,11 +8933,19 @@ std::pair<double, double> OpenCLNoseHooverChainKernel::propagateChain(ContextImp
...
@@ -8906,11 +8933,19 @@ std::pair<double, double> OpenCLNoseHooverChainKernel::propagateChain(ContextImp
if (chainState.at(2*chainID).getSize() != chainLength) {
if (chainState.at(2*chainID).getSize() != chainLength) {
// We need to upload the OpenCL array
// We need to upload the OpenCL array
if(useDouble){
if(useDouble){
chainState.at(2*chainID).initialize<mm_double2>(cl, chainLength, "chainState" + std::to_string(2*chainID));
if (chainState.at(2*chainID).isInitialized()) {
chainState.at(2*chainID).resize(chainLength);
} else {
chainState.at(2*chainID).initialize<mm_double2>(cl, chainLength, "chainState" + std::to_string(2*chainID));
}
std::vector<mm_double2> zeros(chainLength, mm_double2(0.0, 0.0));
std::vector<mm_double2> zeros(chainLength, mm_double2(0.0, 0.0));
chainState.at(2*chainID).upload(zeros.data());
chainState.at(2*chainID).upload(zeros.data());
} else {
} else {
chainState.at(2*chainID).initialize<mm_float2>(cl, chainLength, "chainState" + std::to_string(2*chainID));
if (chainState.at(2*chainID).isInitialized()) {
chainState.at(2*chainID).resize(chainLength);
} else {
chainState.at(2*chainID).initialize<mm_float2>(cl, chainLength, "chainState" + std::to_string(2*chainID));
}
std::vector<mm_float2> zeros(chainLength, mm_float2(0.0f, 0.0f));
std::vector<mm_float2> zeros(chainLength, mm_float2(0.0f, 0.0f));
chainState.at(2*chainID).upload(zeros.data());
chainState.at(2*chainID).upload(zeros.data());
}
}
...
@@ -8941,11 +8976,19 @@ std::pair<double, double> OpenCLNoseHooverChainKernel::propagateChain(ContextImp
...
@@ -8941,11 +8976,19 @@ std::pair<double, double> OpenCLNoseHooverChainKernel::propagateChain(ContextImp
if (chainState.at(2*chainID+1).getSize() != chainLength) {
if (chainState.at(2*chainID+1).getSize() != chainLength) {
// We need to upload the OpenCL array
// We need to upload the OpenCL array
if(useDouble){
if(useDouble){
chainState.at(2*chainID+1).initialize<mm_double2>(cl, chainLength, "chainState" + std::to_string(2*chainID+1));
if (chainState.at(2*chainID+1).isInitialized()) {
chainState.at(2*chainID+1).resize(chainLength);
} else {
chainState.at(2*chainID+1).initialize<mm_double2>(cl, chainLength, "chainState" + std::to_string(2*chainID+1));
}
std::vector<mm_double2> zeros(chainLength, mm_double2(0.0, 0.0));
std::vector<mm_double2> zeros(chainLength, mm_double2(0.0, 0.0));
chainState.at(2*chainID+1).upload(zeros.data());
chainState.at(2*chainID+1).upload(zeros.data());
} else {
} else {
chainState.at(2*chainID+1).initialize<mm_float2>(cl, chainLength, "chainState" + std::to_string(2*chainID+1));
if (chainState.at(2*chainID+1).isInitialized()) {
chainState.at(2*chainID+1).resize(chainLength);
} else {
chainState.at(2*chainID+1).initialize<mm_float2>(cl, chainLength, "chainState" + std::to_string(2*chainID+1));
}
std::vector<mm_float2> zeros(chainLength, mm_float2(0.0f, 0.0f));
std::vector<mm_float2> zeros(chainLength, mm_float2(0.0f, 0.0f));
chainState.at(2*chainID+1).upload(zeros.data());
chainState.at(2*chainID+1).upload(zeros.data());
}
}
...
...
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