From 2d4697c750bd521ae53f5c6c2359a64cfa9624ed Mon Sep 17 00:00:00 2001 From: Andreas Suter Date: Thu, 17 Aug 2017 13:29:25 +0200 Subject: [PATCH] fixes a bug in the GPU memory allocation. --- src/classes/PFitterFcnDKS.cpp | 52 ++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/classes/PFitterFcnDKS.cpp b/src/classes/PFitterFcnDKS.cpp index e64df572..a640ff81 100644 --- a/src/classes/PFitterFcnDKS.cpp +++ b/src/classes/PFitterFcnDKS.cpp @@ -106,6 +106,7 @@ Double_t PFitterFcnDKS::operator()(const std::vector& par) const ierr += fDKS.callLaunchChiSquare(FITTYPE_SINGLE_HISTO, fMemDataSingleHisto[i], fMemDataSingleHistoErr[i], dksp.fNoOfFitBins, par.size(), dksp.fFun.size(), dksp.fMap.size(), dksp.fStartTime , dksp.fPackedTimeResolution, chisq); + value += chisq; if (ierr != 0) { @@ -250,25 +251,25 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) // init chisq buffer on the GPU - // 1) calculated the minimum size for the data needed. - Int_t minSize = 1e9, size = -1; + // 1) calculated the maximum size for the data needed. Int_t parSize = -1, mapSize = -1, funSize = -1; + Int_t maxSize = 0, size = -1; for (UInt_t i=0; iGetNoOfSingleHisto(); i++) { size = fRunListCollection->GetNoOfBinsFitted(i); - if (minSize > size) - minSize = size; + if (maxSize < size) + maxSize = size; } for (UInt_t i=0; iGetNoOfAsymmetry(); i++) { size = fRunListCollection->GetNoOfBinsFitted(i); - if (minSize > size) - minSize = size; + if (maxSize < size) + maxSize = size; } for (UInt_t i=0; iGetNoOfMuMinus(); i++) { size = fRunListCollection->GetNoOfBinsFitted(i); - if (minSize > size) - minSize = size; + if (maxSize < size) + maxSize = size; } - if (minSize == 1e9) { + if (maxSize == 0) { cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to get data size to be fitted." << endl; fValid = false; return; @@ -295,8 +296,8 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) } // now ready to init the chisq buffer on the GPU - cout << "debug> minSize=" << minSize << ", parSize=" << parSize << ", funSize=" << funSize << ", mapSize=" << mapSize << endl; - ierr = fDKS.initChiSquare(minSize, parSize, funSize, mapSize); + cout << "debug> maximal packed histo size=" << maxSize << ", parSize=" << parSize << ", funSize=" << funSize << ", mapSize=" << mapSize << endl; + ierr = fDKS.initChiSquare(maxSize, parSize, funSize, mapSize); if (ierr != 0) { cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocate the necessary chisq buffer on the GPU." << endl; fValid = false; @@ -316,8 +317,9 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) fValid = false; return; } - fMemDataSingleHisto[i] = fDKS.allocateMemory(minSize, ierr); - fMemDataSingleHistoErr[i] = fDKS.allocateMemory(minSize, ierr); + size = runData->GetValue()->size(); + fMemDataSingleHisto[i] = fDKS.allocateMemory(size, ierr); + fMemDataSingleHistoErr[i] = fDKS.allocateMemory(size, ierr); if (ierr != 0) { cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocated single histo data set memory (i=" << i << ") on the GPU" << endl; fValid = false; @@ -329,8 +331,8 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) fValid = false; return; } - fDKS.writeData(fMemDataSingleHisto[i], &runData->GetValue()->at(startTimeBin), minSize); - fDKS.writeData(fMemDataSingleHistoErr[i], &runData->GetError()->at(startTimeBin), minSize); + fDKS.writeData(fMemDataSingleHisto[i], &runData->GetValue()->at(startTimeBin), size-startTimeBin); + fDKS.writeData(fMemDataSingleHistoErr[i], &runData->GetError()->at(startTimeBin), size-startTimeBin); } if (fRunListCollection->GetNoOfSingleHisto() > 0) fitType = FITTYPE_SINGLE_HISTO; @@ -345,9 +347,9 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) fValid = false; return; } - - fMemDataAsymmetry[i] = fDKS.allocateMemory(minSize, ierr); - fMemDataAsymmetryErr[i] = fDKS.allocateMemory(minSize, ierr); + size = runData->GetValue()->size(); + fMemDataAsymmetry[i] = fDKS.allocateMemory(size, ierr); + fMemDataAsymmetryErr[i] = fDKS.allocateMemory(size, ierr); if (ierr != 0) { cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocated asymmetry data set memory (i=" << i << ") on the GPU" << endl; fValid = false; @@ -359,8 +361,8 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) fValid = false; return; } - fDKS.writeData(fMemDataAsymmetry[i], &runData->GetValue()->at(startTimeBin), minSize); - fDKS.writeData(fMemDataAsymmetryErr[i], &runData->GetError()->at(startTimeBin), minSize); + fDKS.writeData(fMemDataAsymmetry[i], &runData->GetValue()->at(startTimeBin), size-startTimeBin); + fDKS.writeData(fMemDataAsymmetryErr[i], &runData->GetError()->at(startTimeBin), size-startTimeBin); } if (fRunListCollection->GetNoOfAsymmetry() > 0) { if (fitType == FITTYPE_UNDEFINED) { @@ -382,9 +384,9 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) fValid = false; return; } - - fMemDataMuMinus[i] = fDKS.allocateMemory(minSize, ierr); - fMemDataMuMinusErr[i] = fDKS.allocateMemory(minSize, ierr); + size = runData->GetValue()->size(); + fMemDataMuMinus[i] = fDKS.allocateMemory(size, ierr); + fMemDataMuMinusErr[i] = fDKS.allocateMemory(size, ierr); if (ierr != 0) { cerr << ">> PFitterFcnDKS::InitDKS: **ERROR** failed to allocated mu minus data set memory (i=" << i << ") on the GPU" << endl; fValid = false; @@ -396,8 +398,8 @@ void PFitterFcnDKS::InitDKS(const UInt_t dksTag) fValid = false; return; } - fDKS.writeData(fMemDataMuMinus[i], &runData->GetValue()->at(startTimeBin), minSize); - fDKS.writeData(fMemDataMuMinusErr[i], &runData->GetError()->at(startTimeBin), minSize); + fDKS.writeData(fMemDataMuMinus[i], &runData->GetValue()->at(startTimeBin), size-startTimeBin); + fDKS.writeData(fMemDataMuMinusErr[i], &runData->GetError()->at(startTimeBin), size-startTimeBin); } if (fRunListCollection->GetNoOfMuMinus() > 0) { if (fitType == FITTYPE_UNDEFINED) {