2020 */
2121#pragma once
2222
23- #include " openPMD/benchmark/mpi/BlockSlicer.hpp"
23+ #include " openPMD/config.hpp"
24+
2425#include " openPMD/Dataset.hpp" // Offset, Extent
26+ #include " openPMD/benchmark/mpi/BlockSlicer.hpp"
2527
28+ #if openPMD_HAVE_MPI
29+ #include < mpi.h>
30+ #endif
2631#include < vector>
2732
28-
2933namespace openPMD
3034{
3135/* *
@@ -115,12 +119,13 @@ namespace chunk_assignment
115119 * @param out Meta information on reading processes, e.g. hostnames.
116120 * @return ChunkTable A table that assigns chunks to reading processes.
117121 */
118- virtual ChunkTable
119- assign (
122+ virtual ChunkTable assign (
120123 PartialAssignment partialAssignment,
121124 RankMeta const & in,
122125 RankMeta const & out ) = 0;
123126
127+ virtual std::unique_ptr< Strategy > clone () const = 0;
128+
124129 virtual ~Strategy () = default ;
125130 };
126131
@@ -149,12 +154,13 @@ namespace chunk_assignment
149154 * that were not assigned and one that assigns chunks to
150155 * reading processes.
151156 */
152- virtual PartialAssignment
153- assign (
157+ virtual PartialAssignment assign (
154158 PartialAssignment partialAssignment,
155159 RankMeta const & in,
156160 RankMeta const & out ) = 0;
157161
162+ virtual std::unique_ptr< PartialStrategy > clone () const = 0;
163+
158164 virtual ~PartialStrategy () = default ;
159165 };
160166
@@ -192,6 +198,12 @@ namespace chunk_assignment
192198 virtual ChunkTable
193199 assign ( PartialAssignment, RankMeta const & in, RankMeta const & out );
194200
201+ virtual std::unique_ptr< Strategy > clone () const override
202+ {
203+ return std::unique_ptr< Strategy >( new FromPartialStrategy (
204+ m_firstPass->clone (), m_secondPass->clone () ) );
205+ }
206+
195207 private:
196208 std::unique_ptr< PartialStrategy > m_firstPass;
197209 std::unique_ptr< Strategy > m_secondPass;
@@ -206,6 +218,11 @@ namespace chunk_assignment
206218 {
207219 ChunkTable
208220 assign ( PartialAssignment, RankMeta const & in, RankMeta const & out );
221+
222+ virtual std::unique_ptr< Strategy > clone () const override
223+ {
224+ return std::unique_ptr< Strategy >( new RoundRobin );
225+ }
209226 };
210227
211228 /* *
@@ -224,6 +241,12 @@ namespace chunk_assignment
224241 assign ( PartialAssignment, RankMeta const & in, RankMeta const & out )
225242 override ;
226243
244+ virtual std::unique_ptr< PartialStrategy > clone () const override
245+ {
246+ return std::unique_ptr< PartialStrategy >(
247+ new ByHostname ( m_withinNode->clone () ) );
248+ }
249+
227250 private:
228251 std::unique_ptr< Strategy > m_withinNode;
229252 };
@@ -246,9 +269,16 @@ namespace chunk_assignment
246269 unsigned int mpi_rank,
247270 unsigned int mpi_size );
248271
249- ChunkTable
250- assign ( PartialAssignment, RankMeta const & in, RankMeta const & out )
251- override ;
272+ ChunkTable assign (
273+ PartialAssignment,
274+ RankMeta const & in,
275+ RankMeta const & out ) override ;
276+
277+ virtual std::unique_ptr< Strategy > clone () const override
278+ {
279+ return std::unique_ptr< Strategy >( new ByCuboidSlice (
280+ blockSlicer->clone (), totalExtent, mpi_rank, mpi_size ) );
281+ }
252282
253283 private:
254284 std::unique_ptr< BlockSlicer > blockSlicer;
@@ -278,32 +308,32 @@ namespace chunk_assignment
278308 */
279309 BinPacking ( size_t splitAlongDimension = 0 );
280310
281- ChunkTable
282- assign ( PartialAssignment, RankMeta const & in, RankMeta const & out )
283- override ;
284- } ;
311+ ChunkTable assign (
312+ PartialAssignment,
313+ RankMeta const & in,
314+ RankMeta const & out ) override ;
285315
286- /* *
287- * C++11 doesn't have it and it's useful for some of these.
288- */
289- template < typename T, typename ... Args >
290- std::unique_ptr< T >
291- make_unique ( Args &&... args )
292- {
293- return std::unique_ptr< T >( new T ( std::forward< Args >( args )... ) );
294- }
295- } // namespace chunk_assignment
316+ virtual std::unique_ptr< Strategy > clone () const override
317+ {
318+ return std::unique_ptr< Strategy >(
319+ new BinPacking ( splitAlongDimension ) );
320+ }
321+ };
322+ } // namespace chunk_assignment
296323
297324namespace host_info
298325{
299- enum class Method
300- {
301- HOSTNAME
302- };
326+ enum class Method
327+ {
328+ HOSTNAME
329+ };
330+
331+ std::string byMethod ( Method );
303332
304- std::string byMethod ( Method );
333+ #if openPMD_HAVE_MPI
334+ chunk_assignment::RankMeta byMethodCollective ( MPI_Comm, Method );
335+ #endif
305336
306- std::string
307- hostname ();
337+ std::string hostname ();
308338} // namespace host_info
309339} // namespace openPMD
0 commit comments