Skip to content

Commit 96627e2

Browse files
committed
GPU QA: Use single GPU QA instance for double-pipeline
1 parent 8dfdb27 commit 96627e2

5 files changed

Lines changed: 29 additions & 13 deletions

File tree

GPU/GPUTracking/Benchmark/standalone.cxx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@ int ReadEvent(int n)
501501
if ((configStandalone.proc.runQA || configStandalone.eventDisplay) && !configStandalone.QA.noMC) {
502502
chainTracking->ForceInitQA();
503503
snprintf(filename, 256, "events/%s/mc.%d.dump", configStandalone.eventsDir, n);
504+
chainTracking->GetQA()->UpdateChain(chainTracking);
504505
if (chainTracking->GetQA()->ReadO2MCData(filename)) {
505506
snprintf(filename, 256, "events/%s/mc.%d.dump", configStandalone.eventsDir, 0);
506507
if (chainTracking->GetQA()->ReadO2MCData(filename) && configStandalone.proc.runQA) {
@@ -734,12 +735,14 @@ int main(int argc, char** argv)
734735
recAsync->SetDebugLevelTmp(configStandalone.proc.debugLevel);
735736
}
736737
chainTrackingAsync = recAsync->AddChain<GPUChainTracking>();
738+
chainTrackingAsync->SetQAFromForeignChain(chainTracking);
737739
}
738740
if (configStandalone.proc.doublePipeline) {
739741
if (configStandalone.proc.debugLevel >= 3) {
740742
recPipeline->SetDebugLevelTmp(configStandalone.proc.debugLevel);
741743
}
742744
chainTrackingPipeline = recPipeline->AddChain<GPUChainTracking>();
745+
chainTrackingPipeline->SetQAFromForeignChain(chainTracking);
743746
}
744747
#ifdef GPUCA_HAVE_O2HEADERS
745748
if (!configStandalone.proc.doublePipeline) {

GPU/GPUTracking/Global/GPUChainTracking.cxx

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,14 @@ int GPUChainTracking::Init()
373373
}
374374

375375
if (GPUQA::QAAvailable() && (GetProcessingSettings().runQA || GetProcessingSettings().eventDisplay)) {
376-
mQA.reset(new GPUQA(this));
376+
auto& qa = mQAFromForeignChain ? mQAFromForeignChain->mQA : mQA;
377+
if (!qa) {
378+
qa.reset(new GPUQA(this));
379+
}
377380
}
378381
if (GetProcessingSettings().eventDisplay) {
379382
#ifndef GPUCA_ALIROOT_LIB
380-
mEventDisplay.reset(GPUDisplayInterface::getDisplay(GetProcessingSettings().eventDisplay, this, mQA.get()));
383+
mEventDisplay.reset(GPUDisplayInterface::getDisplay(GetProcessingSettings().eventDisplay, this, GetQA()));
381384
#endif
382385
if (mEventDisplay == nullptr) {
383386
throw std::runtime_error("Error loading event display");
@@ -479,19 +482,21 @@ int GPUChainTracking::PrepareEvent()
479482

480483
int GPUChainTracking::ForceInitQA()
481484
{
482-
if (!mQA) {
483-
mQA.reset(new GPUQA(this));
485+
auto& qa = mQAFromForeignChain ? mQAFromForeignChain->mQA : mQA;
486+
if (!qa) {
487+
qa.reset(new GPUQA(this));
484488
}
485-
if (!mQA->IsInitialized()) {
486-
return mQA->InitQA();
489+
if (!GetQA()->IsInitialized()) {
490+
return GetQA()->InitQA();
487491
}
488492
return 0;
489493
}
490494

491495
int GPUChainTracking::Finalize()
492496
{
493-
if (GetProcessingSettings().runQA && mQA->IsInitialized() && !(mConfigQA && mConfigQA->shipToQC)) {
494-
mQA->DrawQAHistograms();
497+
if (GetProcessingSettings().runQA && GetQA()->IsInitialized() && !(mConfigQA && mConfigQA->shipToQC) && !mQAFromForeignChain) {
498+
GetQA()->UpdateChain(this);
499+
GetQA()->DrawQAHistograms();
495500
}
496501
if (GetProcessingSettings().debugLevel >= 6) {
497502
mDebugFile->close();
@@ -670,8 +675,8 @@ int GPUChainTracking::RunChain()
670675
mCompressionStatistics.reset(new GPUTPCClusterStatistics);
671676
}
672677
const bool needQA = GPUQA::QAAvailable() && (GetProcessingSettings().runQA || (GetProcessingSettings().eventDisplay && (mIOPtrs.nMCInfosTPC || GetProcessingSettings().runMC)));
673-
if (needQA && mQA->IsInitialized() == false) {
674-
if (mQA->InitQA(GetProcessingSettings().runQA ? -GetProcessingSettings().runQA : -1)) {
678+
if (needQA && GetQA()->IsInitialized() == false) {
679+
if (GetQA()->InitQA(GetProcessingSettings().runQA ? -GetProcessingSettings().runQA : -1)) {
675680
return 1;
676681
}
677682
}
@@ -796,7 +801,8 @@ int GPUChainTracking::RunChainFinalize()
796801
const bool needQA = GPUQA::QAAvailable() && (GetProcessingSettings().runQA || (GetProcessingSettings().eventDisplay && mIOPtrs.nMCInfosTPC));
797802
if (needQA && mFractionalQAEnabled) {
798803
mRec->getGeneralStepTimer(GeneralStep::QA).Start();
799-
mQA->RunQA(!GetProcessingSettings().runQA);
804+
GetQA()->UpdateChain(this);
805+
GetQA()->RunQA(!GetProcessingSettings().runQA);
800806
mRec->getGeneralStepTimer(GeneralStep::QA).Stop();
801807
if (GetProcessingSettings().debugLevel == 0) {
802808
GPUInfo("Total QA runtime: %d us", (int)(mRec->getGeneralStepTimer(GeneralStep::QA).GetElapsedTime() * 1000000));

GPU/GPUTracking/Global/GPUChainTracking.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,10 @@ class GPUChainTracking : public GPUChain, GPUReconstructionHelpers::helperDelega
156156
const GPUTPCGMMerger& GetTPCMerger() const { return processors()->tpcMerger; }
157157
GPUTPCGMMerger& GetTPCMerger() { return processors()->tpcMerger; }
158158
GPUDisplayInterface* GetEventDisplay() { return mEventDisplay.get(); }
159-
const GPUQA* GetQA() const { return mQA.get(); }
160-
GPUQA* GetQA() { return mQA.get(); }
159+
const GPUQA* GetQA() const { return mQAFromForeignChain ? mQAFromForeignChain->mQA.get() : mQA.get(); }
160+
GPUQA* GetQA() { return mQAFromForeignChain ? mQAFromForeignChain->mQA.get() : mQA.get(); }
161161
int ForceInitQA();
162+
void SetQAFromForeignChain(GPUChainTracking* chain) { mQAFromForeignChain = chain; }
162163

163164
// Processing functions
164165
int RunTPCClusterizer(bool synchronizeOutput = true);
@@ -254,6 +255,7 @@ class GPUChainTracking : public GPUChain, GPUReconstructionHelpers::helperDelega
254255
// Display / QA
255256
bool mDisplayRunning = false;
256257
std::unique_ptr<GPUDisplayInterface> mEventDisplay;
258+
GPUChainTracking* mQAFromForeignChain = nullptr;
257259
std::unique_ptr<GPUQA> mQA;
258260
std::unique_ptr<GPUTPCClusterStatistics> mCompressionStatistics;
259261

GPU/GPUTracking/Interface/GPUO2Interface.cxx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ int GPUO2Interface::Initialize(const GPUO2InterfaceConfiguration& config)
8080
}
8181
for (unsigned int i = 0; i < mNContexts; i++) {
8282
mCtx[i].mChain = mCtx[i].mRec->AddChain<GPUChainTracking>(mConfig->configInterface.maxTPCHits, mConfig->configInterface.maxTRDTracklets);
83+
if (i) {
84+
mCtx[i].mChain->SetQAFromForeignChain(mCtx[0].mChain);
85+
}
8386
mCtx[i].mChain->mConfigDisplay = &mConfig->configDisplay;
8487
mCtx[i].mChain->mConfigQA = &mConfig->configQA;
8588
mCtx[i].mRec->SetSettings(&mConfig->configGRP, &mConfig->configReconstruction, &mConfig->configProcessing, &mConfig->configWorkflow);
@@ -145,6 +148,7 @@ void GPUO2Interface::DumpEvent(int nEvent, GPUTrackingInOutPointers* data)
145148
if (mConfig->configProcessing.runMC) {
146149
mCtx[0].mChain->ForceInitQA();
147150
snprintf(fname, 1024, "mc.%d.dump", nEvent);
151+
mCtx[0].mChain->GetQA()->UpdateChain(mCtx[0].mChain);
148152
mCtx[0].mChain->GetQA()->DumpO2MCData(fname);
149153
}
150154
#endif

GPU/GPUTracking/qa/GPUQA.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ class GPUQA
113113
int ReadO2MCData(const char* filename);
114114
static bool QAAvailable() { return true; }
115115
bool IsInitialized() { return mQAInitialized; }
116+
void UpdateChain(GPUChainTracking* chain) { mTracking = chain; }
116117

117118
const std::vector<TH1F>& getHistograms1D() const { return *mHist1D; }
118119
const std::vector<TH2F>& getHistograms2D() const { return *mHist2D; }

0 commit comments

Comments
 (0)