15#include "arccore/message_passing_mpi/internal/MpiDynamicMultiMachineMemoryWindowBaseInternal.h" 
   17#include "arccore/base/FatalErrorException.h" 
   22namespace Arcane::MessagePassing::Mpi
 
   29MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
   30MpiDynamicMultiMachineMemoryWindowBaseInternal(SmallSpan<Int64> sizeof_segments, 
Int32 nb_segments_per_proc, 
Int32 sizeof_type, 
const MPI_Comm& comm_machine, 
Int32 comm_machine_rank, 
Int32 comm_machine_size, ConstArrayView<Int32> machine_ranks)
 
   32, m_win_actual_sizeof()
 
   33, m_win_target_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_nb_segments_per_proc(nb_segments_per_proc)
 
   39, m_machine_ranks(machine_ranks)
 
   40, m_add_requests(nb_segments_per_proc)
 
   41, m_resize_requests(nb_segments_per_proc)
 
   43  if (m_sizeof_type <= 0) {
 
   44    ARCCORE_FATAL(
"Invalid sizeof_type");
 
   46  for (Integer i = 0; i < m_nb_segments_per_proc; ++i) {
 
   47    if (sizeof_segments[i] < 0 || sizeof_segments[i] % m_sizeof_type != 0) {
 
   48      ARCCORE_FATAL(
"Invalid initial sizeof_segment");
 
   51  if (m_nb_segments_per_proc <= 0) {
 
   52    ARCCORE_FATAL(
"Invalid nb_segments_per_proc");
 
   54  m_all_mpi_win.resize(m_comm_machine_size * m_nb_segments_per_proc);
 
   55  m_reserved_part_span.resize(m_nb_segments_per_proc);
 
   57  for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
   58    m_add_requests[num_seg] = Span<const std::byte>{ 
nullptr, 0 };
 
   59    m_resize_requests[num_seg] = -1;
 
   62  MPI_Info win_info_true;
 
   63  MPI_Info_create(&win_info_true);
 
   64  MPI_Info_set(win_info_true, 
"alloc_shared_noncontig", 
"true");
 
   66  MPI_Info win_info_false;
 
   67  MPI_Info_create(&win_info_false);
 
   68  MPI_Info_set(win_info_false, 
"alloc_shared_noncontig", 
"false");
 
   70  const Int32 pos_my_wins = m_comm_machine_rank * m_nb_segments_per_proc;
 
   74    for (Integer i = 0; i < m_comm_machine_size; ++i) {
 
   75      for (Integer j = 0; j < m_nb_segments_per_proc; ++j) {
 
   77        if (m_comm_machine_rank == i) {
 
   78          if (sizeof_segments[j] == 0)
 
   79            size_seg = m_sizeof_type;
 
   81            size_seg = sizeof_segments[j];
 
   83        std::byte* ptr_seg = 
nullptr;
 
   84        int error = MPI_Win_allocate_shared(size_seg, m_sizeof_type, win_info_true, m_comm_machine, &ptr_seg, &m_all_mpi_win[j + i * m_nb_segments_per_proc]);
 
   86        if (error != MPI_SUCCESS) {
 
   87          ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
 
   93    for (Integer i = 0; i < m_nb_segments_per_proc; ++i) {
 
   96      std::byte* ptr_seg = 
nullptr;
 
   97      int error = MPI_Win_shared_query(m_all_mpi_win[i + pos_my_wins], m_comm_machine_rank, &size_seg, &size_type, &ptr_seg);
 
   99      if (error != MPI_SUCCESS) {
 
  100        ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  106      m_reserved_part_span[i] = Span<std::byte>{ ptr_seg, size_seg };
 
  111    Int64* ptr_seg = 
nullptr;
 
  112    Int64* ptr_win = 
nullptr;
 
  114      int error = MPI_Win_allocate_shared(
static_cast<Int64
>(
sizeof(Int64)) * m_nb_segments_per_proc, 
sizeof(Int64), win_info_false, m_comm_machine, &ptr_seg, &m_win_need_resize);
 
  116      if (error != MPI_SUCCESS) {
 
  117        ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
 
  123      int error = MPI_Win_shared_query(m_win_need_resize, 0, &size_seg, &size_type, &ptr_win);
 
  125      if (error != MPI_SUCCESS) {
 
  126        ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  129      m_need_resize = Span<Int64>{ ptr_win, m_comm_machine_size * m_nb_segments_per_proc };
 
  131      for (Integer i = 0; i < m_nb_segments_per_proc; ++i) {
 
  132        m_need_resize[i + pos_my_wins] = -1;
 
  135    if (ptr_win + pos_my_wins != ptr_seg) {
 
  136      ARCCORE_FATAL(
"m_win_need_resize is noncontig");
 
  141    Int64* ptr_seg = 
nullptr;
 
  142    Int64* ptr_win = 
nullptr;
 
  144      int error = MPI_Win_allocate_shared(
static_cast<Int64
>(
sizeof(Int64)) * m_nb_segments_per_proc, 
sizeof(Int64), win_info_false, m_comm_machine, &ptr_seg, &m_win_actual_sizeof);
 
  146      if (error != MPI_SUCCESS) {
 
  147        ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
 
  153      int error = MPI_Win_shared_query(m_win_actual_sizeof, 0, &size_seg, &size_type, &ptr_win);
 
  155      if (error != MPI_SUCCESS) {
 
  156        ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  159      m_sizeof_used_part = Span<Int64>{ ptr_win, m_comm_machine_size * m_nb_segments_per_proc };
 
  161      for (Integer i = 0; i < m_nb_segments_per_proc; ++i) {
 
  162        m_sizeof_used_part[i + pos_my_wins] = sizeof_segments[i];
 
  165    if (ptr_win + pos_my_wins != ptr_seg) {
 
  166      ARCCORE_FATAL(
"m_win_actual_sizeof is noncontig");
 
  171    Int32* ptr_seg = 
nullptr;
 
  172    Int32* ptr_win = 
nullptr;
 
  174      int error = MPI_Win_allocate_shared(
static_cast<Int64
>(
sizeof(Int32)) * m_nb_segments_per_proc, 
sizeof(Int32), win_info_false, m_comm_machine, &ptr_seg, &m_win_target_segments);
 
  176      if (error != MPI_SUCCESS) {
 
  177        ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
 
  183      int error = MPI_Win_shared_query(m_win_target_segments, 0, &size_seg, &size_type, &ptr_win);
 
  185      if (error != MPI_SUCCESS) {
 
  186        ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  189      m_target_segments = Span<Int32>{ ptr_win, m_comm_machine_size * m_nb_segments_per_proc };
 
  191      for (Integer i = 0; i < m_nb_segments_per_proc; ++i) {
 
  192        m_target_segments[i + pos_my_wins] = -1;
 
  195    if (ptr_win + pos_my_wins != ptr_seg) {
 
  196      ARCCORE_FATAL(
"m_win_owner_segments is noncontig");
 
  200  MPI_Info_free(&win_info_false);
 
  201  MPI_Info_free(&win_info_true);
 
  203  MPI_Barrier(m_comm_machine);
 
  209MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  210~MpiDynamicMultiMachineMemoryWindowBaseInternal()
 
  212  for (Integer i = 0; i < m_comm_machine_size * m_nb_segments_per_proc; ++i) {
 
  213    MPI_Win_free(&m_all_mpi_win[i]);
 
  215  MPI_Win_free(&m_win_need_resize);
 
  216  MPI_Win_free(&m_win_actual_sizeof);
 
  217  MPI_Win_free(&m_win_target_segments);
 
  223Int32 MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  226  return m_sizeof_type;
 
  232ConstArrayView<Int32> MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  235  return m_machine_ranks;
 
  241void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  244  MPI_Barrier(m_comm_machine);
 
  250Span<std::byte> MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  251segmentView(Int32 num_seg)
 
  253  const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  254  return m_reserved_part_span[num_seg].subSpan(0, m_sizeof_used_part[segment_infos_pos]);
 
  260Span<std::byte> MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  261segmentView(Int32 rank, Int32 num_seg)
 
  263  const Int32 segment_infos_pos = num_seg + _worldToMachine(rank) * m_nb_segments_per_proc;
 
  267  std::byte* ptr_seg = 
nullptr;
 
  268  int error = MPI_Win_shared_query(m_all_mpi_win[segment_infos_pos], rank, &size_seg, &size_type, &ptr_seg);
 
  270  if (error != MPI_SUCCESS) {
 
  271    ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  274  return Span<std::byte>{ ptr_seg, m_sizeof_used_part[segment_infos_pos] };
 
  280Span<const std::byte> MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  281segmentConstView(Int32 num_seg)
 const 
  283  const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  284  return m_reserved_part_span[num_seg].subSpan(0, m_sizeof_used_part[segment_infos_pos]);
 
  290Span<const std::byte> MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  291segmentConstView(Int32 rank, Int32 num_seg)
 const 
  293  const Int32 segment_infos_pos = num_seg + _worldToMachine(rank) * m_nb_segments_per_proc;
 
  297  std::byte* ptr_seg = 
nullptr;
 
  298  int error = MPI_Win_shared_query(m_all_mpi_win[segment_infos_pos], rank, &size_seg, &size_type, &ptr_seg);
 
  300  if (error != MPI_SUCCESS) {
 
  301    ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  304  return Span<const std::byte>{ ptr_seg, m_sizeof_used_part[segment_infos_pos] };
 
  310void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  311requestAdd(Int32 num_seg, Span<const std::byte> elem)
 
  313  if (elem.size() % m_sizeof_type) {
 
  314    ARCCORE_FATAL(
"Sizeof elem not valid");
 
  316  if (elem.empty() || elem.data() == 
nullptr) {
 
  320  const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  322  const Int64 actual_sizeof_win = m_sizeof_used_part[segment_infos_pos];
 
  323  const Int64 future_sizeof_win = actual_sizeof_win + elem.size();
 
  324  const Int64 old_reserved = m_reserved_part_span[num_seg].size();
 
  326  if (future_sizeof_win > old_reserved) {
 
  327    _requestRealloc(segment_infos_pos, future_sizeof_win);
 
  330    _requestRealloc(segment_infos_pos);
 
  333  m_add_requests[num_seg] = elem;
 
  334  m_add_requested = 
true; 
 
  340void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  345  if (!m_add_requested) {
 
  348  m_add_requested = 
false;
 
  350  for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  351    if (m_add_requests[num_seg].empty() || m_add_requests[num_seg].data() == 
nullptr) {
 
  355    const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  357    const Int64 actual_sizeof_win = m_sizeof_used_part[segment_infos_pos];
 
  358    const Int64 future_sizeof_win = actual_sizeof_win + m_add_requests[num_seg].size();
 
  360    if (m_reserved_part_span[num_seg].size() < future_sizeof_win) {
 
  361      ARCCORE_FATAL(
"Bad realloc -- New size : {1} -- Needed size : {2}", m_reserved_part_span[num_seg].size(), future_sizeof_win);
 
  364    for (Int64 pos_win = actual_sizeof_win, pos_elem = 0; pos_win < future_sizeof_win; ++pos_win, ++pos_elem) {
 
  365      m_reserved_part_span[num_seg][pos_win] = m_add_requests[num_seg][pos_elem];
 
  367    m_sizeof_used_part[segment_infos_pos] = future_sizeof_win;
 
  369    m_add_requests[num_seg] = Span<const std::byte>{ 
nullptr, 0 };
 
  376void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  377requestAddToAnotherSegment(Int32 thread, Int32 rank, Int32 num_seg, Span<const std::byte> elem)
 
  379  if (elem.size() % m_sizeof_type) {
 
  380    ARCCORE_FATAL(
"Sizeof elem not valid");
 
  382  if (elem.empty() || elem.data() == 
nullptr) {
 
  386  const Int32 machine_rank = _worldToMachine(rank);
 
  387  const Int32 target_segment_infos_pos = num_seg + machine_rank * m_nb_segments_per_proc;
 
  390    const Int32 segment_infos_pos = thread + m_comm_machine_rank * m_nb_segments_per_proc;
 
  391    m_target_segments[segment_infos_pos] = target_segment_infos_pos;
 
  394  Span<std::byte> rank_reserved_part_span;
 
  397    std::byte* ptr_seg = 
nullptr;
 
  399    int error = MPI_Win_shared_query(m_all_mpi_win[target_segment_infos_pos], machine_rank, &size_seg, &size_type, &ptr_seg);
 
  401    if (error != MPI_SUCCESS) {
 
  402      ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  404    rank_reserved_part_span = Span<std::byte>{ ptr_seg, size_seg };
 
  407  const Int64 actual_sizeof_win = m_sizeof_used_part[target_segment_infos_pos];
 
  408  const Int64 future_sizeof_win = actual_sizeof_win + elem.size();
 
  409  const Int64 old_reserved = rank_reserved_part_span.size();
 
  411  if (future_sizeof_win > old_reserved) {
 
  412    _requestRealloc(target_segment_infos_pos, future_sizeof_win);
 
  415    _requestRealloc(target_segment_infos_pos);
 
  418  m_add_requests[thread] = elem;
 
  419  m_add_requested = 
true; 
 
  425void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  426executeAddToAnotherSegment()
 
  428  MPI_Barrier(m_comm_machine);
 
  430  auto is_my_seg_edited = std::make_unique<bool[]>(m_comm_machine_size);
 
  431  for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  432    for (
const Int32 rank_asked : m_target_segments) {
 
  433      if (rank_asked == m_comm_machine_rank) {
 
  434        is_my_seg_edited[num_seg] = 
true;
 
  440  if (!m_add_requested) {
 
  445    m_add_requested = 
false;
 
  446    for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  447      const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  448      const Int32 seg_needs_to_edit = m_target_segments[segment_infos_pos];
 
  449      if (seg_needs_to_edit == -1)
 
  452      bool is_found = 
false;
 
  453      for (
const Int32 rank_asked : m_target_segments) {
 
  454        if (rank_asked == seg_needs_to_edit) {
 
  459            ARCCORE_FATAL(
"Two subdomains ask same rank for addToAnotherSegment()");
 
  467    for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  468      if (m_add_requests[num_seg].empty() || m_add_requests[num_seg].data() == 
nullptr) {
 
  472      const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  473      const Int32 target_segment_infos_pos = m_target_segments[segment_infos_pos];
 
  474      if (target_segment_infos_pos == -1) {
 
  475        ARCCORE_FATAL(
"Ne devrait pas aller ici");
 
  478      const Int64 actual_sizeof_win = m_sizeof_used_part[target_segment_infos_pos];
 
  479      const Int64 future_sizeof_win = actual_sizeof_win + m_add_requests[num_seg].size();
 
  481      Span<std::byte> rank_reserved_part_span;
 
  484        std::byte* ptr_seg = 
nullptr;
 
  486        int error = MPI_Win_shared_query(m_all_mpi_win[target_segment_infos_pos], target_segment_infos_pos / m_nb_segments_per_proc, &size_seg, &size_type, &ptr_seg);
 
  488        if (error != MPI_SUCCESS) {
 
  489          ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  491        rank_reserved_part_span = Span<std::byte>{ ptr_seg, size_seg };
 
  494      if (rank_reserved_part_span.size() < future_sizeof_win) {
 
  495        ARCCORE_FATAL(
"Bad realloc -- New size : {1} -- Needed size : {2}", rank_reserved_part_span.size(), future_sizeof_win);
 
  498      for (Int64 pos_win = actual_sizeof_win, pos_elem = 0; pos_win < future_sizeof_win; ++pos_win, ++pos_elem) {
 
  499        rank_reserved_part_span[pos_win] = m_add_requests[num_seg][pos_elem];
 
  501      m_sizeof_used_part[target_segment_infos_pos] = future_sizeof_win;
 
  503      m_add_requests[num_seg] = Span<const std::byte>{ 
nullptr, 0 };
 
  504      m_target_segments[segment_infos_pos] = -1;
 
  507  MPI_Barrier(m_comm_machine);
 
  509  for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  510    if (is_my_seg_edited[num_seg]) {
 
  511      const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  514      std::byte* ptr_seg = 
nullptr;
 
  516      int error = MPI_Win_shared_query(m_all_mpi_win[segment_infos_pos], m_comm_machine_rank, &size_seg, &size_type, &ptr_seg);
 
  518      if (error != MPI_SUCCESS) {
 
  519        ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  521      m_reserved_part_span[num_seg] = Span<std::byte>{ ptr_seg, size_seg };
 
  529void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  530requestReserve(Int32 num_seg, Int64 new_capacity)
 
  532  if (new_capacity % m_sizeof_type) {
 
  533    ARCCORE_FATAL(
"new_capacity not valid");
 
  536  const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  538  if (new_capacity <= m_reserved_part_span[num_seg].size()) {
 
  539    _requestRealloc(segment_infos_pos);
 
  542  _requestRealloc(segment_infos_pos, new_capacity);
 
  548void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  557void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  558requestResize(Int32 num_seg, Int64 new_size)
 
  560  if (new_size == -1) {
 
  563  if (new_size < 0 || new_size % m_sizeof_type) {
 
  564    ARCCORE_FATAL(
"new_size not valid");
 
  567  const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  569  if (new_size > m_reserved_part_span[num_seg].size()) {
 
  570    _requestRealloc(segment_infos_pos, new_size);
 
  573    _requestRealloc(segment_infos_pos);
 
  576  m_resize_requests[num_seg] = new_size;
 
  577  m_resize_requested = 
true; 
 
  583void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  588  if (!m_resize_requested) {
 
  591  m_resize_requested = 
false;
 
  593  for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  594    if (m_resize_requests[num_seg] == -1) {
 
  598    const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  600    if (m_reserved_part_span[num_seg].size() < m_resize_requests[num_seg]) {
 
  601      ARCCORE_FATAL(
"Bad realloc -- New size : {0} -- Needed size : {1}", m_reserved_part_span[num_seg].size(), m_resize_requests[num_seg]);
 
  604    m_sizeof_used_part[segment_infos_pos] = m_resize_requests[num_seg];
 
  605    m_resize_requests[num_seg] = -1;
 
  612void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  615  for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  616    const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  618    if (m_reserved_part_span[num_seg].size() == m_sizeof_used_part[segment_infos_pos]) {
 
  619      _requestRealloc(segment_infos_pos);
 
  622      _requestRealloc(segment_infos_pos, m_sizeof_used_part[segment_infos_pos]);
 
  631void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  632_requestRealloc(Int32 owner_pos_segment, Int64 new_capacity)
 const 
  634  m_need_resize[owner_pos_segment] = new_capacity;
 
  640void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  641_requestRealloc(Int32 owner_pos_segment)
 const 
  643  m_need_resize[owner_pos_segment] = -1;
 
  649void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  654  MPI_Barrier(m_comm_machine);
 
  660  for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  661    const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  662    m_need_resize[segment_infos_pos] = -1;
 
  670  MPI_Barrier(m_comm_machine);
 
  676void MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  680  MPI_Info_create(&win_info);
 
  681  MPI_Info_set(win_info, 
"alloc_shared_noncontig", 
"true");
 
  684  for (Integer rank = 0; rank < m_comm_machine_size; ++rank) {
 
  685    for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  687      const Int32 local_segment_infos_pos = num_seg + rank * m_nb_segments_per_proc;
 
  689      if (m_need_resize[local_segment_infos_pos] == -1)
 
  692      ARCCORE_ASSERT(m_need_resize[local_segment_infos_pos] >= 0, (
"New size must be >= 0"));
 
  693      ARCCORE_ASSERT(m_need_resize[local_segment_infos_pos] % m_sizeof_type == 0, (
"New size must be % sizeof type"));
 
  697      const Int64 size_seg = (m_comm_machine_rank == rank ? (m_need_resize[local_segment_infos_pos] == 0 ? m_sizeof_type : m_need_resize[local_segment_infos_pos]) : 0);
 
  700      MPI_Win old_win = m_all_mpi_win[local_segment_infos_pos];
 
  701      std::byte* ptr_new_seg = 
nullptr;
 
  704      int error = MPI_Win_allocate_shared(size_seg, m_sizeof_type, win_info, m_comm_machine, &ptr_new_seg, &m_all_mpi_win[local_segment_infos_pos]);
 
  705      if (error != MPI_SUCCESS) {
 
  706        MPI_Win_free(&old_win);
 
  707        ARCCORE_FATAL(
"Error with MPI_Win_allocate_shared() call");
 
  711      if (m_comm_machine_rank == rank) {
 
  717        std::byte* ptr_old_seg = 
nullptr;
 
  718        MPI_Aint mpi_reserved_size_new_seg;
 
  722          MPI_Aint size_old_seg;
 
  726          error = MPI_Win_shared_query(old_win, m_comm_machine_rank, &size_old_seg, &size_type, &ptr_old_seg);
 
  727          if (error != MPI_SUCCESS || ptr_old_seg == 
nullptr) {
 
  728            MPI_Win_free(&old_win);
 
  729            ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  735          std::byte* ptr_seg = 
nullptr;
 
  739          error = MPI_Win_shared_query(m_all_mpi_win[local_segment_infos_pos], m_comm_machine_rank, &mpi_reserved_size_new_seg, &size_type, &ptr_seg);
 
  740          if (error != MPI_SUCCESS || ptr_seg == 
nullptr || ptr_seg != ptr_new_seg) {
 
  741            MPI_Win_free(&old_win);
 
  742            ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  749        const Int64 min_size = std::min(m_need_resize[local_segment_infos_pos], m_sizeof_used_part[local_segment_infos_pos]);
 
  751        memcpy(ptr_new_seg, ptr_old_seg, min_size);
 
  754      MPI_Win_free(&old_win);
 
  757  MPI_Info_free(&win_info);
 
  760  for (Integer num_seg = 0; num_seg < m_nb_segments_per_proc; ++num_seg) {
 
  761    const Int32 segment_infos_pos = num_seg + m_comm_machine_rank * m_nb_segments_per_proc;
 
  765    std::byte* ptr_seg = 
nullptr;
 
  766    int error = MPI_Win_shared_query(m_all_mpi_win[segment_infos_pos], m_comm_machine_rank, &size_seg, &size_type, &ptr_seg);
 
  768    if (error != MPI_SUCCESS) {
 
  769      ARCCORE_FATAL(
"Error with MPI_Win_shared_query() call");
 
  772    m_reserved_part_span[num_seg] = Span<std::byte>{ ptr_seg, size_seg };
 
  779Int32 MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  780_worldToMachine(Int32 world)
 const 
  782  for (Int32 i = 0; i < m_comm_machine_size; ++i) {
 
  783    if (m_machine_ranks[i] == world) {
 
  787  ARCCORE_FATAL(
"Rank is not in machine");
 
  793Int32 MpiDynamicMultiMachineMemoryWindowBaseInternal::
 
  794_machineToWorld(Int32 machine)
 const 
  796  return m_machine_ranks[machine];
 
std::int32_t Int32
Type entier signé sur 32 bits.