SpECTRE Documentation Coverage Report
Current view: top level - ParallelAlgorithms/Actions/MemoryMonitor - ProcessGroups.hpp Hit Total Coverage
Commit: 058fd9f3a53606b32c6beec17aafdb5fcf4268be Lines: 1 3 33.3 %
Date: 2024-04-27 02:05:51
Legend: Lines: hit not hit

          Line data    Source code
       1           0 : // Distributed under the MIT License.
       2             : // See LICENSE.txt for details.
       3             : 
       4             : #pragma once
       5             : 
       6             : #include <type_traits>
       7             : 
       8             : #include "DataStructures/DataBox/DataBox.hpp"
       9             : #include "Parallel/GlobalCache.hpp"
      10             : #include "Parallel/Info.hpp"
      11             : #include "Parallel/Invoke.hpp"
      12             : #include "Parallel/Local.hpp"
      13             : #include "Parallel/MemoryMonitor/MemoryMonitor.hpp"
      14             : #include "Parallel/TypeTraits.hpp"
      15             : #include "Utilities/Serialization/Serialize.hpp"
      16             : 
      17             : namespace mem_monitor {
      18             : /*!
      19             :  * \brief Simple action meant to be run on every branch of a Group or NodeGroup
      20             :  * that computes the size of the local branch and reports that size to the
      21             :  * MemoryMonitor using the ContributeMemoryData simple action.
      22             :  */
      23           1 : struct ProcessGroups {
      24             :   template <typename ParallelComponent, typename DbTags, typename Metavariables,
      25             :             typename ArrayIndex>
      26           0 :   static void apply(db::DataBox<DbTags>& /*box*/,
      27             :                     Parallel::GlobalCache<Metavariables>& cache,
      28             :                     const ArrayIndex& array_index, const double time) {
      29             :     static_assert(Parallel::is_group_v<ParallelComponent> or
      30             :                       Parallel::is_nodegroup_v<ParallelComponent>,
      31             :                   "ProcessGroups can only be run on Group or Nodegroup "
      32             :                   "parallel components.");
      33             :     static_assert(std::is_same_v<ArrayIndex, int>,
      34             :                   "ArrayIndex of Group or Nodegroup parallel components must "
      35             :                   "be an int to use the ProcessGroups action.");
      36             : 
      37             :     auto& singleton_proxy =
      38             :         Parallel::get_parallel_component<MemoryMonitor<Metavariables>>(cache);
      39             : 
      40             :     auto& group_proxy =
      41             :         Parallel::get_parallel_component<ParallelComponent>(cache);
      42             : 
      43             :     const double size_in_bytes = static_cast<double>(
      44             :         size_of_object_in_bytes(*Parallel::local_branch(group_proxy)));
      45             : 
      46             :     const double size_in_MB = size_in_bytes / 1.0e6;
      47             : 
      48             :     // Note that we don't call Parallel::contribute_to_reduction here. This is
      49             :     // because Charm requires that all calls to contribute_to_reduction happen
      50             :     // in the exact same order every time, otherwise it is undefined behavior.
      51             :     // However, this simple action (ProcessGroups) is called on each branch
      52             :     // of a group or nodegroup. Because this is a simple action, the order that
      53             :     // the branches run the simple actions is completely random based on
      54             :     // communication patterns in charm. Thus, calling contribute_to_reduction
      55             :     // here would result in undefined behavior.
      56             :     // Also note that `array_index` here is my_node for nodegroups and my_proc
      57             :     // for groups
      58             :     Parallel::simple_action<ContributeMemoryData<ParallelComponent>>(
      59             :         singleton_proxy, time, array_index, size_in_MB);
      60             :   }
      61             : };
      62             : }  // namespace mem_monitor

Generated by: LCOV version 1.14