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,
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; i<fRunListCollection->GetNoOfSingleHisto(); i++) {
size = fRunListCollection->GetNoOfBinsFitted(i);
if (minSize > size)
minSize = size;
if (maxSize < size)
maxSize = size;
}
for (UInt_t i=0; i<fRunListCollection->GetNoOfAsymmetry(); i++) {
size = fRunListCollection->GetNoOfBinsFitted(i);
if (minSize > size)
minSize = size;
if (maxSize < size)
maxSize = size;
}
for (UInt_t i=0; i<fRunListCollection->GetNoOfMuMinus(); 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<Double_t>(minSize, ierr);
fMemDataSingleHistoErr[i] = fDKS.allocateMemory<Double_t>(minSize, ierr);
size = runData->GetValue()->size();
fMemDataSingleHisto[i] = fDKS.allocateMemory<Double_t>(size, ierr);
fMemDataSingleHistoErr[i] = fDKS.allocateMemory<Double_t>(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<double>(fMemDataSingleHisto[i], &runData->GetValue()->at(startTimeBin), minSize);
fDKS.writeData<double>(fMemDataSingleHistoErr[i], &runData->GetError()->at(startTimeBin), minSize);
fDKS.writeData<double>(fMemDataSingleHisto[i], &runData->GetValue()->at(startTimeBin), size-startTimeBin);
fDKS.writeData<double>(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<Double_t>(minSize, ierr);
fMemDataAsymmetryErr[i] = fDKS.allocateMemory<Double_t>(minSize, ierr);
size = runData->GetValue()->size();
fMemDataAsymmetry[i] = fDKS.allocateMemory<Double_t>(size, ierr);
fMemDataAsymmetryErr[i] = fDKS.allocateMemory<Double_t>(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<double>(fMemDataAsymmetry[i], &runData->GetValue()->at(startTimeBin), minSize);
fDKS.writeData<double>(fMemDataAsymmetryErr[i], &runData->GetError()->at(startTimeBin), minSize);
fDKS.writeData<double>(fMemDataAsymmetry[i], &runData->GetValue()->at(startTimeBin), size-startTimeBin);
fDKS.writeData<double>(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<Double_t>(minSize, ierr);
fMemDataMuMinusErr[i] = fDKS.allocateMemory<Double_t>(minSize, ierr);
size = runData->GetValue()->size();
fMemDataMuMinus[i] = fDKS.allocateMemory<Double_t>(size, ierr);
fMemDataMuMinusErr[i] = fDKS.allocateMemory<Double_t>(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<double>(fMemDataMuMinus[i], &runData->GetValue()->at(startTimeBin), minSize);
fDKS.writeData<double>(fMemDataMuMinusErr[i], &runData->GetError()->at(startTimeBin), minSize);
fDKS.writeData<double>(fMemDataMuMinus[i], &runData->GetValue()->at(startTimeBin), size-startTimeBin);
fDKS.writeData<double>(fMemDataMuMinusErr[i], &runData->GetError()->at(startTimeBin), size-startTimeBin);
}
if (fRunListCollection->GetNoOfMuMinus() > 0) {
if (fitType == FITTYPE_UNDEFINED) {