fixes a bug in the GPU memory allocation.

This commit is contained in:
suter_a 2017-08-17 13:29:25 +02:00
parent d397bf0064
commit 2d4697c750

View File

@ -106,6 +106,7 @@ Double_t PFitterFcnDKS::operator()(const std::vector<Double_t>& par) const
ierr += fDKS.callLaunchChiSquare(FITTYPE_SINGLE_HISTO, fMemDataSingleHisto[i], fMemDataSingleHistoErr[i], dksp.fNoOfFitBins, ierr += fDKS.callLaunchChiSquare(FITTYPE_SINGLE_HISTO, fMemDataSingleHisto[i], fMemDataSingleHistoErr[i], dksp.fNoOfFitBins,
par.size(), dksp.fFun.size(), dksp.fMap.size(), par.size(), dksp.fFun.size(), dksp.fMap.size(),
dksp.fStartTime , dksp.fPackedTimeResolution, chisq); dksp.fStartTime , dksp.fPackedTimeResolution, chisq);
value += chisq; value += chisq;
if (ierr != 0) { if (ierr != 0) {
@ -250,25 +251,25 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag)
// init chisq buffer on the GPU // init chisq buffer on the GPU
// 1) calculated the minimum size for the data needed. // 1) calculated the maximum size for the data needed.
Int_t minSize = 1e9, size = -1;
Int_t parSize = -1, mapSize = -1, funSize = -1; Int_t parSize = -1, mapSize = -1, funSize = -1;
Int_t maxSize = 0, size = -1;
for (UInt_t i=0; i<fRunListCollection->GetNoOfSingleHisto(); i++) { for (UInt_t i=0; i<fRunListCollection->GetNoOfSingleHisto(); i++) {
size = fRunListCollection->GetNoOfBinsFitted(i); size = fRunListCollection->GetNoOfBinsFitted(i);
if (minSize > size) if (maxSize < size)
minSize = size; maxSize = size;
} }
for (UInt_t i=0; i<fRunListCollection->GetNoOfAsymmetry(); i++) { for (UInt_t i=0; i<fRunListCollection->GetNoOfAsymmetry(); i++) {
size = fRunListCollection->GetNoOfBinsFitted(i); size = fRunListCollection->GetNoOfBinsFitted(i);
if (minSize > size) if (maxSize < size)
minSize = size; maxSize = size;
} }
for (UInt_t i=0; i<fRunListCollection->GetNoOfMuMinus(); i++) { for (UInt_t i=0; i<fRunListCollection->GetNoOfMuMinus(); i++) {
size = fRunListCollection->GetNoOfBinsFitted(i); size = fRunListCollection->GetNoOfBinsFitted(i);
if (minSize > size) if (maxSize < size)
minSize = size; maxSize = size;
} }
if (minSize == 1e9) { if (maxSize == 0) {
cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to get data size to be fitted." << endl; cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to get data size to be fitted." << endl;
fValid = false; fValid = false;
return; return;
@ -295,8 +296,8 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag)
} }
// now ready to init the chisq buffer on the GPU // now ready to init the chisq buffer on the GPU
cout << "debug> minSize=" << minSize << ", parSize=" << parSize << ", funSize=" << funSize << ", mapSize=" << mapSize << endl; cout << "debug> maximal packed histo size=" << maxSize << ", parSize=" << parSize << ", funSize=" << funSize << ", mapSize=" << mapSize << endl;
ierr = fDKS.initChiSquare(minSize, parSize, funSize, mapSize); ierr = fDKS.initChiSquare(maxSize, parSize, funSize, mapSize);
if (ierr != 0) { if (ierr != 0) {
cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocate the necessary chisq buffer on the GPU." << endl; cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocate the necessary chisq buffer on the GPU." << endl;
fValid = false; fValid = false;
@ -316,8 +317,9 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag)
fValid = false; fValid = false;
return; return;
} }
fMemDataSingleHisto[i] = fDKS.allocateMemory<Double_t>(minSize, ierr); size = runData->GetValue()->size();
fMemDataSingleHistoErr[i] = fDKS.allocateMemory<Double_t>(minSize, ierr); fMemDataSingleHisto[i] = fDKS.allocateMemory<Double_t>(size, ierr);
fMemDataSingleHistoErr[i] = fDKS.allocateMemory<Double_t>(size, ierr);
if (ierr != 0) { if (ierr != 0) {
cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocated single histo data set memory (i=" << i << ") on the GPU" << endl; cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocated single histo data set memory (i=" << i << ") on the GPU" << endl;
fValid = false; fValid = false;
@ -329,8 +331,8 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag)
fValid = false; fValid = false;
return; return;
} }
fDKS.writeData<double>(fMemDataSingleHisto[i], &runData->GetValue()->at(startTimeBin), minSize); fDKS.writeData<double>(fMemDataSingleHisto[i], &runData->GetValue()->at(startTimeBin), size-startTimeBin);
fDKS.writeData<double>(fMemDataSingleHistoErr[i], &runData->GetError()->at(startTimeBin), minSize); fDKS.writeData<double>(fMemDataSingleHistoErr[i], &runData->GetError()->at(startTimeBin), size-startTimeBin);
} }
if (fRunListCollection->GetNoOfSingleHisto() > 0) if (fRunListCollection->GetNoOfSingleHisto() > 0)
fitType = FITTYPE_SINGLE_HISTO; fitType = FITTYPE_SINGLE_HISTO;
@ -345,9 +347,9 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag)
fValid = false; fValid = false;
return; return;
} }
size = runData->GetValue()->size();
fMemDataAsymmetry[i] = fDKS.allocateMemory<Double_t>(minSize, ierr); fMemDataAsymmetry[i] = fDKS.allocateMemory<Double_t>(size, ierr);
fMemDataAsymmetryErr[i] = fDKS.allocateMemory<Double_t>(minSize, ierr); fMemDataAsymmetryErr[i] = fDKS.allocateMemory<Double_t>(size, ierr);
if (ierr != 0) { if (ierr != 0) {
cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocated asymmetry data set memory (i=" << i << ") on the GPU" << endl; cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocated asymmetry data set memory (i=" << i << ") on the GPU" << endl;
fValid = false; fValid = false;
@ -359,8 +361,8 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag)
fValid = false; fValid = false;
return; return;
} }
fDKS.writeData<double>(fMemDataAsymmetry[i], &runData->GetValue()->at(startTimeBin), minSize); fDKS.writeData<double>(fMemDataAsymmetry[i], &runData->GetValue()->at(startTimeBin), size-startTimeBin);
fDKS.writeData<double>(fMemDataAsymmetryErr[i], &runData->GetError()->at(startTimeBin), minSize); fDKS.writeData<double>(fMemDataAsymmetryErr[i], &runData->GetError()->at(startTimeBin), size-startTimeBin);
} }
if (fRunListCollection->GetNoOfAsymmetry() > 0) { if (fRunListCollection->GetNoOfAsymmetry() > 0) {
if (fitType == FITTYPE_UNDEFINED) { if (fitType == FITTYPE_UNDEFINED) {
@ -382,9 +384,9 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag)
fValid = false; fValid = false;
return; return;
} }
size = runData->GetValue()->size();
fMemDataMuMinus[i] = fDKS.allocateMemory<Double_t>(minSize, ierr); fMemDataMuMinus[i] = fDKS.allocateMemory<Double_t>(size, ierr);
fMemDataMuMinusErr[i] = fDKS.allocateMemory<Double_t>(minSize, ierr); fMemDataMuMinusErr[i] = fDKS.allocateMemory<Double_t>(size, ierr);
if (ierr != 0) { if (ierr != 0) {
cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocated mu minus data set memory (i=" << i << ") on the GPU" << endl; cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocated mu minus data set memory (i=" << i << ") on the GPU" << endl;
fValid = false; fValid = false;
@ -396,8 +398,8 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag)
fValid = false; fValid = false;
return; return;
} }
fDKS.writeData<double>(fMemDataMuMinus[i], &runData->GetValue()->at(startTimeBin), minSize); fDKS.writeData<double>(fMemDataMuMinus[i], &runData->GetValue()->at(startTimeBin), size-startTimeBin);
fDKS.writeData<double>(fMemDataMuMinusErr[i], &runData->GetError()->at(startTimeBin), minSize); fDKS.writeData<double>(fMemDataMuMinusErr[i], &runData->GetError()->at(startTimeBin), size-startTimeBin);
} }
if (fRunListCollection->GetNoOfMuMinus() > 0) { if (fRunListCollection->GetNoOfMuMinus() > 0) {
if (fitType == FITTYPE_UNDEFINED) { if (fitType == FITTYPE_UNDEFINED) {