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)
38, m_actual_sizeof_win(-1)
42 MPI_Info_create(&win_info);
43 MPI_Info_set(win_info,
"alloc_shared_noncontig",
"false");
48 void* ptr_seg =
nullptr;
49 int error = MPI_Win_allocate_shared(sizeof_segment, m_sizeof_type, win_info, m_comm_machine, &ptr_seg, &m_win);
51 if (error != MPI_SUCCESS) {
52 ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
61 Int64* ptr_seg =
nullptr;
62 int error = MPI_Win_allocate_shared(
sizeof(Int64),
sizeof(Int64), win_info, m_comm_machine, &ptr_seg, &m_win_sizeof_segments);
64 if (error != MPI_SUCCESS) {
65 ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
69 *ptr_seg = sizeof_segment;
75 Int64* ptr_seg =
nullptr;
76 int error = MPI_Win_allocate_shared(
sizeof(Int64),
sizeof(Int64), win_info, m_comm_machine, &ptr_seg, &m_win_sum_sizeof_segments);
78 if (error != MPI_SUCCESS) {
79 ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
83 MPI_Info_free(&win_info);
85 MPI_Barrier(m_comm_machine);
91 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
98 Int64* ptr_seg =
nullptr;
99 int error = MPI_Win_shared_query(m_win_sizeof_segments, i, &size_seg, &size_type, &ptr_seg);
101 if (error != MPI_SUCCESS) {
102 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
105 m_sizeof_segments_span = SmallSpan<Int64>{ ptr_seg, m_comm_machine_size };
108 if (m_sizeof_segments_span.data() + i != ptr_seg) {
109 ARCCORE_FATAL(
"Pb d'adresse de segment");
111 if (m_sizeof_segments_span[i] != *ptr_seg) {
112 ARCCORE_FATAL(
"Pb taille de segment");
120 Int64* ptr_seg =
nullptr;
121 int error = MPI_Win_shared_query(m_win_sum_sizeof_segments, i, &size_seg, &size_type, &ptr_seg);
123 if (error != MPI_SUCCESS) {
124 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
127 m_sum_sizeof_segments_span = SmallSpan<Int64>{ ptr_seg, m_comm_machine_size };
130 if (m_sum_sizeof_segments_span.data() + i != ptr_seg) {
131 ARCCORE_FATAL(
"Pb d'adresse de segment");
140 Int64* ptr_seg =
nullptr;
141 int error = MPI_Win_shared_query(m_win_sizeof_segments, 0, &size_seg, &size_type, &ptr_seg);
142 if (error != MPI_SUCCESS) {
143 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
146 m_sizeof_segments_span = SmallSpan<Int64>{ ptr_seg, m_comm_machine_size };
153 Int64* ptr_seg =
nullptr;
154 int error = MPI_Win_shared_query(m_win_sum_sizeof_segments, 0, &size_seg, &size_type, &ptr_seg);
156 if (error != MPI_SUCCESS) {
157 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
160 m_sum_sizeof_segments_span = SmallSpan<Int64>{ ptr_seg, m_comm_machine_size };
168 if (m_comm_machine_rank == 0) {
169 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
170 m_sum_sizeof_segments_span[i] = m_max_sizeof_win;
171 m_max_sizeof_win += m_sizeof_segments_span[i];
175 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
176 m_max_sizeof_win += m_sizeof_segments_span[i];
180 MPI_Barrier(m_comm_machine);
184 m_actual_sizeof_win = m_max_sizeof_win;
191 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
197 std::byte* ptr_seg =
nullptr;
198 int error = MPI_Win_shared_query(m_win, i, &size_seg, &size_type, &ptr_seg);
200 if (error != MPI_SUCCESS) {
201 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
204 m_window_span = Span<std::byte>{ ptr_seg, m_max_sizeof_win };
207 if (ptr_seg != (m_window_span.data() + sum)) {
208 ARCCORE_FATAL(
"Pb d'adresse de segment");
210 if (size_seg != m_sizeof_segments_span[i]) {
211 ARCCORE_FATAL(
"Pb taille de segment");
215 if (sum != m_max_sizeof_win) {
216 ARCCORE_FATAL(
"Pb taille de window -- Expected : {0} -- Found : {1}", m_max_sizeof_win, sum);
223 std::byte* ptr_seg =
nullptr;
224 int error = MPI_Win_shared_query(m_win, 0, &size_seg, &size_type, &ptr_seg);
226 if (error != MPI_SUCCESS) {
227 ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
230 m_window_span = Span<std::byte>{ ptr_seg, m_max_sizeof_win };
238MpiMachineMemoryWindowBaseInternal::
239~MpiMachineMemoryWindowBaseInternal()
241 MPI_Win_free(&m_win);
242 MPI_Win_free(&m_win_sizeof_segments);
243 MPI_Win_free(&m_win_sum_sizeof_segments);
249Int32 MpiMachineMemoryWindowBaseInternal::
252 return m_sizeof_type;
258Span<std::byte> MpiMachineMemoryWindowBaseInternal::
261 const Int64 begin_segment = m_sum_sizeof_segments_span[m_comm_machine_rank];
262 const Int64 size_segment = m_sizeof_segments_span[m_comm_machine_rank];
264 return m_window_span.subSpan(begin_segment, size_segment);
270Span<std::byte> MpiMachineMemoryWindowBaseInternal::
271segmentView(Int32 rank)
274 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
275 if (m_machine_ranks[i] == rank) {
281 ARCCORE_FATAL(
"Rank is not in machine");
284 const Int64 begin_segment = m_sum_sizeof_segments_span[pos];
285 const Int64 size_segment = m_sizeof_segments_span[pos];
287 return m_window_span.subSpan(begin_segment, size_segment);
293Span<std::byte> MpiMachineMemoryWindowBaseInternal::
296 return m_window_span;
302Span<const std::byte> MpiMachineMemoryWindowBaseInternal::
303segmentConstView()
const
305 const Int64 begin_segment = m_sum_sizeof_segments_span[m_comm_machine_rank];
306 const Int64 size_segment = m_sizeof_segments_span[m_comm_machine_rank];
308 return m_window_span.subSpan(begin_segment, size_segment);
314Span<const std::byte> MpiMachineMemoryWindowBaseInternal::
315segmentConstView(Int32 rank)
const
318 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
319 if (m_machine_ranks[i] == rank) {
325 ARCCORE_FATAL(
"Rank is not in machine");
328 const Int64 begin_segment = m_sum_sizeof_segments_span[pos];
329 const Int64 size_segment = m_sizeof_segments_span[pos];
331 return m_window_span.subSpan(begin_segment, size_segment);
337Span<const std::byte> MpiMachineMemoryWindowBaseInternal::
338windowConstView()
const
340 return m_window_span;
346void MpiMachineMemoryWindowBaseInternal::
347resizeSegment(Int64 new_sizeof_segment)
349 m_sizeof_segments_span[m_comm_machine_rank] = new_sizeof_segment;
351 MPI_Barrier(m_comm_machine);
353 if (m_comm_machine_rank == 0) {
355 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
356 m_sum_sizeof_segments_span[i] = sum;
357 sum += m_sizeof_segments_span[i];
359 if (sum > m_max_sizeof_win) {
360 ARCCORE_FATAL(
"New size of window (sum of size of all segments) is superior than the old size");
362 m_actual_sizeof_win = sum;
366 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
367 sum += m_sizeof_segments_span[i];
369 if (sum > m_max_sizeof_win) {
370 ARCCORE_FATAL(
"New size of window (sum of size of all segments) is superior than the old size");
372 m_actual_sizeof_win = sum;
375 m_window_span = Span<std::byte>{ m_window_span.data(), m_actual_sizeof_win };
377 MPI_Barrier(m_comm_machine);
383ConstArrayView<Int32> MpiMachineMemoryWindowBaseInternal::
386 return m_machine_ranks;
392void MpiMachineMemoryWindowBaseInternal::
395 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.