16#include "arccore/message_passing_mpi/internal/MpiContigMachineShMemWinBaseInternal.h"
18#include "arccore/base/FatalErrorException.h"
23namespace Arcane::MessagePassing::Mpi
29MpiContigMachineShMemWinBaseInternal::
30MpiContigMachineShMemWinBaseInternal(
Int64 sizeof_segment,
Int32 sizeof_type,
const MPI_Comm& comm_machine,
Int32 comm_machine_rank,
Int32 comm_machine_size, ConstArrayView<Int32> machine_ranks)
32, m_win_sizeof_segments()
33, m_win_sum_sizeof_segments()
34, m_comm_machine(comm_machine)
35, m_comm_machine_size(comm_machine_size)
36, m_comm_machine_rank(comm_machine_rank)
37, m_sizeof_type(sizeof_type)
38, m_machine_ranks(machine_ranks)
39, m_actual_sizeof_win(-1)
43 MPI_Info_create(&win_info);
44 MPI_Info_set(win_info,
"alloc_shared_noncontig",
"false");
49 void* ptr_seg =
nullptr;
50 int error = MPI_Win_allocate_shared(sizeof_segment, m_sizeof_type, win_info, m_comm_machine, &ptr_seg, &m_win);
52 if (error != MPI_SUCCESS) {
62 Int64* ptr_seg =
nullptr;
63 int error = MPI_Win_allocate_shared(
sizeof(Int64),
sizeof(Int64), win_info, m_comm_machine, &ptr_seg, &m_win_sizeof_segments);
65 if (error != MPI_SUCCESS) {
70 *ptr_seg = sizeof_segment;
76 Int64* ptr_seg =
nullptr;
77 int error = MPI_Win_allocate_shared(
sizeof(Int64),
sizeof(Int64), win_info, m_comm_machine, &ptr_seg, &m_win_sum_sizeof_segments);
79 if (error != MPI_SUCCESS) {
84 MPI_Info_free(&win_info);
86 MPI_Barrier(m_comm_machine);
92 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
99 Int64* ptr_seg =
nullptr;
100 int error = MPI_Win_shared_query(m_win_sizeof_segments, i, &size_seg, &size_type, &ptr_seg);
102 if (error != MPI_SUCCESS) {
106 m_sizeof_segments_span = SmallSpan<Int64>{ ptr_seg, m_comm_machine_size };
109 if (m_sizeof_segments_span.data() + i != ptr_seg) {
112 if (m_sizeof_segments_span[i] != *ptr_seg) {
121 Int64* ptr_seg =
nullptr;
122 int error = MPI_Win_shared_query(m_win_sum_sizeof_segments, i, &size_seg, &size_type, &ptr_seg);
124 if (error != MPI_SUCCESS) {
128 m_sum_sizeof_segments_span = SmallSpan<Int64>{ ptr_seg, m_comm_machine_size };
131 if (m_sum_sizeof_segments_span.data() + i != ptr_seg) {
141 Int64* ptr_seg =
nullptr;
142 int error = MPI_Win_shared_query(m_win_sizeof_segments, 0, &size_seg, &size_type, &ptr_seg);
143 if (error != MPI_SUCCESS) {
147 m_sizeof_segments_span = SmallSpan<Int64>{ ptr_seg, m_comm_machine_size };
154 Int64* ptr_seg =
nullptr;
155 int error = MPI_Win_shared_query(m_win_sum_sizeof_segments, 0, &size_seg, &size_type, &ptr_seg);
157 if (error != MPI_SUCCESS) {
161 m_sum_sizeof_segments_span = SmallSpan<Int64>{ ptr_seg, m_comm_machine_size };
169 if (m_comm_machine_rank == 0) {
170 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
171 m_sum_sizeof_segments_span[i] = m_max_sizeof_win;
172 m_max_sizeof_win += m_sizeof_segments_span[i];
176 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
177 m_max_sizeof_win += m_sizeof_segments_span[i];
181 MPI_Barrier(m_comm_machine);
185 m_actual_sizeof_win = m_max_sizeof_win;
192 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
198 std::byte* ptr_seg =
nullptr;
199 int error = MPI_Win_shared_query(m_win, i, &size_seg, &size_type, &ptr_seg);
201 if (error != MPI_SUCCESS) {
205 m_window_span = Span<std::byte>{ ptr_seg, m_max_sizeof_win };
208 if (ptr_seg != (m_window_span.data() + sum)) {
211 if (size_seg != m_sizeof_segments_span[i]) {
216 if (sum != m_max_sizeof_win) {
217 ARCCORE_FATAL(
"Window size error -- Expected : {0} -- Found : {1}", m_max_sizeof_win, sum);
224 std::byte* ptr_seg =
nullptr;
225 int error = MPI_Win_shared_query(m_win, 0, &size_seg, &size_type, &ptr_seg);
227 if (error != MPI_SUCCESS) {
231 m_window_span = Span<std::byte>{ ptr_seg, m_max_sizeof_win };
239MpiContigMachineShMemWinBaseInternal::
240~MpiContigMachineShMemWinBaseInternal()
242 MPI_Win_free(&m_win);
243 MPI_Win_free(&m_win_sizeof_segments);
244 MPI_Win_free(&m_win_sum_sizeof_segments);
250Int32 MpiContigMachineShMemWinBaseInternal::
253 return m_sizeof_type;
259Span<std::byte> MpiContigMachineShMemWinBaseInternal::
262 const Int64 begin_segment = m_sum_sizeof_segments_span[m_comm_machine_rank];
263 const Int64 size_segment = m_sizeof_segments_span[m_comm_machine_rank];
265 return m_window_span.subSpan(begin_segment, size_segment);
271Span<std::byte> MpiContigMachineShMemWinBaseInternal::
272segmentView(Int32 rank)
275 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
276 if (m_machine_ranks[i] == rank) {
285 const Int64 begin_segment = m_sum_sizeof_segments_span[pos];
286 const Int64 size_segment = m_sizeof_segments_span[pos];
288 return m_window_span.subSpan(begin_segment, size_segment);
294Span<std::byte> MpiContigMachineShMemWinBaseInternal::
297 return m_window_span;
303Span<const std::byte> MpiContigMachineShMemWinBaseInternal::
304segmentConstView()
const
306 const Int64 begin_segment = m_sum_sizeof_segments_span[m_comm_machine_rank];
307 const Int64 size_segment = m_sizeof_segments_span[m_comm_machine_rank];
309 return m_window_span.subSpan(begin_segment, size_segment);
315Span<const std::byte> MpiContigMachineShMemWinBaseInternal::
316segmentConstView(Int32 rank)
const
319 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
320 if (m_machine_ranks[i] == rank) {
329 const Int64 begin_segment = m_sum_sizeof_segments_span[pos];
330 const Int64 size_segment = m_sizeof_segments_span[pos];
332 return m_window_span.subSpan(begin_segment, size_segment);
338Span<const std::byte> MpiContigMachineShMemWinBaseInternal::
339windowConstView()
const
341 return m_window_span;
347void MpiContigMachineShMemWinBaseInternal::
348resizeSegment(Int64 new_sizeof_segment)
350 m_sizeof_segments_span[m_comm_machine_rank] = new_sizeof_segment;
352 MPI_Barrier(m_comm_machine);
354 if (m_comm_machine_rank == 0) {
356 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
357 m_sum_sizeof_segments_span[i] = sum;
358 sum += m_sizeof_segments_span[i];
360 if (sum > m_max_sizeof_win) {
361 ARCCORE_FATAL(
"New size of window (sum of size of all segments) is superior than the old size");
363 m_actual_sizeof_win = sum;
367 for (Int32 i = 0; i < m_comm_machine_size; ++i) {
368 sum += m_sizeof_segments_span[i];
370 if (sum > m_max_sizeof_win) {
371 ARCCORE_FATAL(
"New size of window (sum of size of all segments) is superior than the old size");
373 m_actual_sizeof_win = sum;
376 m_window_span = Span<std::byte>{ m_window_span.data(), m_actual_sizeof_win };
378 MPI_Barrier(m_comm_machine);
384ConstArrayView<Int32> MpiContigMachineShMemWinBaseInternal::
387 return m_machine_ranks;
393void MpiContigMachineShMemWinBaseInternal::
396 MPI_Barrier(m_comm_machine);
#define ARCCORE_FATAL(...)
Macro throwing a FatalErrorException.
std::int64_t Int64
Signed integer type of 64 bits.
std::int32_t Int32
Signed integer type of 32 bits.