ATLAS Offline Software
Loading...
Searching...
No Matches
triton::backend::traccc::TracccTritonInitializer Class Reference

Owns the embedded Athena application that backs the Traccc Triton backend, plus the process-wide device infrastructure it brings up. More...

#include <TracccTritonInitializer.h>

Collaboration diagram for triton::backend::traccc::TracccTritonInitializer:

Classes

struct  Config
 Construction parameters, normally read from the model config, plus the StoreGate keys initialize() fills in from the python configuration. More...
struct  Impl

Public Member Functions

void initialize (const Config &config)
 Boot the embedded Athena application and resolve all cached handles.
void finalize ()
 Tear the application down. Safe to call when not initialized.
bool isReady () const
 Whether initialize has completed successfully.
const Config & config () const
 The construction parameters the application was configured with.
int deviceId () const
 The CUDA device id this instance is pinned to.
ISvcLocator & serviceLocator () const
 The service locator of the embedded Athena application (never null once ready).
std::size_t acquireSlot ()
 Claim the next free event-store slot for a Triton model instance.
 ~TracccTritonInitializer ()
 TracccTritonInitializer (const TracccTritonInitializer &)=delete
TracccTritonInitializer & operator= (const TracccTritonInitializer &)=delete

Static Public Member Functions

static TracccTritonInitializer & instance ()
 Get the process-wide singleton.

Private Member Functions

 TracccTritonInitializer ()

Private Attributes

std::unique_ptr< Impl > m_impl

Detailed Description

Owns the embedded Athena application that backs the Traccc Triton backend, plus the process-wide device infrastructure it brings up.

The device reconstruction algorithms are ordinary Gaudi AthReentrantAlgorithm components: they read/write StoreGate and depend on provider tools and DetectorStore services. They therefore cannot be constructed as plain C++ objects; an initialized Athena application has to exist.

The python configuration schedules them inside a single AthSequencer named Config::sequenceName, which is what TracccTritonRunner executes; the composition and ordering of the chain therefore live entirely in TracccTritonDeviceRecoCfg.

Definition at line 38 of file TracccTritonInitializer.h.

Constructor & Destructor Documentation

◆ ~TracccTritonInitializer()

triton::backend::traccc::TracccTritonInitializer::~TracccTritonInitializer ( )

Definition at line 177 of file TracccTritonInitializer.cxx.

177 {
178 try {
179 finalize();
180 } catch (...) {
181 }
182}
void finalize()
Tear the application down. Safe to call when not initialized.

◆ TracccTritonInitializer() [1/2]

triton::backend::traccc::TracccTritonInitializer::TracccTritonInitializer ( const TracccTritonInitializer & )
delete

◆ TracccTritonInitializer() [2/2]

triton::backend::traccc::TracccTritonInitializer::TracccTritonInitializer ( )
private

Definition at line 174 of file TracccTritonInitializer.cxx.

175 : m_impl(std::make_unique<Impl>()) {}

Member Function Documentation

◆ acquireSlot()

std::size_t triton::backend::traccc::TracccTritonInitializer::acquireSlot ( )

Claim the next free event-store slot for a Triton model instance.

Exceptions
std::runtime_errorif more slots are claimed than the application was configured with.

Definition at line 277 of file TracccTritonInitializer.cxx.

277 {
278 if (!m_impl->ready) {
279 throw std::runtime_error(
280 "TracccTritonInitializer::acquireSlot: not initialized");
281 }
282 const std::size_t slot = m_impl->nextSlot.fetch_add(1);
283 if (slot >= m_impl->config.nSlots) {
284 throw std::runtime_error(
285 "TracccTritonInitializer: Triton created more model instances "
286 "than the " + std::to_string(m_impl->config.nSlots) +
287 " event slot(s) the application was configured with");
288 }
289 return slot;
290}

◆ config()

const TracccTritonInitializer::Config & triton::backend::traccc::TracccTritonInitializer::config ( ) const

The construction parameters the application was configured with.

Definition at line 272 of file TracccTritonInitializer.cxx.

272 {
273 return m_impl->config;
274}

◆ deviceId()

int triton::backend::traccc::TracccTritonInitializer::deviceId ( ) const

The CUDA device id this instance is pinned to.

Definition at line 292 of file TracccTritonInitializer.cxx.

292 {
293 return m_impl->config.deviceId;
294}

◆ finalize()

void triton::backend::traccc::TracccTritonInitializer::finalize ( )

Tear the application down. Safe to call when not initialized.

Definition at line 251 of file TracccTritonInitializer.cxx.

