ATLAS Offline Software
CaloGPUHybridClusterProcessor.h
Go to the documentation of this file.
1 //
2 // Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 //
4 // Dear emacs, this is -*- c++ -*-
5 //
6 
7 #ifndef CALORECGPU_CALOGPUHYBRIDCLUSTERPROCESSOR_H
8 #define CALORECGPU_CALOGPUHYBRIDCLUSTERPROCESSOR_H
9 
10 
12 #include "GaudiKernel/ToolHandle.h"
13 
15 
21 #include "CaloRecGPU/DataHolders.h"
22 
24 
27 
29 
30 #include <string>
31 #include <mutex>
32 #include <atomic>
33 #include <utility>
34 
51 {
52  public:
53 
54  CaloGPUHybridClusterProcessor(const std::string & name, ISvcLocator * pSvcLocator);
55  virtual ~CaloGPUHybridClusterProcessor() override = default;
56 
57  virtual StatusCode initialize() override
58  {
60  }
61 
62  virtual StatusCode initialize_non_CUDA() override;
63 
64  virtual StatusCode initialize_CUDA() override;
65 
66  virtual StatusCode execute(const EventContext & ctx) const override;
67  virtual StatusCode finalize() override;
68 
69  private:
70 
71 
76  ToolHandle<ICaloClusterGPUConstantTransformer> m_transformConstantData{this, "ConstantDataToGPUTool", "", "Tool for transforming the constant data and sending it to the GPU"};
77 
82  ToolHandleArray<CaloClusterCollectionProcessor> m_preGPUoperations{this, "BeforeGPUTools", {}, "Tools to be applied to the clusters on the CPU before processing them on the GPU"};
83 
84 
89  ToolHandle<ICaloClusterGPUInputTransformer> m_transformForGPU{this, "EventDataToGPUTool", "", "Tool for transforming the event data and sending it to the GPU"};
90 
95  ToolHandleArray<CaloClusterGPUProcessor> m_GPUoperations{this, "GPUTools", {}, "Tools to be applied to the clusters on the GPU"};
96 
101  ToolHandle<ICaloClusterGPUOutputTransformer> m_transformBackToCPU{this, "GPUToEventDataTool", {}, "Tool for getting the data from the GPU back to the CPU Athena data structures"};
102 
107  ToolHandleArray<CaloClusterCollectionProcessor> m_postGPUoperations{this, "AfterGPUTools", {}, "Tools to be applied to the clusters on the CPU after returning from the GPU"};
108 
109 
113  Gaudi::Property<bool> m_doPlots{this, "DoPlots", false, "Do plots based on the plotter tool optionally provided."};
114 
119  ToolHandle<ICaloClusterGPUPlotter> m_plotterTool{this, "PlotterTool", "", "An optional plotter, for testing and/or debugging purposes"};
120 
123  Gaudi::Property<bool> m_writeTriggerSpecificInfo{this, "WriteTriggerSpecificInfo", false, "Write some trigger-specific decorations and use the trigger auxiliary container."};
124 
127  SG::WriteDecorHandleKey<xAOD::CaloClusterContainer> m_mDecor_ncells {this, "Decor_ncells", "nCells", "Decorator containing the number of cells associated to a cluster"};
128 
134  Gaudi::Property<size_t> m_numPreAllocatedGPUData{this, "NumPreAllocatedDataHolders", 0, "Number of event data holders to pre-allocate on GPU memory"};
135 
138  SG::WriteHandleKey<xAOD::CaloClusterContainer> m_clusterOutput {this, "ClustersOutputName", "", "The name of the key in StoreGate for the output CaloClusterContainer"};
139 
142  SG::WriteHandleKey<CaloClusterCellLinkContainer> m_clusterCellLinkOutput{this, "ClusterCellLinksOutputName", "", "The name of the key in StoreGate for the output CaloClusterCellLinkContainer"};
143 
148  Gaudi::Property<bool> m_deferConstantDataToFirstEvent {this, "DeferConstantDataPreparationToFirstEvent", true, "Convert and send event data on first event instead of during initialize (needed for exporting geometry and noise properly)?"};
149 
150 
153  Gaudi::Property<bool> m_skipConversions {this, "SkipConversions", false, "If true, skip converting CPU to GPU data (useful if only instanting CPU tools)"};
154 
160 
166  {
167  private:
168  void * m_ptr;
169 
170  public:
171 
172  void allocate(const size_t size)
173  {
174  if (m_ptr == nullptr && size > 0)
175  {
177  }
178  }
179 
181  m_ptr(nullptr)
182  {
183  }
186  {
187  m_ptr = other.m_ptr;
188  other.m_ptr = nullptr;
189  }
191 
193  {
194  std::swap(m_ptr, other.m_ptr);
195  return (*this);
196  }
197 
199  {
200  if (m_ptr != nullptr)
201  //This check might still be needed to ensure the code behaves on non-CUDA enabled platforms
202  //where some destructors might still be called with nullptr.
203  {
205  }
206  }
207 
208  void * operator* ()
209  {
210  return m_ptr;
211  }
212 
213  void * get_pointer()
214  {
215  return m_ptr;
216  }
217 
218  };
219 
225 
233 
240 
245  mutable std::atomic<bool> m_constantDataSent;
246 
247 
252 
253 };
254 
255 #endif //CALORECGPU_CALOGPUHYBRIDCLUSTERPROCESSOR_H
SG::WriteDecorHandleKey
Property holding a SG store/key/clid/attr name from which a WriteDecorHandle is made.
Definition: StoreGate/StoreGate/WriteDecorHandleKey.h:89
CaloGPUHybridClusterProcessor::m_transformBackToCPU
ToolHandle< ICaloClusterGPUOutputTransformer > m_transformBackToCPU
The tool that will convert the data from the GPU back to the CPU.
Definition: CaloGPUHybridClusterProcessor.h:101
CaloGPUHybridClusterProcessor::m_skipConversions
Gaudi::Property< bool > m_skipConversions
If true, both constant and event data conversion is skipped.
Definition: CaloGPUHybridClusterProcessor.h:153
CaloGPUHybridClusterProcessor::finalize
virtual StatusCode finalize() override
Definition: CaloGPUHybridClusterProcessor.cxx:413
BeamSpot::mutex
std::mutex mutex
Definition: InDetBeamSpotVertex.cxx:18
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder::allocate
void allocate(const size_t size)
Definition: CaloGPUHybridClusterProcessor.h:172
CaloGPUHybridClusterProcessor::ATLAS_THREAD_SAFE
CaloRecGPU::Helpers::separate_thread_holder< simple_GPU_pointer_holder > m_temporariesThreadedHolder ATLAS_THREAD_SAFE
A way to reduce allocations over multiple threads by keeping a cache of previously allocated objects ...
Definition: CaloGPUHybridClusterProcessor.h:224
CaloGPUHybridClusterProcessor::m_temporariesSize
size_t m_temporariesSize
The size of the temporary buffer to allocate for the GPU tools that will be called.
Definition: CaloGPUHybridClusterProcessor.h:232
CaloGPUHybridClusterProcessor::m_writeTriggerSpecificInfo
Gaudi::Property< bool > m_writeTriggerSpecificInfo
If true, writes some trigger-specific decorations.
Definition: CaloGPUHybridClusterProcessor.h:123
CaloGPUHybridClusterProcessor::m_plotterTool
ToolHandle< ICaloClusterGPUPlotter > m_plotterTool
An optional plotter, for testing and/or debugging purposes.
Definition: CaloGPUHybridClusterProcessor.h:119
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder::simple_GPU_pointer_holder
simple_GPU_pointer_holder(simple_GPU_pointer_holder &&other)
Definition: CaloGPUHybridClusterProcessor.h:185
CaloGPUHybridClusterProcessor::m_GPUoperations
ToolHandleArray< CaloClusterGPUProcessor > m_GPUoperations
Tools to be applied to the clusters on the GPU.
Definition: CaloGPUHybridClusterProcessor.h:95
CaloGPUHybridClusterProcessor::execute
virtual StatusCode execute(const EventContext &ctx) const override
Definition: CaloGPUHybridClusterProcessor.cxx:164
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder::~simple_GPU_pointer_holder
~simple_GPU_pointer_holder()
Definition: CaloGPUHybridClusterProcessor.h:198
CaloGPUHybridClusterProcessor::initialize_CUDA
virtual StatusCode initialize_CUDA() override
Initialization that invokes CUDA functions.
Definition: CaloGPUHybridClusterProcessor.cxx:126
CaloGPUTimed
Base class to provide some basic common infrastructure for timing measurements...
Definition: CaloGPUTimed.h:25
CaloGPUHybridClusterProcessor::CaloGPUHybridClusterProcessor
CaloGPUHybridClusterProcessor(const std::string &name, ISvcLocator *pSvcLocator)
Definition: CaloGPUHybridClusterProcessor.cxx:31
AthReentrantAlgorithm
An algorithm that can be simultaneously executed in multiple threads.
Definition: AthReentrantAlgorithm.h:74
CaloRecGPU::CUDA_Helpers::deallocate
void deallocate(void *address)
Deallocates address in GPU memory.
CaloGPUHybridClusterProcessor::m_doPlots
Gaudi::Property< bool > m_doPlots
If true, calls the plotter specified by m_plotterTool at every tool execution.
Definition: CaloGPUHybridClusterProcessor.h:113
CaloGPUHybridClusterProcessor::initialize_non_CUDA
virtual StatusCode initialize_non_CUDA() override
Initialization that does not invoke CUDA functions.
Definition: CaloGPUHybridClusterProcessor.cxx:40
CaloGPUCUDAInitialization::initialize
virtual StatusCode initialize()
Definition: CaloGPUCUDAInitialization.h:44
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder::simple_GPU_pointer_holder
simple_GPU_pointer_holder()
Definition: CaloGPUHybridClusterProcessor.h:180
CaloGPUHybridClusterProcessor::ATLAS_THREAD_SAFE
CaloRecGPU::Helpers::separate_thread_holder< CaloRecGPU::EventDataHolder > m_eventDataThreadedHolder ATLAS_THREAD_SAFE
A way to reduce allocations over multiple threads by keeping a cache of previously allocated objects ...
Definition: CaloGPUHybridClusterProcessor.h:159
CaloGPUHybridClusterProcessor::m_mutex
std::mutex m_mutex
This mutex is locked when sending the constant data on the first event to ensure thread safety.
Definition: CaloGPUHybridClusterProcessor.h:251
SG::WriteHandleKey< xAOD::CaloClusterContainer >
WriteDecorHandleKey.h
Property holding a SG store/key/clid/attr name from which a WriteDecorHandle is made.
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder::operator*
void * operator*()
Definition: CaloGPUHybridClusterProcessor.h:208
CaloGPUHybridClusterProcessor::ATLAS_THREAD_SAFE
CaloRecGPU::ConstantDataHolder m_constantData ATLAS_THREAD_SAFE
Constant data, common for all events and persisted throughout the run.
Definition: CaloGPUHybridClusterProcessor.h:239
CaloClusterGPUProcessor.h
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder::get_pointer
void * get_pointer()
Definition: CaloGPUHybridClusterProcessor.h:213
CaloGPUHybridClusterProcessor::m_deferConstantDataToFirstEvent
Gaudi::Property< bool > m_deferConstantDataToFirstEvent
If true, the constant data is only converted and sent to the GPU on the first event,...
Definition: CaloGPUHybridClusterProcessor.h:148
CaloGPUCUDAInitialization
Base class to provide some basic common infrastructure for initializing CUDA only at the right place ...
Definition: CaloGPUCUDAInitialization.h:28
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder::operator=
simple_GPU_pointer_holder & operator=(const simple_GPU_pointer_holder &)=delete
CaloGPUHybridClusterProcessor
Algorithm to reconstruct CaloCluster objects with GPU acceleration, providing interoperability for ca...
Definition: CaloGPUHybridClusterProcessor.h:51
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
CaloGPUHybridClusterProcessor::initialize
virtual StatusCode initialize() override
Definition: CaloGPUHybridClusterProcessor.h:57
CaloGPUHybridClusterProcessor::m_constantDataSent
std::atomic< bool > m_constantDataSent
A flag to signal that the constant data has been adequately sent to the GPU.
Definition: CaloGPUHybridClusterProcessor.h:245
CaloClusterGPUTransformers.h
CaloGPUHybridClusterProcessor::m_clusterCellLinkOutput
SG::WriteHandleKey< CaloClusterCellLinkContainer > m_clusterCellLinkOutput
The name of the key in StoreGate for the output CaloClusterCellLinkContainer.
Definition: CaloGPUHybridClusterProcessor.h:142
AthReentrantAlgorithm.h
CaloRecGPU::CUDA_Helpers::allocate
void * allocate(const size_t num)
Allocates and returns the address of num bytes from GPU memory.
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder::simple_GPU_pointer_holder
simple_GPU_pointer_holder(const simple_GPU_pointer_holder &)=delete
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
CaloRecGPU::Helpers::separate_thread_holder< CaloRecGPU::EventDataHolder >
CaloNoise.h
CaloClusterCollectionProcessor.h
Base class for cluster processing tools called from CaloClusterMaker.
CaloGPUHybridClusterProcessor::m_postGPUoperations
ToolHandleArray< CaloClusterCollectionProcessor > m_postGPUoperations
Tools to be applied to the clusters after returning from the GPU.
Definition: CaloGPUHybridClusterProcessor.h:107
CaloGPUHybridClusterProcessor::m_mDecor_ncells
SG::WriteDecorHandleKey< xAOD::CaloClusterContainer > m_mDecor_ncells
Key to the handle for writing the number of cells as a decoration.
Definition: CaloGPUHybridClusterProcessor.h:127
InDetDD::other
@ other
Definition: InDetDD_Defs.h:16
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder
A simple RAII wrapper to ensure proper allocation and deallocation of GPU memory in a void * for the ...
Definition: CaloGPUHybridClusterProcessor.h:166
CaloGPUHybridClusterProcessor::simple_GPU_pointer_holder::m_ptr
void * m_ptr
Definition: CaloGPUHybridClusterProcessor.h:168
CaloGPUHybridClusterProcessor::~CaloGPUHybridClusterProcessor
virtual ~CaloGPUHybridClusterProcessor() override=default
CaloClusterContainer.h
CaloRecGPU::ConstantDataHolder
Definition: DataHolders.h:19
ReadDecorHandle.h
Handle class for reading a decoration on an object.
CaloGPUTimed.h
CaloGPUHybridClusterProcessor::m_numPreAllocatedGPUData
Gaudi::Property< size_t > m_numPreAllocatedGPUData
Number of events for which to pre-allocate space on GPU memory (should ideally be set to the expected...
Definition: CaloGPUHybridClusterProcessor.h:134
CaloGPUHybridClusterProcessor::m_preGPUoperations
ToolHandleArray< CaloClusterCollectionProcessor > m_preGPUoperations
Tools to be applied to the clusters before being sent to the GPU for processing.
Definition: CaloGPUHybridClusterProcessor.h:82
checker_macros.h
Define macros for attributes used to control the static checker.
DataHolders.h
CaloGPUHybridClusterProcessor::m_clusterOutput
SG::WriteHandleKey< xAOD::CaloClusterContainer > m_clusterOutput
The name of the key in StoreGate for the output CaloClusterContainer.
Definition: CaloGPUHybridClusterProcessor.h:138
CaloGPUCUDAInitialization.h
CaloGPUHybridClusterProcessor::m_transformConstantData
ToolHandle< ICaloClusterGPUConstantTransformer > m_transformConstantData
The tool that will convert the constant data from the CPU to the GPU.
Definition: CaloGPUHybridClusterProcessor.h:76
CaloGPUHybridClusterProcessor::m_transformForGPU
ToolHandle< ICaloClusterGPUInputTransformer > m_transformForGPU
The tool that will actually convert the data from the CPU to the GPU.
Definition: CaloGPUHybridClusterProcessor.h:89