18#include "GPUChainTrackingGetters.inc"
24#include "GPUParam.inc"
41 std::unique_ptr<GPUReconstruction>
mRec;
61 mNContexts = mConfig->configProcessing.doublePipeline ? 2 : 1;
64 mConfig->configGRP.needsClusterer = 1;
67 mConfig->configGRP.doCompClusterDecode = 1;
69 for (uint32_t
i = 0;
i < mNContexts;
i++) {
71 mConfig->configDeviceBackend.master = mCtx[0].mRec.get();
74 mConfig->configDeviceBackend.master =
nullptr;
75 if (mCtx[
i].mRec ==
nullptr) {
76 GPUError(
"Error obtaining instance of GPUReconstruction");
82 for (uint32_t
i = 0;
i < mNContexts;
i++) {
83 mCtx[
i].mChain = mCtx[
i].mRec->AddChain<
GPUChainTracking>(mConfig->configInterface.maxTPCHits, mConfig->configInterface.maxTRDTracklets);
85 mCtx[
i].mChain->SetQAFromForeignChain(mCtx[0].mChain);
87 mCtx[
i].mChain->mConfigDisplay = &mConfig->configDisplay;
88 mCtx[
i].mChain->mConfigQA = &mConfig->configQA;
89 mCtx[
i].mRec->SetSettings(&mConfig->configGRP, &mConfig->configReconstruction, &mConfig->configProcessing, &mConfig->configWorkflow);
90 mCtx[
i].mChain->SetCalibObjects(mConfig->configCalib);
97 if (mConfig->configInterface.outputToExternalBuffers) {
98 for (uint32_t
j = 0;
j < mCtx[
i].mOutputRegions->count();
j++) {
99 mCtx[
i].mChain->SetSubOutputControl(
j, &mCtx[
i].mOutputRegions->asArray()[
j]);
102 dummy.
set([](
size_t size) ->
void* {
throw std::runtime_error(
"invalid output memory request, no common output buffer set");
return nullptr; });
103 mCtx[
i].mRec->SetOutputControl(dummy);
106 for (uint32_t
i = 0;
i < mNContexts;
i++) {
107 if (
i == 0 && mCtx[
i].mRec->Init()) {
113 mCtx[
i].mRec->MemoryScalers()->factor *= 2;
116 if (mConfig->configProcessing.doublePipeline) {
117 mInternals->pipelineThread.reset(
new std::thread([
this]() { mCtx[0].mRec->RunPipelineWorker(); }));
125 if (mConfig->configProcessing.doublePipeline) {
126 mCtx[0].mRec->TerminatePipelineWorker();
127 mInternals->pipelineThread->join();
129 for (uint32_t
i = 0;
i < mNContexts;
i++) {
130 mCtx[
i].mRec->Finalize();
132 mCtx[0].mRec->Exit();
133 for (int32_t
i = mNContexts - 1;
i >= 0;
i--) {
134 mCtx[
i].mRec.reset();
142 mCtx[0].mChain->ClearIOPointers();
143 mCtx[0].mChain->mIOPtrs = *
data;
145 snprintf(fname, 1024,
"event.%d.dump", nEvent);
146 mCtx[0].mChain->DumpData(fname);
149 if (mConfig->configProcessing.runMC) {
150 mCtx[0].mChain->ForceInitQA();
151 snprintf(fname, 1024,
"mc.%d.dump", nEvent);
152 mCtx[0].mChain->GetQA()->UpdateChain(mCtx[0].mChain);
153 mCtx[0].mChain->GetQA()->DumpO2MCData(fname);
161 mCtx[0].mChain->DoQueuedUpdates(-1);
162 mCtx[0].mRec->DumpSettings();
167 if (mNContexts <= iThread) {
171 mCtx[iThread].mChain->mIOPtrs = *
data;
174 if (mConfig->configInterface.outputToExternalBuffers) {
175 for (uint32_t
i = 0;
i < mCtx[iThread].mOutputRegions->count();
i++) {
181 mCtx[iThread].mOutputRegions->asArray()[
i].reset();
187 auto inputWaitCallback = [
this, iThread, inputUpdateCallback, &
data, &outputs, &setOutputs]() {
190 if (inputUpdateCallback->
callback) {
191 inputUpdateCallback->
callback(updatedData, updatedOutputs);
192 mCtx[iThread].mChain->mIOPtrs = *updatedData;
193 outputs = updatedOutputs;
202 if (inputUpdateCallback) {
203 mCtx[iThread].mChain->SetFinalInputCallback(inputWaitCallback);
205 mCtx[iThread].mChain->SetFinalInputCallback(
nullptr);
207 if (!inputUpdateCallback || !inputUpdateCallback->
callback) {
211 int32_t
retVal = mCtx[iThread].mRec->RunChains();
215 if (mConfig->configQA.shipToQC && mCtx[iThread].mChain->QARanForTF()) {
216 outputs->
qa.
hist1 = &mCtx[iThread].mChain->GetQA()->getHistograms1D();
217 outputs->
qa.
hist2 = &mCtx[iThread].mChain->GetQA()->getHistograms2D();
218 outputs->
qa.
hist3 = &mCtx[iThread].mChain->GetQA()->getHistograms1Dd();
219 outputs->
qa.
hist4 = &mCtx[iThread].mChain->GetQA()->getGraphs();
222 *
data = mCtx[iThread].mChain->mIOPtrs;
227void GPUO2Interface::Clear(
bool clearOutputs, uint32_t iThread) { mCtx[iThread].mRec->ClearAllocatedMemory(clearOutputs); }
231 return mCtx[0].mRec->registerMemoryForGPU(
ptr,
size);
236 return mCtx[0].mRec->unregisterMemoryForGPU(
ptr);
241 for (uint32_t
i = 0;
i < mNContexts;
i++) {
242 mCtx[
i].mChain->SetUpdateCalibObjects(newCalib, newVals);
249 for (uint32_t
i = 0;
i < mNContexts;
i++) {
250 mCtx[
i].mRec->setErrorCodeOutput(
v);
263 return mCtx[iThread].mChain->GetDeviceO2Propagator();
268 prop->setGPUField(&mCtx[0].mRec->GetParam().polynomialField);
Class of a TPC cluster in TPC-native coordinates (row, time)
o2::its::VertexerTraits * GetITSVertexerTraits()
o2::its::TimeFrame * GetITSTimeframe()
o2::its::TrackerTraits * GetITSTrackerTraits()
int32_t unregisterMemoryForGPU(const void *ptr)
const o2::base::Propagator * GetDeviceO2Propagator(int32_t iThread=0) const
int32_t Initialize(const GPUO2InterfaceConfiguration &config)
void setErrorCodeOutput(std::vector< std::array< uint32_t, 4 > > *v)
void UseGPUPolynomialFieldInPropagator(o2::base::Propagator *prop) const
void DumpEvent(int32_t nEvent, GPUTrackingInOutPointers *data)
int32_t RunTracking(GPUTrackingInOutPointers *data, GPUInterfaceOutputs *outputs=nullptr, uint32_t iThread=0, GPUInterfaceInputUpdate *inputUpdateCallback=nullptr)
void GetITSTraits(o2::its::TrackerTraits *&trackerTraits, o2::its::VertexerTraits *&vertexerTraits, o2::its::TimeFrame *&timeFrame)
int32_t registerMemoryForGPU(const void *ptr, size_t size)
void Clear(bool clearOutputs, uint32_t iThread=0)
int32_t UpdateCalibration(const GPUCalibObjectsConst &newCalib, const GPUNewCalibValues &newVals, uint32_t iThread=0)
static GPUReconstruction * CreateInstance(const GPUSettingsDeviceBackend &cfg)
const std::vector< TH1F > * hist1
const std::vector< TGraphAsymmErrors > * hist4
const std::vector< TH1D > * hist3
const std::vector< TH2F > * hist2
std::unique_ptr< std::thread > pipelineThread
std::unique_ptr< GPUReconstruction > mRec
std::unique_ptr< GPUTrackingOutputs > mOutputRegions
GPUChainTracking * mChain
void set(void *p, size_t s)
std::function< void *(size_t)> allocator
GPUOutputControl * asArray()