Unverified Commit 0e396127 authored by Andy Simmonett's avatar Andy Simmonett
Browse files

Fix array resize problems in Cuda and OpenCL kernels

parent c0f7ca70
...@@ -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());
} }
......
...@@ -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());
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment