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.