251 {
252 if (!m_impl->ready) return;
253
254 if (m_impl->app) {
255 // finalize() expects the INITIALIZED state, so the RUNNING state the
256 // bootstrap left the application in has to be unwound first.
257 m_impl->app->stop().ignore();
258 m_impl->app->finalize().ignore();
259 m_impl->app->terminate().ignore();
260 }
261
262 m_impl->svcLocator = nullptr;
263 m_impl->app = nullptr;
264 m_impl->ready = false;
265}

◆ initialize()

void triton::backend::traccc::TracccTritonInitializer::initialize ( const Config & config)

Boot the embedded Athena application and resolve all cached handles.

Exceptions
std::runtime_erroron any failure to bring it up.

Definition at line 192 of file TracccTritonInitializer.cxx.

192 {
193 static std::mutex initMutex;
194 std::lock_guard<std::mutex> lock(initMutex);
195
196 if (m_impl->ready) {
197 // Gaudi is a process singleton; a second initialize() with a
198 // different device id cannot be honored.
199 if (config.deviceId != m_impl->config.deviceId) {
200 throw std::runtime_error(
201 "TracccTritonInitializer: already initialized on device " +
202 std::to_string(m_impl->config.deviceId) +
203 ", cannot re-initialize on device " +
204 std::to_string(config.deviceId) +
205 ". Pin the model to a single GPU in instance_group.");
206 }
207 if (config.nSlots != m_impl->config.nSlots) {
208 throw std::runtime_error(
209 "TracccTritonInitializer: already initialized with " +
210 std::to_string(m_impl->config.nSlots) +
211 " event slots, cannot re-initialize with " +
212 std::to_string(config.nSlots));
213 }
214 return;
215 }
216
217 m_impl->config = config;
218
219 promoteSelfToGlobal();
220
221 // Fills in the StoreGate keys on m_impl->config from the python configuration
222 m_impl->bootstrapPython();
223
224 // Fetch the ApplicationMgr
225 m_impl->app = Gaudi::createApplicationMgr();
226 if (!m_impl->app) {
227 throw std::runtime_error(
228 "TracccTritonInitializer: Gaudi::createApplicationMgr() "
229 "returned null after the Python bootstrap");
230 }
231 // bootstrap() takes the application all the way to RUNNING
232 if (m_impl->app->FSMState() != Gaudi::StateMachine::RUNNING) {
233 throw std::runtime_error(
234 "TracccTritonInitializer: application manager is not "
235 "RUNNING after the Python bootstrap (FSM state " +
236 std::to_string(static_cast<int>(m_impl->app->FSMState())) + ")");
237 }
238
239 m_impl->svcLocator = SmartIF<ISvcLocator>(m_impl->app);
240 if (!m_impl->svcLocator) {
241 throw std::runtime_error(
242 "TracccTritonInitializer: could not obtain ISvcLocator");
243 }
244
245 // Sanity-check that the device chain the Runner will execute exists.
246 m_impl->algorithm(m_impl->config.sequenceName);
247
248 m_impl->ready = true;
249}
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
const Config & config() const
The construction parameters the application was configured with.

◆ instance()

TracccTritonInitializer & triton::backend::traccc::TracccTritonInitializer::instance ( )
static

Get the process-wide singleton.

Definition at line 184 of file TracccTritonInitializer.cxx.

184 {
185 // The singleton is mutable, but every method that touches its state
186 // serialises on its own mutex, so sharing it between Triton's worker
187 // threads is safe.
189 return theInstance;
190}
#define ATLAS_THREAD_SAFE
TracccTritonInitializer(const TracccTritonInitializer &)=delete

◆ isReady()

bool triton::backend::traccc::TracccTritonInitializer::isReady ( ) const

Whether initialize has completed successfully.

Definition at line 267 of file TracccTritonInitializer.cxx.

267 {
268 return m_impl->ready;
269}

◆ operator=()

TracccTritonInitializer & triton::backend::traccc::TracccTritonInitializer::operator= ( const TracccTritonInitializer & )
delete

◆ serviceLocator()

ISvcLocator & triton::backend::traccc::TracccTritonInitializer::serviceLocator ( ) const

The service locator of the embedded Athena application (never null once ready).

Used by TracccTritonRunner to look up the device chain.

Definition at line 296 of file TracccTritonInitializer.cxx.

296 {
297 if (!m_impl->svcLocator) {
298 throw std::runtime_error(
299 "TracccTritonInitializer::serviceLocator: not initialized");
300 }
301 return *m_impl->svcLocator;
302}

Member Data Documentation

◆ m_impl

std::unique_ptr<Impl> triton::backend::traccc::TracccTritonInitializer::m_impl
private

Definition at line 99 of file TracccTritonInitializer.h.


The documentation for this class was generated from the following files: