Skip to content

Update documentation about accelerator memory management #1810

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 29 additions & 10 deletions arcane/doc/doc_user/chap_acceleratorapi/4_accelerator.md
Original file line number Diff line number Diff line change
Expand Up @@ -316,12 +316,18 @@ auto out_c = viewOut(command,var_c);

### Gestion mémoire des données gérées par Arcane

Lorqu'on utilise les accélérateurs, %Arcane utilise la mémoire unifée
(aussi appelée mémoire "managée") pour toutes les variables
(\arcane{VariableRef}), pour les groupes d'entités
(\arcane{ItemGroup}) et par défaut pour les \arcane{NumArray}. Cela
signifie que les données correspondantes à ces objets sont accessibles
à la fois sur l'hôte (CPU) et sur les accélérateurs.
Par défaut, %Arcane utilise l'allocateur retourné par
\arcane{MeshUtils::getDefaultDataAllocator()} pour le type
\arcane{NumArray} ainsi que toutes les variables
(\arcane{VariableRef}), les groupes d'entités
(\arcane{ItemGroup}) et les connectivités.

Lorsqu'on utilise les accélérateurs, %Arcane requiert que cet
allocateur alloue de la mémoire qui soit accessible à la fois sur
l'hôte et l'accélérateur. Cela signifie que les données
correspondantes à ces objets sont accessibles à la fois sur l'hôte
(CPU) et sur les accélérateurs. Pour cela, %Arcane utilise par défaut
la mémoire unifiée (\arccore{eMemoryResource::UnifiedMemory}).

Avec la mémoire unifiée, c'est l'accélérateur qui gère automatiquement
les éventules transferts mémoire entre l'accélérateur et l'hôte. Ces
Expand All @@ -330,16 +336,29 @@ une donnée n'est utilisée que sur CPU ou que sur accélérateur, il n'y
aura pas de transferts mémoire et donc les performances ne seront pas
impactées.

A partir de la version 3.14.12 de %Arcane, il est possible de changer
la ressoure mémoire utilisée par défaut via la variable
d'environnement `ARCANE_DEFAULT_DATA_MEMORY_RESOURCE`. Sur les
accélérateurs où la mémoire \arccore{eMemoryResource::Device} est
accessible directement depuis l'hôte (par exemple MI250X, MI300A,
GH200), cela permet d'éviter les transferts que peut provoquer la
mémoire unifiée.

Dans tous les cas, il est possible de spécifier un allocateur
spécifique pour \arccore{UniqueArray} et \arcane{NumArray} via les
méthodes \arcane{MemoryUtils::getAllocator()} ou
\arcane{MemoryUtils::getAllocationOptions()}.

%Arcane fournit des mécanismes permettant de donner des informations
permettant d'optimiser la gestion de cette mémoire. Ces mécanismes
sont dépendants du type de l'accélérateur et peuvent ne pas être
disponible partout. Ils sont accessibles via la méthode
\arcaneacc{Runner::setMemoryAdvice()}.

A partir de la version 3.10 de %Arcane et avec les accélérateurs NVIDIA, %Arcame
propose des fonctionnalités pour détecter les transferts mémoire entre
le CPU et l'accélérateur. La page \ref arcanedoc_debug_perf_cupti
décrit ce fonctionnement.
A partir de la version 3.10 de %Arcane et avec les accélérateurs
NVIDIA, %Arcane propose des fonctionnalités pour détecter les
transferts mémoire entre le CPU et l'accélérateur. La page \ref
arcanedoc_debug_perf_cupti décrit ce fonctionnement.

### Exemple d'utilisation d'une boucle complexe {#arcanedoc_parallel_accelerator_complexloop}

Expand Down
9 changes: 9 additions & 0 deletions arcane/src/arcane/accelerator/CommonUtils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

/*!
* \namespace Arcane::Accelerator::AcceleratorUtils
*
* \brief Espace de nom pour les méthodes utilitaires des accélérateurs.
*/

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

namespace Arcane::Accelerator::impl
{

Expand Down
13 changes: 13 additions & 0 deletions arcane/src/arcane/utils/MemoryUtils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,23 @@

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/*!
* \file MemoryUtils.h
* \brief Fonctions de gestion mémoire et des allocateurs.
*/
/*!
* \namespace Arcane::MemoryUtils
* \brief Espace de noms pour les fonctions de gestion mémoire et des allocateurs.
*/
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

namespace Arcane
{

/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

namespace
{
IMemoryAllocator* global_accelerator_host_memory_allocator = nullptr;
Expand Down
Loading