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