I apologize in advance for the long post. I’m trying to provide as much relevant information as possible.
Model description:
I am modeling a simple MSR, and have two models, A and B. Both models have the same geometry, consisting of concentric spheres/spherical shells of inner moderator, fuel, outer moderator, and a blanket.
I am performing transport-coupled depletion simulations for both models, and the only difference between Model A and Model B is the number of material transfer rates.
- Model A has a single transfer rate from the fuel to an off-gas system material representing the removal of Xe and Kr. Total number of depletable materials: 4
- Model B has additional transfer rates between the internal (represented in the geometry) fuel, blanket, and moderator and their external (not modeled explicitly) counter parts. In this case the Xe and Kr are removed from the external fuel. Total number of depletable materials: 7
Simulation/run settings:
For both models I simulated 150,000 particles, 200 batches, 20 of which were inactive.
The calculations were performed on a HPC which uses slurm as a workload manager. I installed OpenMC in a conda environment, and when I run openmc -v while in the environment I obtain the following output:
OpenMC version 0.15.3
Commit hash: 27e38e894697bb32a1dac7848d2618818b6b8daf
Copyright (c) 2011-2025 MIT, UChicago Argonne LLC, and contributors
MIT/X license at < License Agreement — OpenMC Documentation >
Build type: Release
Compiler ID: GNU 14.3.0
MPI enabled: yes
Parallel HDF5 enabled: yes
PNG support: yes
DAGMC support: yes
libMesh support: no
MCPL support: no
Coverage testing: no
Profiling flags: no
UWUW support: n
For both models, the simulation is run using both OpenMP and MPI parallelism on a single node, with 8 MPI processes (tasks) and 16 OpenMP threads per MPI process.
Both models are depleted for a single 30 day step using the following integrator:
integrator = openmc.deplete.PredictorIntegrator(operator = operator, timesteps = [30], timestep_units = ‘d’, power = 1e6, solver = ‘cram16’)
The issue:
My question pertains to the run time and CPU utilization of these calculations.
- Model A uses 4.7 hours (wallclock time), has a CPU utilization of 91.7%, and memory usage of 48.4 GiB.
- Model B uses 7.8 hours (wallclock time), has a CPU utilization of 50.1%, and memory usage of 48.4 GiB.
The increased runtime for Model B initially made sense to me since the model has additional materials to deplete, but the significantly lower CPU utilization surprised me. After some reading on other posts ( Depletion simulation on supercomputer gets stuck between depletion steps. - #21 by pdeng and Determing real simulation time - #6 by Jarret ) I assumed that either my runs were getting stuck on the “creating openmc_simulation_nX.h5…” step or that I was simply observing a consequence of depletion being performed sequentially.
To investigate this further I looked at the runtime information contained in the depletion_results.h5 and openmc_simulation.h5 files. Here’s what I found + some quantities I calculated:
Model A:
- Transport time: 16173.206191880001 seconds
- Statepoint time: 0.06152004899999999 seconds
- Burn-up time (average): 0.6852113008499146 seconds
- Burn-up time * # depletable materials: 2.740845203399658 seconds
- Total (slurm) time: 16920.0 seconds
- transport + BU time (all mat): 16175.9470370834 seconds
- CPU utilization (%): 91.7
Model B:
- Transport time: 13319.936292557 seconds
- Statepoint time: 0.058729711999999996 seconds
- Burn-up time (average): 1677.14281725032 seconds
- Burn-up time * # depletable materials: 11739.99972075224 seconds
- transport + BU time (all mat) 25059.93601330924 seconds
- Total (slurm) time: 28080.0 seconds
- CPU utilization (%): 50.1
According to these files the program is spending barely anytime writing statepoint files for either model. When I sum the transport time and what I assume is the time performing transmutation calculations there is still a significant amount of time leftover in the total slurm wall-clock time. Almost 800 seconds for Model A and 3000 seconds for Model B. I took another look at the time information in the final statepoint.h5 file for both models and got the following:
| B | C | |
|---|---|---|
| Key | Model A statepoint.h5 | Model B statepoint.h5 |
| SEND-RECV source sites | 0.031202494999999983 | 0.031676670000000004 |
| accumulating tallies | 0.5846612360000003 | 0.36081441200000003 |
| active batches | 8160.979186167 | 7433.907243442 |
| inactive batches | 367.416181962 | 355.833702045 |
| reading cross sections | 0.0 | 0.0 |
| sampling source sites | 0.160469112 | 0.16418679499999994 |
| simulation | 8528.395258101 | 7789.740831161 |
| synchronizing fission bank | 564.1339287830001 | 2017.9341377629996 |
| total | 8528.949728731 | 7790.286593861 |
| total initialization | 0.0 | 0.0 |
| transport | 7963.5831385599995 | 5771.347751955998 |
| writing statepoints | 0.005471432 | 0.0054026 |
From these numbers the “synchronizing fission bank” numbers stand out to me, as they are ‘relatively’ close to the above discrepancy. Then again, I may be imagining a connection where there is none.
I don’t know at what point openmc performs the fission bank synchronization, does this occur before the next transport calculation? Would this overlap with the program printing “creating state point …” line? I would guess that the time spent synchronizing fission banks depends on the number of MPI processes and the system architecture on which I’m running the calculation, but is there some way in which this time can be reduced? Or is it simply something I should approach using trial and error to see what job parameters give me the best performance? I’m also a little confused why Model B would have a fission bank synchronization time so much longer than Model A when the actual geometry in which neutrons are tracked is identical for both.