diff --git a/include/openmc/event.h b/include/openmc/event.h index 7a654b6af..ef6163d9a 100644 --- a/include/openmc/event.h +++ b/include/openmc/event.h @@ -73,6 +73,7 @@ extern int64_t max_particles_in_flight; void init_event_queues(int64_t n_particles); void free_event_queues(void); void dispatch_xs_event(int64_t i); +void process_init_events(int64_t n_particles, int64_t source_offset); void process_calculate_xs_events(QueueItem* queue, int64_t n); void process_advance_particle_events(); void process_surface_crossing_events(); diff --git a/include/openmc/timer.h b/include/openmc/timer.h index b2d5f0005..cc20751a8 100644 --- a/include/openmc/timer.h +++ b/include/openmc/timer.h @@ -25,6 +25,12 @@ extern Timer time_sample_source; extern Timer time_tallies; extern Timer time_total; extern Timer time_transport; +extern Timer time_event_init; +extern Timer time_event_calculate_xs; +extern Timer time_event_advance_particle; +extern Timer time_event_surface_crossing; +extern Timer time_event_collision; +extern Timer time_event_death; } // namespace simulation diff --git a/src/event.cpp b/src/event.cpp index 9e4010070..a40f67152 100644 --- a/src/event.cpp +++ b/src/event.cpp @@ -1,5 +1,7 @@ #include "openmc/event.h" #include "openmc/material.h" +#include "openmc/simulation.h" +#include "openmc/timer.h" namespace openmc { @@ -80,10 +82,23 @@ void dispatch_xs_event(int64_t i) } } +void process_init_events(int64_t n_particles, int64_t source_offset) +{ + simulation::time_event_init.start(); + #pragma omp parallel for schedule(runtime) + for (int64_t i = 0; i < n_particles; i++) { + initialize_history(&simulation::particles[i], source_offset + i + 1); + dispatch_xs_event(i); + } + simulation::time_event_init.stop(); +} + void process_calculate_xs_events(QueueItem* queue, int64_t n) { - // Sort queue by energy - std::sort(queue, queue+n); + simulation::time_event_calculate_xs.start(); + + // TODO: Sort queue by particle type, material type, and energy + //std::sort(queue, queue+n); // Save last_ members, find grid index #pragma omp parallel for schedule(runtime) @@ -93,10 +108,14 @@ void process_calculate_xs_events(QueueItem* queue, int64_t n) enqueue_particle(simulation::advance_particle_queue.get(), simulation::advance_particle_queue_length, p, queue[i].idx, true); } + + simulation::time_event_calculate_xs.stop(); } void process_advance_particle_events() { + simulation::time_event_advance_particle.start(); + #pragma omp parallel for schedule(runtime) for (int64_t i = 0; i < simulation::advance_particle_queue_length; i++) { int64_t buffer_idx = simulation::advance_particle_queue[i].idx; @@ -110,10 +129,14 @@ void process_advance_particle_events() simulation::collision_queue_length, p, buffer_idx, true); } } + + simulation::time_event_advance_particle.stop(); } void process_surface_crossing_events() { + simulation::time_event_surface_crossing.start(); + #pragma omp parallel for schedule(runtime) for (int64_t i = 0; i < simulation::surface_crossing_queue_length; i++) { int64_t buffer_index = simulation::surface_crossing_queue[i].idx; @@ -123,11 +146,14 @@ void process_surface_crossing_events() if (p->alive_) dispatch_xs_event(buffer_index); } - + + simulation::time_event_surface_crossing.stop(); } void process_collision_events() { + simulation::time_event_collision.start(); + #pragma omp parallel for schedule(runtime) for (int64_t i = 0; i < simulation::collision_queue_length; i++) { int64_t buffer_index = simulation::collision_queue[i].idx; @@ -138,15 +164,18 @@ void process_collision_events() dispatch_xs_event(buffer_index); } + simulation::time_event_collision.stop(); } void process_death_events(int64_t n_particles) { + simulation::time_event_death.start(); #pragma omp parallel for schedule(runtime) for (int64_t i = 0; i < n_particles; i++) { Particle* p = &simulation::particles[i]; p->event_death(); } + simulation::time_event_death.stop(); } } // namespace openmc diff --git a/src/output.cpp b/src/output.cpp index ff66f7327..1911606ef 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -466,6 +466,12 @@ void print_runtime() show_time("Total time in simulation", time_inactive.elapsed() + time_active.elapsed()); show_time("Time in transport only", time_transport.elapsed(), 1); + show_time("Event time: Init", time_event_init.elapsed(), 2); + show_time("Event time: XS Lookup", time_event_calculate_xs.elapsed(), 2); + show_time("Event time: Advance", time_event_advance_particle.elapsed(), 2); + show_time("Event time: Surface", time_event_surface_crossing.elapsed(), 2); + show_time("Event time: Collision", time_event_collision.elapsed(), 2); + show_time("Event time: Death", time_event_death.elapsed(), 2); if (settings::run_mode == RUN_MODE_EIGENVALUE) { show_time("Time in inactive batches", time_inactive.elapsed(), 1); } diff --git a/src/simulation.cpp b/src/simulation.cpp index b58f39739..91c013396 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp @@ -621,11 +621,7 @@ void transport_event_based() int64_t n_particles = std::min(remaining_work, simulation::max_particles_in_flight); // Initialize all particle histories for this subiteration - #pragma omp parallel for schedule(runtime) - for (auto i = 0; i < n_particles; i++) { - initialize_history(&simulation::particles[i], source_offset + i + 1); - dispatch_xs_event(i); - } + process_init_events(n_particles, source_offset); int events_retired = 0; @@ -663,6 +659,7 @@ void transport_event_based() events_retired++; } + // Execute death events for all particles process_death_events(n_particles); remaining_work -= n_particles; diff --git a/src/timer.cpp b/src/timer.cpp index 616140aa9..fdb10f0f2 100644 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -20,6 +20,12 @@ Timer time_sample_source; Timer time_tallies; Timer time_total; Timer time_transport; +Timer time_event_init; +Timer time_event_calculate_xs; +Timer time_event_advance_particle; +Timer time_event_surface_crossing; +Timer time_event_collision; +Timer time_event_death; } // namespace simulation @@ -73,6 +79,12 @@ void reset_timers() simulation::time_tallies.reset(); simulation::time_total.reset(); simulation::time_transport.reset(); + simulation::time_event_init.reset(); + simulation::time_event_calculate_xs.reset(); + simulation::time_event_advance_particle.reset(); + simulation::time_event_surface_crossing.reset(); + simulation::time_event_collision.reset(); + simulation::time_event_death.reset(); } } // namespace openmc