From 27cf943629bf8a58e19de4f8e8bc10045042f31f Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Tue, 8 Apr 2025 11:26:52 +0200 Subject: [PATCH 1/2] ITS3: GPU tracking Signed-off-by: Felix Schlepper --- .../include/ITS3Workflow/RecoWorkflow.h | 1 + .../ITS3/workflow/src/RecoWorkflow.cxx | 40 +++++++++++++++++-- .../ITS3/workflow/src/its3-reco-workflow.cxx | 4 +- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h b/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h index bac8a128c5b39..1760aa1d850eb 100644 --- a/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h +++ b/Detectors/Upgrades/ITS3/workflow/include/ITS3Workflow/RecoWorkflow.h @@ -26,6 +26,7 @@ namespace o2::its3::reco_workflow framework::WorkflowSpec getWorkflow(bool useMC, const std::string& trmode, o2::gpu::GPUDataTypes::DeviceType dtype, + bool useGPUWorkflow, bool upstreamDigits, bool upstreamClusters, bool disableRootOutput, diff --git a/Detectors/Upgrades/ITS3/workflow/src/RecoWorkflow.cxx b/Detectors/Upgrades/ITS3/workflow/src/RecoWorkflow.cxx index 721ef36335631..b77dacd61398b 100644 --- a/Detectors/Upgrades/ITS3/workflow/src/RecoWorkflow.cxx +++ b/Detectors/Upgrades/ITS3/workflow/src/RecoWorkflow.cxx @@ -15,12 +15,18 @@ #include "ITS3Workflow/TrackerSpec.h" #include "ITS3Workflow/TrackWriterSpec.h" #include "ITS3Workflow/DigitReaderSpec.h" -#include "Framework/Logger.h" +#include "GPUWorkflow/GPUWorkflowSpec.h" +#include "Framework/CCDBParamSpec.h" + +// Dummy pointers +using CompletionPolicyData = std::vector; +static CompletionPolicyData gPolicyData; +static std::shared_ptr gTask; namespace o2::its3::reco_workflow { -framework::WorkflowSpec getWorkflow(bool useMC, const std::string& trmode, o2::gpu::GPUDataTypes::DeviceType dtype, +framework::WorkflowSpec getWorkflow(bool useMC, const std::string& trmode, o2::gpu::GPUDataTypes::DeviceType dtype, bool useGPUWorkflow, bool upstreamDigits, bool upstreamClusters, bool disableRootOutput, bool useGeom, int useTrig, bool overrideBeamPosition) { framework::WorkflowSpec specs; @@ -38,8 +44,36 @@ framework::WorkflowSpec getWorkflow(bool useMC, const std::string& trmode, o2::g } if (trmode != "off") { - specs.emplace_back(o2::its3::getTrackerSpec(useMC, useGeom, useTrig, trmode, overrideBeamPosition, dtype)); + if (useGPUWorkflow) { + o2::gpu::GPURecoWorkflowSpec::Config cfg; + cfg.runITSTracking = true; + cfg.isITS3 = true; + cfg.itsTriggerType = useTrig; + cfg.itsOverrBeamEst = overrideBeamPosition; + cfg.processMC = useMC; + Inputs ggInputs; + auto ggRequest = std::make_shared(false, true, false, true, true, + useGeom ? o2::base::GRPGeomRequest::Aligned : o2::base::GRPGeomRequest::None, + ggInputs, true); + if (!useGeom) { + ggRequest->addInput({"itsTGeo", "ITS", "GEOMTGEO", 0, Lifetime::Condition, framework::ccdbParamSpec("ITS/Config/Geometry")}, ggInputs); + } + + auto task = std::make_shared(&gPolicyData, cfg, std::vector(), 0, ggRequest); + gTask = task; + Inputs taskInputs = task->inputs(); + Options taskOptions = task->options(); + std::move(ggInputs.begin(), ggInputs.end(), std::back_inserter(taskInputs)); + specs.emplace_back(DataProcessorSpec{ + "its3-gpu-tracker", + taskInputs, + task->outputs(), + AlgorithmSpec{adoptTask(task)}, + taskOptions}); + } else { + specs.emplace_back(o2::its3::getTrackerSpec(useMC, useGeom, useTrig, trmode, overrideBeamPosition, dtype)); + } if (!disableRootOutput) { specs.emplace_back(o2::its3::getTrackWriterSpec(useMC)); } diff --git a/Detectors/Upgrades/ITS3/workflow/src/its3-reco-workflow.cxx b/Detectors/Upgrades/ITS3/workflow/src/its3-reco-workflow.cxx index b8aec2541d31f..2f0eda73742cb 100644 --- a/Detectors/Upgrades/ITS3/workflow/src/its3-reco-workflow.cxx +++ b/Detectors/Upgrades/ITS3/workflow/src/its3-reco-workflow.cxx @@ -48,6 +48,7 @@ void customize(std::vector& workflowOptions) {"tracking-mode", o2::framework::VariantType::String, "off", {"off,sync,async,cosmics"}}, {"configKeyValues", VariantType::String, "", {"Semicolon separated key=value strings"}}, {"use-full-geometry", o2::framework::VariantType::Bool, false, {"use full geometry instead of the light-weight IT3 part"}}, + {"use-gpu-workflow", o2::framework::VariantType::Bool, false, {"use GPU workflow (default: false)"}}, {"gpu-device", o2::framework::VariantType::Int, 1, {"use gpu device: CPU=1,CUDA=2,HIP=3 (default: CPU)"}}}; o2::raw::HBFUtilsInitializer::addConfigOption(options); std::swap(workflowOptions, options); @@ -67,6 +68,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext) auto extClusters = configcontext.options().get("clusters-from-upstream"); auto disableRootOutput = configcontext.options().get("disable-root-output"); auto useGeom = configcontext.options().get("use-full-geometry"); + auto useGPUWfx = configcontext.options().get("use-gpu-workflow"); std::transform(trmode.begin(), trmode.end(), trmode.begin(), [](unsigned char c) { return std::tolower(c); }); o2::conf::ConfigurableParam::updateFromString(configcontext.options().get("configKeyValues")); @@ -80,7 +82,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext) LOG(fatal) << "Unknown trigger type requested for events prescaling: " << selTrig; } } - auto wf = o2::its3::reco_workflow::getWorkflow(useMC, trmode, gpuDevice, extDigits, extClusters, disableRootOutput, useGeom, trType, beamPosOVerride); + auto wf = o2::its3::reco_workflow::getWorkflow(useMC, trmode, gpuDevice, useGPUWfx, extDigits, extClusters, disableRootOutput, useGeom, trType, beamPosOVerride); // configure dpl timer to inject correct firstTForbit: start from the 1st orbit of TF containing 1st sampled orbit o2::raw::HBFUtilsInitializer hbfIni(configcontext, wf); From 71eb2fdd80db2e4ae0fb839ece8338dd8000bb19 Mon Sep 17 00:00:00 2001 From: Felix Schlepper Date: Tue, 8 Apr 2025 11:26:15 +0200 Subject: [PATCH 2/2] GPU: Add ITS3 to workflow Signed-off-by: Felix Schlepper --- GPU/Workflow/CMakeLists.txt | 3 ++- .../include/GPUWorkflow/GPUWorkflowSpec.h | 1 + GPU/Workflow/src/GPUWorkflowITS.cxx | 16 ++++++++++++++++ GPU/Workflow/src/GPUWorkflowSpec.cxx | 10 +++++++--- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/GPU/Workflow/CMakeLists.txt b/GPU/Workflow/CMakeLists.txt index aa725168b9db2..db8d22dda1bae 100644 --- a/GPU/Workflow/CMakeLists.txt +++ b/GPU/Workflow/CMakeLists.txt @@ -27,7 +27,8 @@ o2_add_library(GPUWorkflow O2::DataFormatsGlobalTracking O2::DataFormatsTRD PRIVATE_LINK_LIBRARIES O2::GPUTracking - O2::ITSTrackingInterface) + O2::ITSTrackingInterface + $<$:O2::ITS3TrackingInterface>) o2_add_executable(reco-workflow COMPONENT_NAME gpu diff --git a/GPU/Workflow/include/GPUWorkflow/GPUWorkflowSpec.h b/GPU/Workflow/include/GPUWorkflow/GPUWorkflowSpec.h index eda3b28c6cff6..0038233f1c376 100644 --- a/GPU/Workflow/include/GPUWorkflow/GPUWorkflowSpec.h +++ b/GPU/Workflow/include/GPUWorkflow/GPUWorkflowSpec.h @@ -130,6 +130,7 @@ class GPURecoWorkflowSpec : public o2::framework::Task bool runITSTracking = false; bool itsOverrBeamEst = false; bool tpcTriggerHandling = false; + bool isITS3 = false; }; GPURecoWorkflowSpec(CompletionPolicyData* policyData, Config const& specconfig, std::vector const& tpcsectors, uint64_t tpcSectorMask, std::shared_ptr& ggr, std::function** gPolicyOrder = nullptr); diff --git a/GPU/Workflow/src/GPUWorkflowITS.cxx b/GPU/Workflow/src/GPUWorkflowITS.cxx index db9303c431ae7..e56958cba2c9b 100644 --- a/GPU/Workflow/src/GPUWorkflowITS.cxx +++ b/GPU/Workflow/src/GPUWorkflowITS.cxx @@ -20,6 +20,10 @@ #include "ITStracking/TrackingInterface.h" +#ifdef ENABLE_UPGRADES +#include "ITS3Reconstruction/TrackingInterface.h" +#endif + namespace o2::gpu { @@ -35,6 +39,18 @@ void GPURecoWorkflowSpec::initFunctionITS(o2::framework::InitContext& ic) { o2::its::VertexerTraits* vtxTraits = nullptr; o2::its::TrackerTraits* trkTraits = nullptr; +#ifdef ENABLE_UPGRADES + if (mSpecConfig.isITS3) { + mITSTrackingInterface = std::make_unique(mSpecConfig.processMC, + mSpecConfig.itsTriggerType, + mSpecConfig.itsOverrBeamEst); + } else +#endif + { + mITSTrackingInterface = std::make_unique(mSpecConfig.processMC, + mSpecConfig.itsTriggerType, + mSpecConfig.itsOverrBeamEst); + } mITSTrackingInterface = std::make_unique(mSpecConfig.processMC, mSpecConfig.itsTriggerType, mSpecConfig.itsOverrBeamEst); diff --git a/GPU/Workflow/src/GPUWorkflowSpec.cxx b/GPU/Workflow/src/GPUWorkflowSpec.cxx index aa4f3cfca1289..7ad03ec58ae80 100644 --- a/GPU/Workflow/src/GPUWorkflowSpec.cxx +++ b/GPU/Workflow/src/GPUWorkflowSpec.cxx @@ -1174,9 +1174,13 @@ Inputs GPURecoWorkflowSpec::inputs() } else if (mSpecConfig.itsTriggerType == 2) { inputs.emplace_back("phystrig", "TRD", "TRKTRGRD", 0, Lifetime::Timeframe); } - inputs.emplace_back("itscldict", "ITS", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/ClusterDictionary")); - inputs.emplace_back("itsalppar", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam")); - + if (mSpecConfig.isITS3) { + inputs.emplace_back("cldict", "IT3", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("IT3/Calib/ClusterDictionary")); + inputs.emplace_back("alppar", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam")); + } else { + inputs.emplace_back("itscldict", "ITS", "CLUSDICT", 0, Lifetime::Condition, ccdbParamSpec("ITS/Calib/ClusterDictionary")); + inputs.emplace_back("itsalppar", "ITS", "ALPIDEPARAM", 0, Lifetime::Condition, ccdbParamSpec("ITS/Config/AlpideParam")); + } if (mSpecConfig.itsOverrBeamEst) { inputs.emplace_back("meanvtx", "GLO", "MEANVERTEX", 0, Lifetime::Condition, ccdbParamSpec("GLO/Calib/MeanVertex", {}, 1)); }