13#include "arcane/core/internal/DynamicMachineMemoryWindowMemoryAllocator.h"
15#include "arcane/utils/FatalErrorException.h"
16#include "arcane/utils/ITraceMng.h"
18#include "arcane/core/IParallelMng.h"
19#include "arcane/core/DynamicMachineMemoryWindowBase.h"
21#include "arccore/common/AllocatedMemoryInfo.h"
34DynamicMachineMemoryWindowMemoryAllocator::
35DynamicMachineMemoryWindowMemoryAllocator(
IParallelMng* pm)
46 return {
nullptr, 0 };
50 const Int64 new_size_with_offset = offset + new_size;
54 std::byte* addr_base = win_ptr->segmentView().data();
55 std::byte* addr_after_offset = addr_base + offset;
57 std::memcpy(addr_base, &win_ptr, offset);
59#ifdef ARCANE_DEBUG_ALLOCATOR
60 m_pm->traceMng()->debug() <<
"DynamicMachineMemoryWindowMemoryAllocator::allocate"
61 <<
" -- ptr.size() : " << new_size
62 <<
" -- offset : " << offset
63 <<
" -- win_size (offset+ptr.size()) : " << new_size_with_offset
64 <<
" -- addr_base : " << addr_base
65 <<
" -- addr_after_offset : " << addr_after_offset;
68 return { addr_after_offset, new_size };
85 const Int64 new_size_with_offset = offset + new_size;
90 win->
resize(new_size_with_offset);
93 std::byte* addr_after_offset = addr_base + offset;
95#ifdef ARCANE_DEBUG_ALLOCATOR
96 m_pm->traceMng()->debug() <<
"DynamicMachineMemoryWindowMemoryAllocator::reallocate"
97 <<
" -- old_size : " << d_old_size
98 <<
" -- old_addr_base : " << d_old_addr_base
99 <<
" -- new ptr.size() : " << new_size
100 <<
" -- offset : " << offset
101 <<
" -- win_size (offset+ptr.size()) : " << new_size_with_offset
102 <<
" -- addr_base : " << addr_base
103 <<
" -- addr_after_offset : " << addr_after_offset;
106 return { addr_after_offset, new_size };
112void DynamicMachineMemoryWindowMemoryAllocator::
121#ifdef ARCANE_DEBUG_ALLOCATOR
122 m_pm->traceMng()->debug() <<
"DynamicMachineMemoryWindowMemoryAllocator::deallocate"
123 <<
" -- ptr.size() : " << ptr.
size()
124 <<
" -- win_size (offset+ptr.size()) : " << win_ptr->
segmentView().
size()
137 return _windowBase(ptr)->machineRanks();
143void DynamicMachineMemoryWindowMemoryAllocator::
144barrier(AllocatedMemoryInfo ptr)
146 _windowBase(ptr)->barrier();
152Span<std::byte> DynamicMachineMemoryWindowMemoryAllocator::
153segmentView(AllocatedMemoryInfo ptr)
155 const Span<std::byte> view = _windowBase(ptr)->segmentView();
156 constexpr Int64 offset =
sizeof(DynamicMachineMemoryWindowBase*);
157 return view.subSpan(offset, view.size() - offset);
163Span<std::byte> DynamicMachineMemoryWindowMemoryAllocator::
164segmentView(AllocatedMemoryInfo ptr, Int32 rank)
166 const Span<std::byte> view = _windowBase(ptr)->segmentView(rank);
167 constexpr Int64 offset =
sizeof(DynamicMachineMemoryWindowBase*);
168 return view.subSpan(offset, view.size() - offset);
174DynamicMachineMemoryWindowBase* DynamicMachineMemoryWindowMemoryAllocator::
175_windowBase(AllocatedMemoryInfo ptr)
177 constexpr Int64 offset =
sizeof(DynamicMachineMemoryWindowBase*);
179 std::byte* addr_after_offset =
static_cast<std::byte*
>(ptr.baseAddress());
180 std::byte* addr_base = addr_after_offset - offset;
182 DynamicMachineMemoryWindowBase* win_ptr = *
reinterpret_cast<DynamicMachineMemoryWindowBase**
>(addr_base);
184#ifdef ARCANE_DEBUG_ALLOCATOR
185 std::cout <<
"DynamicMachineMemoryWindowMemoryAllocator::_windowBase"
186 <<
" -- ptr.size() : " << ptr.
size()
187 <<
" -- offset : " << offset
188 <<
" -- addr_base : " << addr_base
189 <<
" -- addr_after_offset : " << addr_after_offset << std::endl;
194 Int64 size_obj = win_ptr->segmentView().size();
195 if (size_obj != offset + ptr.size()) {
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Informations sur une zone mémoire allouée.
void * baseAddress() const
Adresse du début de la zone allouée.
Int64 size() const
Taille en octets de la zone mémoire utilisée. (-1) si inconnue.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Classe permettant de créer une fenêtre mémoire partagée entre les sous-domaines d'un même noeud.
void resize(Int64 new_nb_elem_segment)
Méthode permettant de redimensionner notre segment.
Span< std::byte > segmentView()
Méthode permettant d'obtenir une vue sur notre segment.
AllocatedMemoryInfo allocate(MemoryAllocationArgs, Int64 new_size) override
Alloue de la mémoire pour new_size octets et retourne le pointeur.
Interface du gestionnaire de parallélisme pour un sous-domaine.
Classe contenant des informations pour spécialiser les allocations.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.