Project
Loading...
Searching...
No Matches
GPUChainTrackingTRD.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
15#include "GPUChainTracking.h"
16#include "GPULogging.h"
17#include "GPUO2DataTypes.h"
18#include "GPUTRDTrackletWord.h"
20#include "GPUTRDTrack.h"
21#include "GPUTRDTracker.h"
24#include "GPUConstantMem.h"
25#include "utils/strtag.h"
26
27using namespace o2::gpu;
28using namespace o2::trd;
29
31{
32 return GetProcessingSettings().trdTrackModelO2 ? RunTRDTrackingInternal<GPUTRDTrackerKernels::o2Version>() : RunTRDTrackingInternal<GPUTRDTrackerKernels::gpuVersion>();
33}
34
35template <int32_t I>
36int32_t GPUChainTracking::RunTRDTrackingInternal()
37{
38 auto& Tracker = processors()->getTRDTracker<I>();
39 if (!Tracker.IsInitialized()) {
40 return 1;
41 }
42
43 Tracker.Reset();
44 if (mIOPtrs.nTRDTracklets == 0) {
45 return 0;
46 }
47
48 bool isTriggeredEvent = (param().continuousMaxTimeBin == 0);
49
50 if (!isTriggeredEvent) {
51 Tracker.SetProcessPerTimeFrame(true);
52 }
53
54 Tracker.SetGenerateSpacePoints(mIOPtrs.trdSpacePoints == nullptr);
55
58
59 if constexpr (I == GPUTRDTrackerKernels::gpuVersion) {
60 for (uint32_t i = 0; i < mIOPtrs.nMergedTracks; i++) {
62 if (!Tracker.PreCheckTrackTRDCandidate(trk)) {
63 continue;
64 }
65 const GPUTRDTrackGPU& trktrd = param().rec.tpc.nWaysOuter ? (GPUTRDTrackGPU)trk.OuterParam() : (GPUTRDTrackGPU)trk;
66 if (!Tracker.CheckTrackTRDCandidate(trktrd)) {
67 continue;
68 }
69 GPUTRDTrackerGPU::HelperTrackAttributes trkAttribs, *trkAttribsPtr{nullptr};
70 if (!isTriggeredEvent) {
71 const float tpcTBinMUS = 0.199606f;
72 trkAttribs.mTime = trk.GetParam().GetTZOffset() * tpcTBinMUS;
73 trkAttribs.mTimeAddMax = 50.f; // half of a TPC drift time in us
74 trkAttribs.mTimeSubMax = 50.f; // half of a TPC drift time in us
75 if (!trk.CCE()) {
76 if (trk.CSide()) {
77 // track has only C-side clusters
78 trkAttribs.mSide = 1;
79 } else {
80 // track has only A-side clusters
81 trkAttribs.mSide = -1;
82 }
83 }
84 trkAttribsPtr = &trkAttribs;
85 }
86 if (Tracker.LoadTrack(trktrd, i, false, trkAttribsPtr)) {
87 return 1;
88 }
89 }
90 } else {
91 for (uint32_t i = 0; i < mIOPtrs.nOutputTracksTPCO2; i++) {
92 const auto& trk = mIOPtrs.outputTracksTPCO2[i];
93
94 if (!Tracker.PreCheckTrackTRDCandidate(trk)) {
95 continue;
96 }
97 const GPUTRDTrack& trktrd = (GPUTRDTrack)trk;
98 if (!Tracker.CheckTrackTRDCandidate(trktrd)) {
99 continue;
100 }
101
102 GPUTRDTracker::HelperTrackAttributes trkAttribs, *trkAttribsPtr{nullptr};
103 if (!isTriggeredEvent) {
104 const float tpcTBinMUS = 0.199606f;
105 trkAttribs.mTime = trk.getTime0() * tpcTBinMUS;
106 trkAttribs.mTimeAddMax = trk.getDeltaTFwd() * tpcTBinMUS;
107 trkAttribs.mTimeSubMax = trk.getDeltaTBwd() * tpcTBinMUS;
108 if (trk.hasASideClustersOnly()) {
109 trkAttribs.mSide = -1;
110 } else if (trk.hasCSideClustersOnly()) {
111 trkAttribs.mSide = 1;
112 }
113 trkAttribsPtr = &trkAttribs;
114 }
115 if (Tracker.LoadTrack(trktrd, i, false, trkAttribsPtr)) {
116 return 1;
117 }
118 }
119 }
120
121 DoTRDGPUTracking<I>();
122
123 mIOPtrs.nTRDTracks = Tracker.NTracks();
124 if constexpr (I == GPUTRDTrackerKernels::gpuVersion) {
125 mIOPtrs.trdTracks = Tracker.Tracks();
126 mIOPtrs.trdTracksO2 = nullptr;
127 } else {
128 mIOPtrs.trdTracks = nullptr;
129 mIOPtrs.trdTracksO2 = Tracker.Tracks();
130 }
131 mRec->PopNonPersistentMemory(RecoStep::TRDTracking, qStr2Tag("TRDTRACK"));
132
133 return 0;
134}
135
136template <int32_t I, class T>
137int32_t GPUChainTracking::DoTRDGPUTracking(T* externalInstance)
138{
139 bool doGPU = GetRecoStepsGPU() & RecoStep::TRDTracking;
140 auto* Tracker = &processors()->getTRDTracker<I>();
141 auto* TrackerShadow = doGPU ? &processorsShadow()->getTRDTracker<I>() : Tracker;
142 if (externalInstance) {
143 if constexpr (std::is_same_v<decltype(Tracker), decltype(externalInstance)>) {
144 Tracker = externalInstance;
145 } else {
146 throw std::runtime_error("Must not provide external instance that does not match template type");
147 }
148 }
149 Tracker->PrepareTracking(this);
150
151 int32_t useStream = 0;
152
153 const auto& threadContext = GetThreadContext();
155 if (doGPU) {
156 TrackerShadow->OverrideGPUGeometry(reinterpret_cast<GPUTRDGeometry*>(mFlatObjectsDevice.mCalibObjects.trdGeometry));
157 mInputsHost->mNTRDTracklets = mInputsShadow->mNTRDTracklets = processorsShadow()->ioPtrs.nTRDTracklets = mIOPtrs.nTRDTracklets;
158 mInputsHost->mNTRDTriggerRecords = mInputsShadow->mNTRDTriggerRecords = processorsShadow()->ioPtrs.nTRDTriggerRecords = mIOPtrs.nTRDTriggerRecords;
159 mInputsHost->mDoSpacepoints = mInputsShadow->mDoSpacepoints = !Tracker->GenerateSpacepoints();
162 processorsShadow()->ioPtrs.trdSpacePoints = Tracker->GenerateSpacepoints() ? Tracker->SpacePoints() : mInputsShadow->mTRDSpacePoints;
163 if constexpr (std::is_same_v<decltype(processorsShadow()->ioPtrs.trdTracks), decltype(TrackerShadow->Tracks())>) {
164 processorsShadow()->ioPtrs.trdTracks = TrackerShadow->Tracks();
165 } else {
166 processorsShadow()->ioPtrs.trdTracks = nullptr;
167 }
170 processorsShadow()->ioPtrs.trdTrackletIdxFirst = mInputsShadow->mTRDTrackletIdxFirst;
171 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDTracklets, mIOPtrs.trdTracklets, sizeof(*mIOPtrs.trdTracklets) * mIOPtrs.nTRDTracklets, useStream, true);
172 if (!Tracker->GenerateSpacepoints()) {
173 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDSpacePoints, mIOPtrs.trdSpacePoints, sizeof(*mIOPtrs.trdSpacePoints) * mIOPtrs.nTRDTracklets, useStream, true);
174 }
175 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDTriggerTimes, mIOPtrs.trdTriggerTimes, sizeof(*mIOPtrs.trdTriggerTimes) * mIOPtrs.nTRDTriggerRecords, useStream, true);
176 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDTrackletIdxFirst, mIOPtrs.trdTrackletIdxFirst, sizeof(*mIOPtrs.trdTrackletIdxFirst) * mIOPtrs.nTRDTriggerRecords, useStream, true);
179 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDTrigRecMask, mIOPtrs.trdTrigRecMask, sizeof(*mIOPtrs.trdTrigRecMask) * mIOPtrs.nTRDTriggerRecords, useStream, true);
180 } else {
182 }
183 WriteToConstantMemory(RecoStep::TRDTracking, (char*)&processors()->ioPtrs - (char*)processors(), &processorsShadow()->ioPtrs, sizeof(processorsShadow()->ioPtrs), useStream);
184 WriteToConstantMemory(RecoStep::TRDTracking, (char*)&processors()->getTRDTracker<I>() - (char*)processors(), TrackerShadow, sizeof(*TrackerShadow), useStream);
185 }
186
187 TransferMemoryResourcesToGPU(RecoStep::TRDTracking, Tracker, useStream);
188 runKernel<GPUTRDTrackerKernels, I>(GetGridAuto(useStream), externalInstance ? Tracker : nullptr);
189 TransferMemoryResourcesToHost(RecoStep::TRDTracking, Tracker, useStream);
190 SynchronizeStream(useStream);
191
192 if (GetProcessingSettings().debugLevel >= 2) {
193 GPUInfo("GPU TRD tracker Finished");
194 }
195 return (0);
196}
197
198template int32_t GPUChainTracking::DoTRDGPUTracking<GPUTRDTrackerKernels::gpuVersion>(GPUTRDTrackerGPU*);
199template int32_t GPUChainTracking::DoTRDGPUTracking<GPUTRDTrackerKernels::gpuVersion>(GPUTRDTracker*);
200template int32_t GPUChainTracking::DoTRDGPUTracking<GPUTRDTrackerKernels::o2Version>(GPUTRDTracker*);
201template int32_t GPUChainTracking::DoTRDGPUTracking<GPUTRDTrackerKernels::o2Version>(GPUTRDTrackerGPU*);
int32_t i
Online TRD tracker based on extrapolated TPC tracks.
Used for storing the MC labels for the TRD tracklets.
TRD Tracklet word for GPU tracker - 32bit tracklet info + half chamber ID + index.
GPUTrackingFlatObjects mFlatObjectsDevice
std::unique_ptr< GPUTrackingInputProvider > mInputsHost
int32_t DoTRDGPUTracking(T *externalInstance=nullptr)
GPUTrackingInOutPointers & mIOPtrs
std::unique_ptr< GPUTrackingInputProvider > mInputsShadow
void GPUMemCpy(RecoStep step, void *dst, const void *src, size_t size, int32_t stream, int32_t toGPU, deviceEvent *ev=nullptr, deviceEvent *evList=nullptr, int32_t nEvents=1)
Definition GPUChain.h:127
GPUReconstruction::RecoStepField GetRecoStepsGPU() const
Definition GPUChain.h:71
void WriteToConstantMemory(RecoStep step, size_t offset, const void *src, size_t size, int32_t stream=-1, deviceEvent *ev=nullptr)
Definition GPUChain.h:126
size_t AllocateRegisteredMemory(GPUProcessor *proc)
Definition GPUChain.h:216
virtual std::unique_ptr< GPUReconstructionProcessing::threadContext > GetThreadContext()
Definition GPUChain.h:108
GPUConstantMem * processors()
Definition GPUChain.h:83
GPUParam & param()
Definition GPUChain.h:86
void SetupGPUProcessor(T *proc, bool allocate)
Definition GPUChain.h:219
const GPUSettingsProcessing & GetProcessingSettings() const
Definition GPUChain.h:75
void SynchronizeStream(int32_t stream)
Definition GPUChain.h:88
GPUReconstructionCPU * mRec
Definition GPUChain.h:78
GPUConstantMem * processorsShadow()
Definition GPUChain.h:84
void TransferMemoryResourcesToHost(RecoStep step, GPUProcessor *proc, int32_t stream=-1, bool all=false)
Definition GPUChain.h:122
krnlExec GetGridAuto(int32_t stream, GPUReconstruction::krnlDeviceType d=GPUReconstruction::krnlDeviceType::Auto, GPUDataTypes::RecoStep st=GPUDataTypes::RecoStep::NoRecoStep)
Definition GPUChain.cxx:42
void TransferMemoryResourcesToGPU(RecoStep step, GPUProcessor *proc, int32_t stream=-1, bool all=false)
Definition GPUChain.h:121
void PopNonPersistentMemory(RecoStep step, uint64_t tag)
void PushNonPersistentMemory(uint64_t tag)
GPUTRDTrack_t< trackInterface< TRDBaseTrack > > GPUTRDTrack
Definition GPUTRDDef.h:50
GPUTRDTrack_t< trackInterface< TRDBaseTrackGPU > > GPUTRDTrackGPU
Definition GPUTRDDef.h:51
constexpr T qStr2Tag(const char *str)
Definition strtag.h:22
S< o2::trd::GeometryFlat >::type * trdGeometry
GPUTrackingInOutPointers ioPtrs
const GPUTRDSpacePoint * trdSpacePoints
const GPUTRDTrackGPU * trdTracks
const GPUTRDTrackletWord * trdTracklets
const o2::tpc::TrackTPC * outputTracksTPCO2
const GPUTPCGMMergedTrack * mergedTracks