Skip to content

Commit d421a94

Browse files
committed
GPU: Use GPUOutputControl arraay also in GPUChainTracking
1 parent 49c8c8a commit d421a94

File tree

5 files changed

+31
-47
lines changed

5 files changed

+31
-47
lines changed

GPU/GPUTracking/Base/GPUOutputControl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,10 @@ struct GPUTrackingOutputs {
7171
GPUOutputControl clusterLabels;
7272
GPUOutputControl sharedClusterMap;
7373

74-
static size_t count() { return sizeof(GPUTrackingOutputs) / sizeof(compressedClusters); }
74+
static constexpr size_t count() { return sizeof(GPUTrackingOutputs) / sizeof(GPUOutputControl); }
7575
GPUOutputControl* asArray() { return (GPUOutputControl*)this; }
7676
size_t getIndex(const GPUOutputControl& v) { return &v - (const GPUOutputControl*)this; }
77+
static int getIndex(GPUOutputControl GPUTrackingOutputs::*v) { return &(((GPUTrackingOutputs*)(nullptr))->*v) - (GPUOutputControl*)(nullptr); }
7778
};
7879

7980
} // namespace gpu

GPU/GPUTracking/Global/GPUChainTracking.cxx

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,10 @@ bool GPUChainTracking::ValidateSettings()
303303
GPUError("Invalid outputs for double pipeline mode 0x%x", (unsigned int)GetRecoStepsOutputs());
304304
return false;
305305
}
306-
if (((GetRecoStepsOutputs().isSet(GPUDataTypes::InOutType::TPCCompressedClusters) && mOutputCompressedClusters == nullptr) || (GetRecoStepsOutputs().isSet(GPUDataTypes::InOutType::TPCClusters) && mOutputClustersNative == nullptr) || (GetRecoStepsOutputs().isSet(GPUDataTypes::InOutType::TPCMergedTracks) && mOutputTPCTracks == nullptr))) {
306+
if (((GetRecoStepsOutputs().isSet(GPUDataTypes::InOutType::TPCCompressedClusters) && mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::compressedClusters)] == nullptr) ||
307+
(GetRecoStepsOutputs().isSet(GPUDataTypes::InOutType::TPCClusters) && mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::clustersNative)] == nullptr) ||
308+
(GetRecoStepsOutputs().isSet(GPUDataTypes::InOutType::TPCMergedTracks) && mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::tpcTracks)] == nullptr) ||
309+
(GetProcessingSettings().outputSharedClusterMap && mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::sharedClusterMap)] == nullptr))) {
307310
GPUError("Must use external output for double pipeline mode");
308311
return false;
309312
}
@@ -342,20 +345,10 @@ int GPUChainTracking::Init()
342345
return 1;
343346
}
344347

345-
if (mOutputCompressedClusters == nullptr) {
346-
mOutputCompressedClusters = &mRec->OutputControl();
347-
}
348-
if (mOutputClustersNative == nullptr) {
349-
mOutputClustersNative = &mRec->OutputControl();
350-
}
351-
if (mOutputTPCTracks == nullptr) {
352-
mOutputTPCTracks = &mRec->OutputControl();
353-
}
354-
if (mOutputSharedClusterMap == nullptr) {
355-
mOutputSharedClusterMap = &mRec->OutputControl();
356-
}
357-
if (mOutputClusterLabels == nullptr) {
358-
mOutputClusterLabels = &mRec->OutputControl();
348+
for (unsigned int i = 0; i < mSubOutputControls.size(); i++) {
349+
if (mSubOutputControls[i] == nullptr) {
350+
mSubOutputControls[i] = &mRec->OutputControl();
351+
}
359352
}
360353

361354
if (!ValidateSettings()) {
@@ -1128,7 +1121,7 @@ int GPUChainTracking::RunTPCClusterizer(bool synchronizeOutput)
11281121
AllocateRegisteredMemory(mInputsHost->mResourceClusterNativeBuffer);
11291122
}
11301123
if (buildNativeHost && !(buildNativeGPU && GetProcessingSettings().delayedOutput)) {
1131-
AllocateRegisteredMemory(mInputsHost->mResourceClusterNativeOutput, mOutputClustersNative);
1124+
AllocateRegisteredMemory(mInputsHost->mResourceClusterNativeOutput, mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::clustersNative)]);
11321125
}
11331126

