Arcane  4.1.12.0
User documentation
Loading...
Searching...
No Matches
MpiMachineShMemWinBaseInternalCreator.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* MpiMachineShMemWinBaseInternalCreator.cc (C) 2000-2026 */
9/* */
10/* Class allowing the creation of objects of type */
11/* MpiContigMachineShMemWinBaseInternal. */
12/*---------------------------------------------------------------------------*/
13/*---------------------------------------------------------------------------*/
14
15#include "arccore/message_passing_mpi/internal/MpiMachineShMemWinBaseInternalCreator.h"
16
17#include "arccore/base/FatalErrorException.h"
18#include "arccore/message_passing_mpi/internal/MpiContigMachineShMemWinBaseInternal.h"
19#include "arccore/message_passing_mpi/internal/MpiMachineShMemWinBaseInternal.h"
20#include "arccore/message_passing_mpi/internal/MpiMultiMachineShMemWinBaseInternal.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane::MessagePassing::Mpi
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30
31MpiMachineShMemWinBaseInternalCreator::
32MpiMachineShMemWinBaseInternalCreator(const MPI_Comm& comm_machine, Int32 comm_machine_rank, Int32 comm_machine_size, const MPI_Comm& comm_world, Int32 comm_world_size)
33: m_comm_machine(comm_machine)
34, m_comm_machine_rank(comm_machine_rank)
35, m_comm_machine_size(comm_machine_size)
36{
37 UniqueArray<Int32> global_ranks(comm_world_size);
38 UniqueArray<Int32> machine_ranks(comm_world_size);
39
40 for (Int32 i = 0; i < comm_world_size; ++i) {
41 global_ranks[i] = i;
42 }
43 MPI_Group comm_world_group;
44 MPI_Comm_group(comm_world, &comm_world_group);
45
46 MPI_Group machine_comm_group;
47 MPI_Comm_group(m_comm_machine, &machine_comm_group);
48
49 MPI_Group_translate_ranks(comm_world_group, comm_world_size, global_ranks.data(), machine_comm_group, machine_ranks.data());
50
51 m_machine_ranks.resize(m_comm_machine_size);
52
53 Int32 iter = 0;
54 for (Int32 i = 0; i < comm_world_size; ++i) {
55 if (machine_ranks[i] != MPI_UNDEFINED) {
56 m_machine_ranks[iter++] = i;
57 }
58 }
59 if (iter != m_comm_machine_size) {
60 ARCCORE_FATAL("Error in machine_ranks creation");
61 }
62}
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66
67MpiContigMachineShMemWinBaseInternal* MpiMachineShMemWinBaseInternalCreator::
68createWindow(Int64 sizeof_segment, Int32 sizeof_type) const
69{
70 return new MpiContigMachineShMemWinBaseInternal(sizeof_segment, sizeof_type, m_comm_machine, m_comm_machine_rank, m_comm_machine_size, m_machine_ranks);
71}
72
73/*---------------------------------------------------------------------------*/
74/*---------------------------------------------------------------------------*/
75
76MpiMachineShMemWinBaseInternal* MpiMachineShMemWinBaseInternalCreator::
77createDynamicWindow(Int64 sizeof_segment, Int32 sizeof_type) const
78{
79 return new MpiMachineShMemWinBaseInternal(sizeof_segment, sizeof_type, m_comm_machine, m_comm_machine_rank, m_comm_machine_size, m_machine_ranks);
80}
81
82/*---------------------------------------------------------------------------*/
83/*---------------------------------------------------------------------------*/
84
85MpiMultiMachineShMemWinBaseInternal* MpiMachineShMemWinBaseInternalCreator::
86createDynamicMultiWindow(SmallSpan<Int64> sizeof_segments, Int32 nb_segments_per_proc, Int32 sizeof_type) const
87{
88 return new MpiMultiMachineShMemWinBaseInternal(sizeof_segments, nb_segments_per_proc, sizeof_type, m_comm_machine, m_comm_machine_rank, m_comm_machine_size, m_machine_ranks);
89}
90
91/*---------------------------------------------------------------------------*/
92/*---------------------------------------------------------------------------*/
93
94ConstArrayView<Int32> MpiMachineShMemWinBaseInternalCreator::
95machineRanks() const
96{
97 return m_machine_ranks;
98}
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
103void MpiMachineShMemWinBaseInternalCreator::
104machineBarrier() const
105{
106 MPI_Barrier(m_comm_machine);
107}
108
109/*---------------------------------------------------------------------------*/
110/*---------------------------------------------------------------------------*/
111
112} // namespace Arcane::MessagePassing::Mpi
113
114/*---------------------------------------------------------------------------*/
115/*---------------------------------------------------------------------------*/
#define ARCCORE_FATAL(...)
Macro throwing a FatalErrorException.
std::int32_t Int32
Signed integer type of 32 bits.