ATLAS Offline Software
Loading...
Searching...
No Matches
G4ThreadInitTool Class Reference

A tool which sets up the worker-thread-local workspace for Geant4. More...

#include <G4ThreadInitTool.h>

Inheritance diagram for G4ThreadInitTool:
Collaboration diagram for G4ThreadInitTool:

Public Member Functions

 G4ThreadInitTool (const std::string &, const std::string &, const IInterface *)
 Standard tool constructor.
virtual void initThread () override final
 Set up the Geant4 workspace for this worker thread.
virtual void terminateThread () override final
 Tear down the Geant4 workspace for this worker thread.
virtual unsigned int nInit () const override final
 Counter used for barrier mechanism in thread initialization.

Private Attributes

std::atomic_uint m_nInitThreads
 Counter of threads that have been initialized.

Detailed Description

A tool which sets up the worker-thread-local workspace for Geant4.

Author
Steve Farrell Steve.nosp@m.n.Fa.nosp@m.rrell.nosp@m.@cer.nosp@m.n.ch

Definition at line 19 of file G4ThreadInitTool.h.

Constructor & Destructor Documentation

◆ G4ThreadInitTool()

G4ThreadInitTool::G4ThreadInitTool ( const std::string & type,
const std::string & name,
const IInterface * parent )

Standard tool constructor.

Definition at line 27 of file G4ThreadInitTool.cxx.

30 : base_class(type, name, parent),
32{}
std::atomic_uint m_nInitThreads
Counter of threads that have been initialized.

Member Function Documentation

◆ initThread()

void G4ThreadInitTool::initThread ( )
finaloverridevirtual

Set up the Geant4 workspace for this worker thread.

Definition at line 38 of file G4ThreadInitTool.cxx.

39{
40 ATH_MSG_INFO("==> tbb thread started with id: 0x" <<
41 std::hex << pthread_self() << std::dec);
42
43 // Define the G4 worker thread context and setup its cleanup mechanism.
44 auto wThreadContext = new G4WorkerThread;
45 G4AutoDelete::Register(wThreadContext);
46
47 // Assign the thread ID
48 static std::atomic_uint tid(0);
49 wThreadContext->SetThreadId( tid++ );
50 G4Threading::G4SetThreadId( wThreadContext->GetThreadId() );
51
52 // Setup thread-local geometry and physics
53 wThreadContext->BuildGeometryAndPhysicsVector();
54
55 // Retrieve the master thread run manager
56 G4MTRunManager* masterRM = G4MTRunManager::GetMasterRunManager();
57 // Worker thread initialization object
58 const G4UserWorkerThreadInitialization* workerInitializer =
59 masterRM->GetUserWorkerThreadInitialization();
60
61 // Random number setup.
62 // TODO: revisit this once MT AthRNGSvc is available.
63 const CLHEP::HepRandomEngine* masterEngine = masterRM->getMasterRandomEngine();
64 workerInitializer->SetupRNGEngine(masterEngine);
65
66 // Create the thread-local worker run manager (G4AtlasWorkerRunManager)
67 ATH_MSG_INFO("Creating worker RM");
68 G4WorkerRunManager* wrm = workerInitializer->CreateWorkerRunManager();
69 wrm->SetWorkerThread(wThreadContext);
70
71 // Share detector from master with worker.
72 ATH_MSG_INFO("Assigning detector construction");
73 // I don't want to const-cast here, but this is what they do in G4's
74 // StartThread function, so there is likely no alternative.
75 // Should not be a problem for threading.
76 G4VUserDetectorConstruction* detector ATLAS_THREAD_SAFE =
77 const_cast<G4VUserDetectorConstruction*> (masterRM->GetUserDetectorConstruction());
78 wrm->G4RunManager::SetUserInitialization (detector);
79 // Share physics list from master with worker.
80 // Should not be a problem for threading.
81 G4VUserPhysicsList* physicslist ATLAS_THREAD_SAFE =
82 const_cast<G4VUserPhysicsList*>(masterRM->GetUserPhysicsList());
83 wrm->SetUserInitialization(physicslist);
84
85 // Build thread-local user actions - NOT CURRENTLY USED.
86 if(masterRM->GetUserActionInitialization()) {
87 masterRM->GetNonConstUserActionInitialization()->Build();
88 }
89
90 // Start user worker initialization
91 if(masterRM->GetUserWorkerInitialization()) {
92 masterRM->GetUserWorkerInitialization()->WorkerStart();
93 }
94
95 // Initialize the worker run manager
96 ATH_MSG_INFO("Initializing worker RM");
97 wrm->Initialize();
98
99 // Start user worker run
100 if(masterRM->GetUserWorkerInitialization()) {
101 masterRM->GetUserWorkerInitialization()->WorkerRunStart();
102 }
103
104 // Copy the UI commands to the worker
105 std::vector<G4String> cmds = masterRM->GetCommandStack();
106 ATH_MSG_INFO (cmds.size() << " commands in UI stack");
107 G4UImanager* uimgr = G4UImanager::GetUIpointer();
108 for(const auto& it : cmds) {
109 ATH_MSG_INFO ("Adding command to worker: " << it);
110 uimgr->ApplyCommand(it);
111 }
112
113 // Atomic increment number of initialized threads
115
116 ATH_MSG_INFO("==> tbb thread end of initThread with id: 0x" <<
117 std::hex << pthread_self() << std::dec);
118}
#define ATH_MSG_INFO(x)
#define ATLAS_THREAD_SAFE

◆ nInit()

virtual unsigned int G4ThreadInitTool::nInit ( ) const
inlinefinaloverridevirtual

Counter used for barrier mechanism in thread initialization.

This number needs to be correctly reported to properly ensure scheduling of thread-initialization tasks on every thread.

Definition at line 36 of file G4ThreadInitTool.h.

36 {
37 return m_nInitThreads;
38 }

◆ terminateThread()

void G4ThreadInitTool::terminateThread ( )
finaloverridevirtual

Tear down the Geant4 workspace for this worker thread.

Definition at line 123 of file G4ThreadInitTool.cxx.

124{
125 ATH_MSG_DEBUG("terminateThread ==> tbb thread 0x" <<
126 std::hex << pthread_self() << std::dec);
127
128 // Geant4 worker finalization
129 auto runMgr = G4RunManager::GetRunManager();
130 ATH_MSG_DEBUG("G4RunManager ptr" << runMgr);
131 if(runMgr) {
132 runMgr->RunTermination();
133 ATH_MSG_INFO("terminateThread ==> safely called G4AtlasWorkerRunManager::RunTermination for tbb thread 0x" <<
134 std::hex << pthread_self() << std::dec);
135 // Atomic decrement number of initialized threads
137 }
138 else {
139 ATH_MSG_WARNING("skipping attempt to call terminateThread for tbb thread 0x" <<
140 std::hex << pthread_self() << std::dec <<
141 " without having first called initThread.");
142 // Not decrementing m_nInitThreads as initThread was not called in this case.
143 }
144}
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)

Member Data Documentation

◆ m_nInitThreads

std::atomic_uint G4ThreadInitTool::m_nInitThreads
private

Counter of threads that have been initialized.

Definition at line 43 of file G4ThreadInitTool.h.


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