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 "utils/strtag.h"
25
26using namespace o2::gpu;
27using namespace o2::trd;
28
29template <int32_t I>
31{
32 auto& Tracker = processors()->getTRDTracker<I>();
33 if (!Tracker.IsInitialized()) {
34 return 1;
35 }
36
37 Tracker.Reset();
38 if (mIOPtrs.nTRDTracklets == 0) {
39 return 0;
40 }
41
42 bool isTriggeredEvent = (param().continuousMaxTimeBin == 0);
43
44 if (!isTriggeredEvent) {
45 Tracker.SetProcessPerTimeFrame(true);
46 }
47
48 Tracker.SetGenerateSpacePoints(mIOPtrs.trdSpacePoints == nullptr);
49
52
53 if constexpr (I == GPUTRDTrackerKernels::gpuVersion) {
54 for (uint32_t i = 0; i < mIOPtrs.nMergedTracks; i++) {
56 if (!Tracker.PreCheckTrackTRDCandidate(trk)) {
57 continue;
58 }
59 const GPUTRDTrackGPU& trktrd = param().rec.tpc.nWaysOuter ? (GPUTRDTrackGPU)trk.OuterParam() : (GPUTRDTrackGPU)trk;
60 if (!Tracker.CheckTrackTRDCandidate(trktrd)) {
61 continue;
62 }
63 GPUTRDTrackerGPU::HelperTrackAttributes trkAttribs, *trkAttribsPtr{nullptr};
64 if (!isTriggeredEvent) {
65 const float tpcTBinMUS = 0.199606f;
66 trkAttribs.mTime = trk.GetParam().GetTZOffset() * tpcTBinMUS;
67 trkAttribs.mTimeAddMax = 50.f; // half of a TPC drift time in us
68 trkAttribs.mTimeSubMax = 50.f; // half of a TPC drift time in us
69 if (!trk.CCE()) {
70 if (trk.CSide()) {
71 // track has only C-side clusters
72 trkAttribs.mSide = 1;
73 } else {
74 // track has only A-side clusters
75 trkAttribs.mSide = -1;
76 }
77 }
78 trkAttribsPtr = &trkAttribs;
79 }
80 if (Tracker.LoadTrack(trktrd, i, false, trkAttribsPtr)) {
81 return 1;
82 }
83 }
84 } else {
85 for (uint32_t i = 0; i < mIOPtrs.nOutputTracksTPCO2; i++) {
86 const auto& trk = mIOPtrs.outputTracksTPCO2[i];
87
88 if (!Tracker.PreCheckTrackTRDCandidate(trk)) {
89 continue;
90 }
91 const GPUTRDTrack& trktrd = (GPUTRDTrack)trk;
92 if (!Tracker.CheckTrackTRDCandidate(trktrd)) {
93 continue;
94 }
95
96 GPUTRDTracker::HelperTrackAttributes trkAttribs, *trkAttribsPtr{nullptr};
97 if (!isTriggeredEvent) {
98 const float tpcTBinMUS = 0.199606f;
99 trkAttribs.mTime = trk.getTime0() * tpcTBinMUS;
100 trkAttribs.mTimeAddMax = trk.getDeltaTFwd() * tpcTBinMUS;
101 trkAttribs.mTimeSubMax = trk.getDeltaTBwd() * tpcTBinMUS;
102 if (trk.hasASideClustersOnly()) {
103 trkAttribs.mSide = -1;
104 } else if (trk.hasCSideClustersOnly()) {
105 trkAttribs.mSide = 1;
106 }
107 trkAttribsPtr = &trkAttribs;
108 }
109 if (Tracker.LoadTrack(trktrd, i, false, trkAttribsPtr)) {
110 return 1;
111 }
112 }
113 }
114
115 DoTRDGPUTracking<I>();
116
117 mIOPtrs.nTRDTracks = Tracker.NTracks();
118 if constexpr (I == GPUTRDTrackerKernels::gpuVersion) {
119 mIOPtrs.trdTracks = Tracker.Tracks();
120 mIOPtrs.trdTracksO2 = nullptr;
121 } else {
122 mIOPtrs.trdTracks = nullptr;
123 mIOPtrs.trdTracksO2 = Tracker.Tracks();
124 }
125 mRec->PopNonPersistentMemory(RecoStep::TRDTracking, qStr2Tag("TRDTRACK"));
126
127 return 0;
128}
129
130template <int32_t I, class T>
131int32_t GPUChainTracking::DoTRDGPUTracking(T* externalInstance)
132{
133 bool doGPU = GetRecoStepsGPU() & RecoStep::TRDTracking;
134 auto* Tracker = &processors()->getTRDTracker<I>();
135 auto* TrackerShadow = doGPU ? &processorsShadow()->getTRDTracker<I>() : Tracker;
136 if (externalInstance) {
137 if constexpr (std::is_same_v<decltype(Tracker), decltype(externalInstance)>) {
138 Tracker = externalInstance;
139 } else {
140 throw std::runtime_error("Must not provide external instance that does not match template type");
141 }
142 }
143 Tracker->PrepareTracking(this);
144
145 int32_t useStream = 0;
146
147 const auto& threadContext = GetThreadContext();
149 if (doGPU) {
150 TrackerShadow->OverrideGPUGeometry(reinterpret_cast<GPUTRDGeometry*>(mFlatObjectsDevice.mCalibObjects.trdGeometry));
151 mInputsHost->mNTRDTracklets = mInputsShadow->mNTRDTracklets = processorsShadow()->ioPtrs.nTRDTracklets = mIOPtrs.nTRDTracklets;
152 mInputsHost->mNTRDTriggerRecords = mInputsShadow->mNTRDTriggerRecords = processorsShadow()->ioPtrs.nTRDTriggerRecords = mIOPtrs.nTRDTriggerRecords;
153 mInputsHost->mDoSpacepoints = mInputsShadow->mDoSpacepoints = !Tracker->GenerateSpacepoints();
156 processorsShadow()->ioPtrs.trdSpacePoints = Tracker->GenerateSpacepoints() ? Tracker->SpacePoints() : mInputsShadow->mTRDSpacePoints;
157 if constexpr (std::is_same_v<decltype(processorsShadow()->ioPtrs.trdTracks), decltype(TrackerShadow->Tracks())>) {
158 processorsShadow()->ioPtrs.trdTracks = TrackerShadow->Tracks();
159 } else {
160 processorsShadow()->ioPtrs.trdTracks = nullptr;
161 }
164 processorsShadow()->ioPtrs.trdTrackletIdxFirst = mInputsShadow->mTRDTrackletIdxFirst;
165 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDTracklets, mIOPtrs.trdTracklets, sizeof(*mIOPtrs.trdTracklets) * mIOPtrs.nTRDTracklets, useStream, true);
166 if (!Tracker->GenerateSpacepoints()) {
167 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDSpacePoints, mIOPtrs.trdSpacePoints, sizeof(*mIOPtrs.trdSpacePoints) * mIOPtrs.nTRDTracklets, useStream, true);
168 }
169 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDTriggerTimes, mIOPtrs.trdTriggerTimes, sizeof(*mIOPtrs.trdTriggerTimes) * mIOPtrs.nTRDTriggerRecords, useStream, true);
170 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDTrackletIdxFirst, mIOPtrs.trdTrackletIdxFirst, sizeof(*mIOPtrs.trdTrackletIdxFirst) * mIOPtrs.nTRDTriggerRecords, useStream, true);
173 GPUMemCpy(RecoStep::TRDTracking, mInputsShadow->mTRDTrigRecMask, mIOPtrs.trdTrigRecMask, sizeof(*mIOPtrs.trdTrigRecMask) * mIOPtrs.nTRDTriggerRecords, useStream, true);
174 } else {
176 }
177 WriteToConstantMemory(RecoStep::TRDTracking, (char*)&processors()->ioPtrs - (char*)processors(), &processorsShadow()->ioPtrs, sizeof(processorsShadow()->ioPtrs), useStream);
178 WriteToConstantMemory(RecoStep::TRDTracking, (char*)&processors()->getTRDTracker<I>() - (char*)processors(), TrackerShadow, sizeof(*TrackerShadow), useStream);
179 }
180
181 TransferMemoryResourcesToGPU(RecoStep::TRDTracking, Tracker, useStream);
182 runKernel<GPUTRDTrackerKernels, I>(GetGridAuto(useStream), externalInstance ? Tracker : nullptr);
183 TransferMemoryResourcesToHost(RecoStep::TRDTracking, Tracker, useStream);
184 SynchronizeStream(useStream);
185
186 if (GetProcessingSettings().debugLevel >= 2) {
187 GPUInfo("GPU TRD tracker Finished");
188 }
189 return (0);
190}
191
192template int32_t GPUChainTracking::RunTRDTracking<GPUTRDTrackerKernels::gpuVersion>();
193template int32_t GPUChainTracking::DoTRDGPUTracking<GPUTRDTrackerKernels::gpuVersion>(GPUTRDTrackerGPU*);
194template int32_t GPUChainTracking::DoTRDGPUTracking<GPUTRDTrackerKernels::gpuVersion>(GPUTRDTracker*);
195template int32_t GPUChainTracking::RunTRDTracking<GPUTRDTrackerKernels::o2Version>();
196template int32_t GPUChainTracking::DoTRDGPUTracking<GPUTRDTrackerKernels::o2Version>(GPUTRDTracker*);
197template 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:123
krnlExec GetGridAuto(int32_t stream, GPUReconstruction::krnlDeviceType d=GPUReconstruction::krnlDeviceType::Auto, GPUCA_RECO_STEP st=GPUCA_RECO_STEP::NoRecoStep)
Definition GPUChain.cxx:42
GPUReconstruction::RecoStepField GetRecoStepsGPU() const
Definition GPUChain.h:68
virtual std::unique_ptr< gpu_reconstruction_kernels::threadContext > GetThreadContext()
Definition GPUChain.h:104
void WriteToConstantMemory(RecoStep step, size_t offset, const void *src, size_t size, int32_t stream=-1, deviceEvent *ev=nullptr)
Definition GPUChain.h:122
size_t AllocateRegisteredMemory(GPUProcessor *proc)
Definition GPUChain.h:209
GPUConstantMem * processors()
Definition GPUChain.h:80
GPUParam & param()
Definition GPUChain.h:83
void SetupGPUProcessor(T *proc, bool allocate)
Definition GPUChain.h:212
const GPUSettingsProcessing & GetProcessingSettings() const
Definition GPUChain.h:72
void SynchronizeStream(int32_t stream)
Definition GPUChain.h:85
GPUReconstructionCPU * mRec
Definition GPUChain.h:75
GPUConstantMem * processorsShadow()
Definition GPUChain.h:81
void TransferMemoryResourcesToHost(RecoStep step, GPUProcessor *proc, int32_t stream=-1, bool all=false)
Definition GPUChain.h:118
void TransferMemoryResourcesToGPU(RecoStep step, GPUProcessor *proc, int32_t stream=-1, bool all=false)
Definition GPUChain.h:117
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