15#include "arccore/message_passing_mpi/internal/MpiMachineMemoryWindowBaseInternal.h"
17#include "arccore/base/FatalErrorException.h"
22namespace Arcane::MessagePassing::Mpi
28MpiMachineMemoryWindowBaseInternal::
29MpiMachineMemoryWindowBaseInternal(
Int64 sizeof_segment,
Int32 sizeof_type,
const MPI_Comm& comm_machine,
Int32 comm_machine_rank,
Int32 comm_machine_size, ConstArrayView<Int32> machine_ranks)
31, m_win_sizeof_segments()
32, m_win_sum_sizeof_segments()
33, m_comm_machine(comm_machine)
34, m_comm_machine_size(comm_machine_size)
35, m_comm_machine_rank(comm_machine_rank)
36, m_sizeof_type(sizeof_type)
37, m_machine_ranks(machine_ranks)
39, m_actual_sizeof_win(-1)
42 MPI_Info_create(&win_info);
43 MPI_Info_set(win_info,
"alloc_shared_noncontig",
"false");
46 void* ptr_seg =
nullptr;
47 int error = MPI_Win_allocate_shared(sizeof_segment, m_sizeof_type, win_info, m_comm_machine, &ptr_seg, &m_win);
49 if (error != MPI_SUCCESS) {
50 ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
57 Int64* ptr_seg =
nullptr;
58 int error = MPI_Win_allocate_shared(
sizeof(Int64),
sizeof(Int64), win_info, m_comm_machine, &ptr_seg, &m_win_sizeof_segments);
60 if (error != MPI_SUCCESS) {
61 ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
63 *ptr_seg = sizeof_segment;
66 Int64* ptr_seg =
nullptr;
67 int error = MPI_Win_allocate_shared(
sizeof(Int64),
sizeof(Int64), win_info, m_comm_machine, &ptr_seg, &m_win_sum_sizeof_segments);
69 if (error != MPI_SUCCESS) {
70 ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
74 MPI_Info_free(&win_info);
76 MPI_Barrier(m_comm_machine);
80 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
84 Int64* ptr_seg =
nullptr;
85 int error = MPI_Win_shared_query(m_win_sizeof_segments, i, &size_seg, &size_type, &ptr_seg);
87 if (error != MPI_SUCCESS) {
88 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
91 m_sizeof_segments_span = Span<Int64>{ ptr_seg, m_comm_machine_size };
94 if (m_sizeof_segments_span.data() + i != ptr_seg) {
95 ARCCORE_FATAL(
"Pb d'adresse de segment");
97 if (m_sizeof_segments_span[i] != *ptr_seg) {
98 ARCCORE_FATAL(
"Pb taille de segment");
104 Int64* ptr_seg =
nullptr;
105 int error = MPI_Win_shared_query(m_win_sum_sizeof_segments, i, &size_seg, &size_type, &ptr_seg);
107 if (error != MPI_SUCCESS) {
108 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
111 m_sum_sizeof_segments_span = Span<Int64>{ ptr_seg, m_comm_machine_size };
114 if (m_sum_sizeof_segments_span.data() + i != ptr_seg) {
115 ARCCORE_FATAL(
"Pb d'adresse de segment");
123 Int64* ptr_seg =
nullptr;
124 int error = MPI_Win_shared_query(m_win_sizeof_segments, 0, &size_seg, &size_type, &ptr_seg);
125 if (error != MPI_SUCCESS) {
126 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
129 m_sizeof_segments_span = Span<Int64>{ ptr_seg, m_comm_machine_size };
134 Int64* ptr_seg =
nullptr;
135 int error = MPI_Win_shared_query(m_win_sum_sizeof_segments, 0, &size_seg, &size_type, &ptr_seg);
137 if (error != MPI_SUCCESS) {
138 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
141 m_sum_sizeof_segments_span = Span<Int64>{ ptr_seg, m_comm_machine_size };
147 if (m_comm_machine_rank == 0) {
148 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
149 m_sum_sizeof_segments_span[i] = m_max_sizeof_win;
150 m_max_sizeof_win += m_sizeof_segments_span[i];
154 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
155 m_max_sizeof_win += m_sizeof_segments_span[i];
159 MPI_Barrier(m_comm_machine);
161 m_actual_sizeof_win = m_max_sizeof_win;
165 std::byte* ptr_win =
nullptr;
170 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
173 std::byte* ptr_seg =
nullptr;
174 int error = MPI_Win_shared_query(m_win, i, &size_seg, &size_type, &ptr_seg);
176 if (error != MPI_SUCCESS) {
177 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
183 if (ptr_seg != (ptr_win + sum)) {
184 ARCCORE_FATAL(
"Pb d'adresse de segment");
186 if (size_seg != m_sizeof_segments_span[i]) {
187 ARCCORE_FATAL(
"Pb taille de segment");
191 if (sum != m_max_sizeof_win) {
192 ARCCORE_FATAL(
"Pb taille de window -- Expected : {0} -- Found : {1}", m_max_sizeof_win, sum);
198 std::byte* ptr_seg =
nullptr;
199 int error = MPI_Win_shared_query(m_win, 0, &size_seg, &size_type, &ptr_seg);
201 if (error != MPI_SUCCESS) {
202 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
209 m_window_span = Span<std::byte>{ ptr_win, m_max_sizeof_win };
215MpiMachineMemoryWindowBaseInternal::
216~MpiMachineMemoryWindowBaseInternal()
218 MPI_Win_free(&m_win);
219 MPI_Win_free(&m_win_sizeof_segments);
220 MPI_Win_free(&m_win_sum_sizeof_segments);
226Int32 MpiMachineMemoryWindowBaseInternal::
229 return m_sizeof_type;
235Span<std::byte> MpiMachineMemoryWindowBaseInternal::
238 const Int64 begin_segment = m_sum_sizeof_segments_span[m_comm_machine_rank];
239 const Int64 size_segment = m_sizeof_segments_span[m_comm_machine_rank];
241 return m_window_span.subSpan(begin_segment, size_segment);
247Span<std::byte> MpiMachineMemoryWindowBaseInternal::
248segment(Int32 rank)
const
251 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
252 if (m_machine_ranks[i] == rank) {
258 ARCCORE_FATAL(
"Rank is not in machine");
261 const Int64 begin_segment = m_sum_sizeof_segments_span[pos];
262 const Int64 size_segment = m_sizeof_segments_span[pos];
264 return m_window_span.subSpan(begin_segment, size_segment);
270Span<std::byte> MpiMachineMemoryWindowBaseInternal::
273 return m_window_span;
279void MpiMachineMemoryWindowBaseInternal::
280resizeSegment(Int64 new_sizeof_segment)
282 m_sizeof_segments_span[m_comm_machine_rank] = new_sizeof_segment;
284 MPI_Barrier(m_comm_machine);
286 if (m_comm_machine_rank == 0) {
288 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
289 m_sum_sizeof_segments_span[i] = sum;
290 sum += m_sizeof_segments_span[i];
292 if (sum > m_max_sizeof_win) {
293 ARCCORE_FATAL(
"New size of window (sum of size of all segments) is superior than the old size");
295 m_actual_sizeof_win = sum;
299 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
300 sum += m_sizeof_segments_span[i];
302 if (sum > m_max_sizeof_win) {
303 ARCCORE_FATAL(
"New size of window (sum of size of all segments) is superior than the old size");
305 m_actual_sizeof_win = sum;
308 m_window_span = Span<std::byte>{ m_window_span.data(), m_actual_sizeof_win };
310 MPI_Barrier(m_comm_machine);
316ConstArrayView<Int32> MpiMachineMemoryWindowBaseInternal::
319 return m_machine_ranks;
325void MpiMachineMemoryWindowBaseInternal::
328 MPI_Barrier(m_comm_machine);
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.