Arcane  v4.1.4.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
DynamicMachineMemoryWindowMemoryAllocator.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* DynamicMachineMemoryWindowMemoryAllocator.h (C) 2000-2026 */
9/* */
10/* Allocateur mémoire utilisant la classe DynamicMachineMemoryWindowBase. */
11/*---------------------------------------------------------------------------*/
12
13#include "arcane/core/internal/DynamicMachineMemoryWindowMemoryAllocator.h"
14
15#include "arcane/utils/FatalErrorException.h"
16#include "arcane/utils/ITraceMng.h"
17
18#include "arcane/core/IParallelMng.h"
19#include "arcane/core/DynamicMachineMemoryWindowBase.h"
20
21#include "arccore/common/AllocatedMemoryInfo.h"
22
23#include <cstring>
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34DynamicMachineMemoryWindowMemoryAllocator::
35DynamicMachineMemoryWindowMemoryAllocator(IParallelMng* pm)
36: m_pm(pm)
37{}
38
39/*---------------------------------------------------------------------------*/
40/*---------------------------------------------------------------------------*/
41
42AllocatedMemoryInfo DynamicMachineMemoryWindowMemoryAllocator::
43allocate(MemoryAllocationArgs, Int64 new_size)
44{
45 if (new_size <= 0) {
46 return { nullptr, 0 };
47 }
48
49 constexpr Int64 offset = sizeof(DynamicMachineMemoryWindowBase*);
50 const Int64 new_size_with_offset = offset + new_size;
51
52 auto* win_ptr = new DynamicMachineMemoryWindowBase(m_pm, new_size_with_offset, 1);
53
54 std::byte* addr_base = win_ptr->segmentView().data();
55 std::byte* addr_after_offset = addr_base + offset;
56
57 std::memcpy(addr_base, &win_ptr, offset);
58
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;
66#endif
67
68 return { addr_after_offset, new_size };
69}
70
71/*---------------------------------------------------------------------------*/
72/*---------------------------------------------------------------------------*/
73
74AllocatedMemoryInfo DynamicMachineMemoryWindowMemoryAllocator::
75reallocate(MemoryAllocationArgs, AllocatedMemoryInfo current_ptr, Int64 new_size)
76{
77 if (current_ptr.baseAddress() == nullptr) {
78 return allocate({}, new_size);
79 }
80
81 DynamicMachineMemoryWindowBase* win = _windowBase(current_ptr);
82
83 constexpr Int64 offset = sizeof(DynamicMachineMemoryWindowBase*);
84
85 const Int64 new_size_with_offset = offset + new_size;
86
87 const Int64 d_old_size = win->segmentView().size();
88 std::byte* d_old_addr_base = win->segmentView().data();
89
90 win->resize(new_size_with_offset);
91
92 std::byte* addr_base = win->segmentView().data();
93 std::byte* addr_after_offset = addr_base + offset;
94
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;
104#endif
105
106 return { addr_after_offset, new_size };
107}
108
109/*---------------------------------------------------------------------------*/
110/*---------------------------------------------------------------------------*/
111
112void DynamicMachineMemoryWindowMemoryAllocator::
114{
115 if (ptr.baseAddress() == nullptr) {
116 return;
117 }
118
119 DynamicMachineMemoryWindowBase* win_ptr = _windowBase(ptr);
120
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()
125 << " -- addr_base : " << win_ptr->segmentView().data();
126#endif
127
128 delete win_ptr;
129}
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133
134ConstArrayView<Int32> DynamicMachineMemoryWindowMemoryAllocator::
135machineRanks(AllocatedMemoryInfo ptr)
136{
137 return _windowBase(ptr)->machineRanks();
138}
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
143void DynamicMachineMemoryWindowMemoryAllocator::
144barrier(AllocatedMemoryInfo ptr)
145{
146 _windowBase(ptr)->barrier();
147}
148
149/*---------------------------------------------------------------------------*/
150/*---------------------------------------------------------------------------*/
151
152Span<std::byte> DynamicMachineMemoryWindowMemoryAllocator::
153segmentView(AllocatedMemoryInfo ptr)
154{
155 const Span<std::byte> view = _windowBase(ptr)->segmentView();
156 constexpr Int64 offset = sizeof(DynamicMachineMemoryWindowBase*);
157 return view.subSpan(offset, view.size() - offset);
158}
159
160/*---------------------------------------------------------------------------*/
161/*---------------------------------------------------------------------------*/
162
163Span<std::byte> DynamicMachineMemoryWindowMemoryAllocator::
164segmentView(AllocatedMemoryInfo ptr, Int32 rank)
165{
166 const Span<std::byte> view = _windowBase(ptr)->segmentView(rank);
167 constexpr Int64 offset = sizeof(DynamicMachineMemoryWindowBase*);
168 return view.subSpan(offset, view.size() - offset);
169}
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
174DynamicMachineMemoryWindowBase* DynamicMachineMemoryWindowMemoryAllocator::
175_windowBase(AllocatedMemoryInfo ptr)
176{
177 constexpr Int64 offset = sizeof(DynamicMachineMemoryWindowBase*);
178
179 std::byte* addr_after_offset = static_cast<std::byte*>(ptr.baseAddress());
180 std::byte* addr_base = addr_after_offset - offset;
181
182 DynamicMachineMemoryWindowBase* win_ptr = *reinterpret_cast<DynamicMachineMemoryWindowBase**>(addr_base);
183
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;
190#endif
191
192#if 0 //def ARCANE_CHECK
193 {
194 Int64 size_obj = win_ptr->segmentView().size();
195 if (size_obj != offset + ptr.size()) {
196 // std::cout << "ERROR DynamicMachineMemoryWindowMemoryAllocator::_windowBase"
197 // << " -- win_size : " << size_obj << std::endl;
198 ARCANE_FATAL("ptr error");
199 }
200 }
201#endif
202
203 return win_ptr;
204}
205
206/*---------------------------------------------------------------------------*/
207/*---------------------------------------------------------------------------*/
208
209} // End namespace Arcane
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
#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.
Definition Span.h:537
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:325
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.