Branch data Line data Source code
1 : : // ***************************************************************************** 2 : : /*! 3 : : \file src/Inciter/GraphReducer.cpp 4 : : \copyright 2012-2015 J. Bakosi, 5 : : 2016-2018 Los Alamos National Security, LLC., 6 : : 2019-2021 Triad National Security, LLC., 7 : : 2022-2024 J. Bakosi 8 : : All rights reserved. See the LICENSE file for details. 9 : : \brief Custom Charm++ reducer for merging mesh graphs across PEs 10 : : */ 11 : : // ***************************************************************************** 12 : : 13 : : #include "GraphReducer.hpp" 14 : : 15 : : namespace tk { 16 : : 17 : : std::pair< int, std::unique_ptr<char[]> > 18 : 922 : serialize( 19 : : const std::unordered_map< std::size_t, std::vector< std::size_t > >& d ) 20 : : // ***************************************************************************** 21 : : // Serialize diagnostics to raw memory stream 22 : : //! \param[in] d Mesh graph to aggregate 23 : : //! \return Pair of the length and the raw stream containing the serialized data 24 : : // ***************************************************************************** 25 : : { 26 : : // Prepare for serializing diagnostics to a raw binary stream, compute size 27 : 922 : PUP::sizer sizer; 28 [ + - ]: 922 : sizer | const_cast< std::unordered_map< std::size_t, 29 : : std::vector< std::size_t > >& >( d ); 30 : : 31 : : // Create raw character stream to store the serialized vectors 32 [ + - ]: 922 : std::unique_ptr<char[]> flatData = std::make_unique<char[]>( sizer.size() ); 33 : : 34 : : // Serialize vector, each message will contain graph 35 : 922 : PUP::toMem packer( flatData.get() ); 36 [ + - ]: 922 : packer | const_cast< std::unordered_map< std::size_t, 37 : : std::vector< std::size_t > >& >( d ); 38 : : 39 : : // Return size of and raw stream 40 : 1844 : return { sizer.size(), std::move(flatData) }; 41 : 922 : } 42 : : 43 : : CkReductionMsg* 44 : 183 : mergeGraph( int nmsg, CkReductionMsg **msgs ) 45 : : // ***************************************************************************** 46 : : // Charm++ custom reducer for merging mesh graphs during reduction across PEs 47 : : //! \param[in] nmsg Number of messages in msgs 48 : : //! \param[in] msgs Charm++ reduction message containing serialized data 49 : : //! \return Aggregated diagnostics built for further aggregation if needed 50 : : // ***************************************************************************** 51 : : { 52 : : // Will store deserialized mesh graph 53 : 183 : std::unordered_map< std::size_t, std::vector< std::size_t > > v; 54 : : 55 : : // Create PUP deserializer based on message passed in 56 : 183 : PUP::fromMem creator( msgs[0]->getData() ); 57 : : 58 : : // Deserialize from raw stream 59 : : // cppcheck-suppress uninitvar 60 [ + - ]: 183 : creator | v; 61 : : 62 [ + + ]: 680 : for (int m=1; m<nmsg; ++m) { 63 : : // Unpack graph 64 : 497 : std::unordered_map< std::size_t, std::vector< std::size_t > > w; 65 : 497 : PUP::fromMem curCreator( msgs[m]->getData() ); 66 : : // cppcheck-suppress uninitvar 67 [ + - ]: 497 : curCreator | w; 68 : : // Aggregate 69 [ + + ]: 55535 : for (const auto& [g,n] : w) { 70 [ + - ]: 55038 : auto& sup = v[g]; 71 [ + + ]: 55038 : if (sup.empty()) { 72 [ + - ]: 3829 : sup.insert( end(sup), begin(n), end(n) ); 73 : : } else { 74 : : // lower compute node id owns 75 : 51209 : sup[0] = std::min( sup[0], n[0] ); 76 [ + - ]: 51209 : sup.insert( end(sup), n.begin()+1, n.end() ); 77 : : } 78 : : } 79 : 497 : } 80 : : 81 : : // Serialize concatenated diagnostics vector to raw stream 82 [ + - ]: 183 : auto stream = tk::serialize( v ); 83 : : 84 : : // Forward serialized diagnostics 85 [ + - ]: 366 : return CkReductionMsg::buildNew( stream.first, stream.second.get() ); 86 : 183 : } 87 : : 88 : : } // tk::