Celeritas  0.5.0-86+4a8eea4
Public Member Functions | List of all members
celeritas::ExtendFromSecondariesAction Class Referencefinal

Create track initializers on device from secondary particles. More...

#include <ExtendFromSecondariesAction.hh>

Inheritance diagram for celeritas::ExtendFromSecondariesAction:
Inheritance graph
[legend]

Public Member Functions

 ExtendFromSecondariesAction (ActionId id)
 Construct with explicit Id.
 
Action interface

ID of the action

ActionId action_id () const final
 Short name for the action.
 
std::string_view label () const final
 Short name for the action.
 
std::string_view description () const final
 Get a long description of the action.
 
StepActionOrder order () const final
 Dependency ordering of the action.
 
ExplicitAction interface
void step (CoreParams const &, CoreStateHost &) const final
 Execute the action with host data.
 
void step (CoreParams const &, CoreStateDevice &) const final
 Execute the action with device data.
 
BeginRunAction interface
void begin_run (CoreParams const &, CoreStateHost &) final
 Warm up asynchronous allocation. More...
 
void begin_run (CoreParams const &, CoreStateDevice &) final
 Warm up asynchronous allocation. More...
 
- Public Member Functions inherited from celeritas::StepActionInterface< P, S >
virtual void step (P const &, S< MemSpace::host > &) const =0
 Execute the action with host data.
 
virtual void step (P const &, S< MemSpace::device > &) const =0
 Execute the action with device data.
 
- Public Member Functions inherited from celeritas::ActionInterface
virtual ~ActionInterface () noexcept=0
 Default destructor.
 
- Public Member Functions inherited from celeritas::BeginRunActionInterface< P, S >
virtual void begin_run (P const &, S< MemSpace::host > &)=0
 Set host data at the beginning of a run.
 
virtual void begin_run (P const &, S< MemSpace::device > &)=0
 Set device data at the beginning of a run.
 

Additional Inherited Members

- Public Types inherited from celeritas::ActionTypeTraits< P, S >
using CoreParams = P
 
using CoreStateHost = S< MemSpace::host >
 
using CoreStateDevice = S< MemSpace::device >
 
using SpanCoreStateHost = Span< S< MemSpace::host > *const >
 
using SpanCoreStateDevice = Span< S< MemSpace::device > *const >
 
- Protected Member Functions inherited from celeritas::ActionInterface
 ActionInterface ()=default
 
 CELER_DEFAULT_COPY_MOVE (ActionInterface)
 

Detailed Description

Create track initializers on device from secondary particles.

Secondaries produced by each track are ordered arbitrarily in memory, and the memory may be fragmented if not all secondaries survived cutoffs. For example, after the interactions have been processed and cutoffs applied, the track states and their secondaries might look like the following (where 'X' indicates a track or secondary that did not survive):

 thread ID   | 0   1 2           3       4   5 6           7       8   9
 track ID    | 10  X 8           7       X   5 4           X       2   1
 secondaries | [X]   [X, 11, 12] [13, X] [X]   [14, X, 15] [X, 16] [X]

Because the order in which threads receive a chunk of memory from the secondary allocator is nondeterministic, the actual ordering of the secondaries in memory is unpredictable; for instance:

secondary storage | [X, 13, X, X, 11, 12, X, X, 16, 14, X, 15, X]

When track initializers are created from secondaries, they are ordered by thread ID to ensure reproducibility. If a track that produced secondaries has died (e.g., thread ID 7 in the example above), one of its secondaries is immediately used to fill that track slot:

 thread ID   | 0   1 2           3       4   5 6           7       8   9
 track ID    | 10  X 8           7       X   5 4           16      2   1
 secondaries | [X]   [X, 11, 12] [13, X] [X]   [14, X, 15] [X, X]  [X]

This way, the geometry state is reused rather than initialized from the position (which is expensive). This also prevents the geometry state from being overwritten by another track's secondary, so if the track produced multiple secondaries, the rest are still able to copy the parent's state.

Track initializers are created from the remaining secondaries and are added to the back of the vector. The thread ID of each secondary's parent is also stored, so any new tracks initialized from secondaries produced in this step can copy the geometry state from the parent. The indices of the empty slots in the track vector are identified and stored as a sorted vector of vacancies.

 track initializers | 11 12 13 14 15
 parent             | 2  2  3  6  6
 vacancies          | 1  4

Member Function Documentation

◆ begin_run() [1/2]

void celeritas::ExtendFromSecondariesAction::begin_run ( CoreParams const &  ,
CoreStateDevice &  core_state 
)
final

Warm up asynchronous allocation.

This just calls MallocAsync before the first step, since it's used by detail::remove_if_alive under the hood.

◆ begin_run() [2/2]

void celeritas::ExtendFromSecondariesAction::begin_run ( CoreParams const &  ,
CoreStateHost &   
)
inlinefinal

Warm up asynchronous allocation.

This just calls MallocAsync before the first step, since it's used by detail::remove_if_alive under the hood.


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