11341127
GPUTPCLinearLabels mcLinearLabels;
@@ -1377,10 +1370,10 @@ int GPUChainTracking::RunTPCClusterizer(bool synchronizeOutput)
13771370
if (propagateMCLabels) {
13781371
// TODO: write to buffer directly
13791372
o2::dataformats::MCTruthContainer<o2::MCCompLabel> mcLabels;
1380-
if (mOutputClusterLabels == nullptr || !mOutputClusterLabels->allocator) {
1373+
if (mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::clusterLabels)] == nullptr || !mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::clusterLabels)]->allocator) {
13811374
throw std::runtime_error("Cluster MC Label buffer missing");
13821375
}
1383-
ClusterNativeAccess::ConstMCLabelContainerViewWithBuffer* container = reinterpret_cast<ClusterNativeAccess::ConstMCLabelContainerViewWithBuffer*>(mOutputClusterLabels->allocator(0));
1376+
ClusterNativeAccess::ConstMCLabelContainerViewWithBuffer* container = reinterpret_cast<ClusterNativeAccess::ConstMCLabelContainerViewWithBuffer*>(mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::clusterLabels)]->allocator(0));
13841377

13851378
assert(propagateMCLabels ? mcLinearLabels.header.size() == nClsTotal : true);
13861379
assert(propagateMCLabels ? mcLinearLabels.data.size() >= nClsTotal : true);
@@ -1393,7 +1386,7 @@ int GPUChainTracking::RunTPCClusterizer(bool synchronizeOutput)
13931386

13941387
if (buildNativeHost && buildNativeGPU && GetProcessingSettings().delayedOutput) {
13951388
mInputsHost->mNClusterNative = mInputsShadow->mNClusterNative = nClsTotal;
1396-
AllocateRegisteredMemory(mInputsHost->mResourceClusterNativeOutput, mOutputClustersNative);
1389+
AllocateRegisteredMemory(mInputsHost->mResourceClusterNativeOutput, mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::clustersNative)]);
13971390
for (unsigned int i = outputQueueStart; i < mOutputQueue.size(); i++) {
13981391
mOutputQueue[i].dst = (char*)mInputsHost->mPclusterNativeOutput + (size_t)mOutputQueue[i].dst;
13991392
}
@@ -1959,8 +1952,8 @@ int GPUChainTracking::RunTPCTrackingMerger(bool synchronizeOutput)
19591952

19601953
SynchronizeGPU(); // Need to know the full number of slice tracks
19611954
SetupGPUProcessor(&Merger, true);
1962-
AllocateRegisteredMemory(Merger.MemoryResOutput(), mOutputTPCTracks);
1963-
AllocateRegisteredMemory(Merger.MemoryResOutputState(), mOutputSharedClusterMap);
1955+
AllocateRegisteredMemory(Merger.MemoryResOutput(), mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::tpcTracks)]);
1956+
AllocateRegisteredMemory(Merger.MemoryResOutputState(), mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::sharedClusterMap)]);
19641957

