Skip to content

Commit a7f90b2

Browse files
sawenzeldavidrohr
authored andcommitted
Mem improvement for TPC digitization
For simulations with low interaction rate, we saw high mem spikes (up to 24GB) coming from TPC digitization. This is due to some preallocation of a std::deque<DigitTime> container. This commit preserves the logic but changes the container to std::deque<DigitTime*> and to a just-in-time creation of the actual DigitTime objects. This will lead to huge mem benefits in case of sparse occupancies and should be equivalent to the old solution for higher occupancies. Fixes https://alice.its.cern.ch/jira/browse/O2-3051
1 parent d1cf24d commit a7f90b2

2 files changed

Lines changed: 38 additions & 27 deletions

File tree

Detectors/TPC/simulation/include/TPCSimulation/DigitContainer.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class DigitContainer
8484
TimeBin mEffectiveTimeBin = 0; ///< Effective time bin of that digit
8585
TimeBin mTmaxTriggered = 0; ///< Maximum time bin in case of triggered mode (hard cut at average drift speed with additional margin)
8686
TimeBin mOffset; ///< Size of the container for one event
87-
std::deque<DigitTime> mTimeBins; ///< Time bin Container for the ADC value
87+
std::deque<DigitTime*> mTimeBins; ///< Time bin Container for the ADC value
8888
};
8989

9090
inline DigitContainer::DigitContainer()
@@ -96,30 +96,36 @@ inline DigitContainer::DigitContainer()
9696

9797
// always have 50 % contingency for the size of the container depending on the input
9898
mOffset = static_cast<TimeBin>(1.5 * detParam.TPClength / gasParam.DriftV / eleParam.ZbinWidth);
99-
mTimeBins.resize(mOffset);
99+
mTimeBins.resize(mOffset, nullptr);
100100
}
101101

102102
inline void DigitContainer::reset()
103103
{
104104
mFirstTimeBin = 0;
105105
mEffectiveTimeBin = 0;
106106
for (auto& time : mTimeBins) {
107-
time.reset();
107+
if (time) {
108+
time->reset();
109+
}
108110
}
109111
}
110112

111113
inline void DigitContainer::reserve(TimeBin eventTimeBin)
112114
{
113-
if (mTimeBins.size() < mOffset + eventTimeBin - mFirstTimeBin) {
114-
mTimeBins.resize(mOffset + eventTimeBin - mFirstTimeBin);
115+
const auto space = mOffset + eventTimeBin - mFirstTimeBin;
116+
if (mTimeBins.size() < space) {
117+
mTimeBins.resize(space);
115118
}
116119
}
117120

118121
inline void DigitContainer::addDigit(const MCCompLabel& label, const CRU& cru, TimeBin timeBin, GlobalPadNumber globalPad,
119122
float signal)
120123
{
121124
mEffectiveTimeBin = timeBin - mFirstTimeBin;
122-
mTimeBins[mEffectiveTimeBin].addDigit(label, cru, globalPad, signal);
125+
if (mTimeBins[mEffectiveTimeBin] == nullptr) {
126+
mTimeBins[mEffectiveTimeBin] = new DigitTime();
127+
}
128+
mTimeBins[mEffectiveTimeBin]->addDigit(label, cru, globalPad, signal);
123129
}
124130

125131
} // namespace tpc

Detectors/TPC/simulation/src/DigitContainer.cxx

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,28 @@ void DigitContainer::fillOutputContainer(std::vector<Digit>& output,
3636
continue;
3737
}
3838
++nProcessedTimeBins;
39-
40-
switch (digitizationMode) {
41-
case DigitzationMode::FullMode: {
42-
time.fillOutputContainer<DigitzationMode::FullMode>(output, mcTruth, commonModeOutput, sector, timeBin);
43-
break;
44-
}
45-
case DigitzationMode::ZeroSuppression: {
46-
time.fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin);
47-
break;
48-
}
49-
case DigitzationMode::SubtractPedestal: {
50-
time.fillOutputContainer<DigitzationMode::SubtractPedestal>(output, mcTruth, commonModeOutput, sector, timeBin);
51-
break;
52-
}
53-
case DigitzationMode::NoSaturation: {
54-
time.fillOutputContainer<DigitzationMode::NoSaturation>(output, mcTruth, commonModeOutput, sector, timeBin);
55-
break;
56-
}
57-
case DigitzationMode::PropagateADC: {
58-
time.fillOutputContainer<DigitzationMode::PropagateADC>(output, mcTruth, commonModeOutput, sector, timeBin);
59-
break;
39+
if (time) {
40+
switch (digitizationMode) {
41+
case DigitzationMode::FullMode: {
42+
time->fillOutputContainer<DigitzationMode::FullMode>(output, mcTruth, commonModeOutput, sector, timeBin);
43+
break;
44+
}
45+
case DigitzationMode::ZeroSuppression: {
46+
time->fillOutputContainer<DigitzationMode::ZeroSuppression>(output, mcTruth, commonModeOutput, sector, timeBin);
47+
break;
48+
}
49+
case DigitzationMode::SubtractPedestal: {
50+
time->fillOutputContainer<DigitzationMode::SubtractPedestal>(output, mcTruth, commonModeOutput, sector, timeBin);
51+
break;
52+
}
53+
case DigitzationMode::NoSaturation: {
54+
time->fillOutputContainer<DigitzationMode::NoSaturation>(output, mcTruth, commonModeOutput, sector, timeBin);
55+
break;
56+
}
57+
case DigitzationMode::PropagateADC: {
58+
time->fillOutputContainer<DigitzationMode::PropagateADC>(output, mcTruth, commonModeOutput, sector, timeBin);
59+
break;
60+
}
6061
}
6162
}
6263
} else {
@@ -67,7 +68,11 @@ void DigitContainer::fillOutputContainer(std::vector<Digit>& output,
6768
if (nProcessedTimeBins > 0) {
6869
mFirstTimeBin += nProcessedTimeBins;
6970
while (nProcessedTimeBins--) {
71+
auto popped = mTimeBins.front();
7072
mTimeBins.pop_front();
73+
if (popped) {
74+
delete popped;
75+
}
7176
}
7277
}
7378
}

0 commit comments

Comments
 (0)