19651958
if (Merger.CheckSlices()) {
19661959
return 1;
@@ -2182,7 +2175,7 @@ int GPUChainTracking::RunTPCCompression()
21822175
O->nAttachedClustersReduced = O->nAttachedClusters - O->nTracks;
21832176
O->nSliceRows = NSLICES * GPUCA_ROW_COUNT;
21842177
O->nComppressionModes = param().rec.tpcCompressionModes;
2185-
size_t outputSize = AllocateRegisteredMemory(Compressor.mMemoryResOutputHost, mOutputCompressedClusters);
2178+
size_t outputSize = AllocateRegisteredMemory(Compressor.mMemoryResOutputHost, mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::compressedClusters)]);
21862179
Compressor.mOutputFlat->set(outputSize, *Compressor.mOutput);
21872180
char* hostFlatPtr = (char*)Compressor.mOutput->qTotU; // First array as allocated in GPUTPCCompression::SetPointersCompressedClusters
21882181
size_t copySize = 0;
@@ -2325,7 +2318,7 @@ int GPUChainTracking::RunTPCDecompression()
23252318
TPCClusterDecompressor decomp;
23262319
auto allocator = [this](size_t size) {
23272320
this->mInputsHost->mNClusterNative = this->mInputsShadow->mNClusterNative = size;
2328-
this->AllocateRegisteredMemory(this->mInputsHost->mResourceClusterNativeOutput, this->mOutputClustersNative);
2321+
this->AllocateRegisteredMemory(this->mInputsHost->mResourceClusterNativeOutput, this->mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::clustersNative)]);
23292322
return this->mInputsHost->mPclusterNativeOutput;
23302323
};
23312324
auto& gatherTimer = getTimer<TPCClusterDecompressor>("TPCDecompression", 0);

GPU/GPUTracking/Global/GPUChainTracking.h

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,12 @@ class GPUChainTracking : public GPUChain, GPUReconstructionHelpers::helperDelega
171171
void SetCalibObjects(const GPUCalibObjects& obj) { memcpy((void*)&processors()->calibObjects, (const void*)&obj, sizeof(obj)); }
172172
void SetDefaultO2PropagatorForGPU();
173173
void LoadClusterErrors();
174-
void SetOutputControlCompressedClusters(GPUOutputControl* v) { mOutputCompressedClusters = v; }
175-
void SetOutputControlClustersNative(GPUOutputControl* v) { mOutputClustersNative = v; }
176-
void SetOutputControlTPCTracks(GPUOutputControl* v) { mOutputTPCTracks = v; }
177-
void SetOutputControlClusterLabels(GPUOutputControl* v) { mOutputClusterLabels = v; }
178-
void SetOutputControlSharedClusterMap(GPUOutputControl* v) { mOutputSharedClusterMap = v; }
174+
void SetOutputControlCompressedClusters(GPUOutputControl* v) { mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::compressedClusters)] = v; }
175+
void SetOutputControlClustersNative(GPUOutputControl* v) { mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::clustersNative)] = v; }
176+
void SetOutputControlTPCTracks(GPUOutputControl* v) { mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::tpcTracks)] = v; }
177+
void SetOutputControlClusterLabels(GPUOutputControl* v) { mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::clusterLabels)] = v; }
178+
void SetOutputControlSharedClusterMap(GPUOutputControl* v) { mSubOutputControls[GPUTrackingOutputs::getIndex(&GPUTrackingOutputs::sharedClusterMap)] = v; }
179+
void SetSubOutputControl(int i, GPUOutputControl* v) { mSubOutputControls[i] = v; }
179180

180181
const GPUSettingsDisplay* mConfigDisplay = nullptr; // Abstract pointer to Standalone Display Configuration Structure
181182
const GPUSettingsQA* mConfigQA = nullptr; // Abstract pointer to Standalone QA Configuration Structure
@@ -244,11 +245,7 @@ class GPUChainTracking : public GPUChain, GPUReconstructionHelpers::helperDelega
244245

245246
std::unique_ptr<o2::tpc::ClusterNativeAccess> mClusterNativeAccess;
246247

247-
GPUOutputControl* mOutputCompressedClusters = nullptr;
248-
GPUOutputControl* mOutputClustersNative = nullptr;
249-
GPUOutputControl* mOutputTPCTracks = nullptr;
250-
GPUOutputControl* mOutputClusterLabels = nullptr;
251-
GPUOutputControl* mOutputSharedClusterMap = nullptr;
248+
std::array<GPUOutputControl*, GPUTrackingOutputs::count()> mSubOutputControls = {nullptr};
252249

253250
std::unique_ptr<GPUTPCCFChainContext> mCFContext;
254251

GPU/GPUTracking/Interface/GPUO2Interface.cxx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,14 @@ int GPUTPCO2Interface::Initialize(const GPUO2InterfaceConfiguration& config)
5555
mRec->SetSettings(&mConfig->configEvent, &mConfig->configReconstruction, &mConfig->configProcessing, &mConfig->configWorkflow);
5656
mChain->SetCalibObjects(mConfig->configCalib);
5757
mOutputRegions.reset(new GPUTrackingOutputs);
58-
mOutputControls.resize(GPUTrackingOutputs::count());
5958
if (mConfig->configInterface.outputToExternalBuffers) {
60-
mChain->SetOutputControlCompressedClusters(&mOutputControls[mOutputRegions->getIndex(mOutputRegions->compressedClusters)]);
61-
mChain->SetOutputControlClustersNative(&mOutputControls[mOutputRegions->getIndex(mOutputRegions->clustersNative)]);
62-
mChain->SetOutputControlTPCTracks(&mOutputControls[mOutputRegions->getIndex(mOutputRegions->tpcTracks)]);
63-
mChain->SetOutputControlSharedClusterMap(&mOutputControls[mOutputRegions->getIndex(mOutputRegions->sharedClusterMap)]);
59+
for (unsigned int i = 0; i < mOutputRegions->count(); i++) {
60+
mChain->SetSubOutputControl(i, &mOutputRegions->asArray()[i]);
61+
}
6462
GPUOutputControl dummy;
6563
dummy.set([](size_t size) -> void* {throw std::runtime_error("invalid output memory request, no common output buffer set"); return nullptr; });
6664
mRec->SetOutputControl(dummy);
6765
}
68-
if (mConfig->configProcessing.runMC) {
69-
mChain->SetOutputControlClusterLabels(&mOutputControls[mOutputRegions->getIndex(mOutputRegions->clusterLabels)]);
70-
}
7166

7267
if (mRec->Init()) {
7368
return (1);
@@ -117,11 +112,11 @@ int GPUTPCO2Interface::RunTracking(GPUTrackingInOutPointers* data, GPUInterfaceO
117112
if (mConfig->configInterface.outputToExternalBuffers) {
118113
for (unsigned int i = 0; i < mOutputRegions->count(); i++) {
119114
if (outputs->asArray()[i].allocator) {
120-
mOutputControls[i].set(outputs->asArray()[i].allocator);
115+
mOutputRegions->asArray()[i].set(outputs->asArray()[i].allocator);
121116
} else if (outputs->asArray()[i].ptrBase) {
122-
mOutputControls[i].set(outputs->asArray()[i].ptrBase, outputs->asArray()[i].size);
117+
mOutputRegions->asArray()[i].set(outputs->asArray()[i].ptrBase, outputs->asArray()[i].size);
123118
} else {
124-
mOutputControls[i].reset();
119+
mOutputRegions->asArray()[i].reset();
125120
}
126121
}
127122
}

GPU/GPUTracking/Interface/GPUO2Interface.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ class GPUReconstruction;
4141
class GPUChainTracking;
4242
struct GPUO2InterfaceConfiguration;
4343
struct GPUInterfaceOutputs;
44-
struct GPUOutputControl;
4544
struct GPUTrackingOutputs;
4645

4746
class GPUTPCO2Interface
@@ -75,7 +74,6 @@ class GPUTPCO2Interface
7574
GPUChainTracking* mChain = nullptr; //!
7675
std::unique_ptr<GPUO2InterfaceConfiguration> mConfig; //!
7776
std::unique_ptr<GPUTrackingOutputs> mOutputRegions; //!
78-
std::vector<GPUOutputControl> mOutputControls; //!
7977
};
8078
} // namespace o2::gpu
8179

0 commit comments

Comments
 (0)