Arcane  v3.16.7.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
VariableUtils.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* VariableUtils.cc (C) 2000-2025 */
9/* */
10/* Fonctions utilitaires diverses sur les variables. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
15
17#include "arcane/utils/IMemoryAllocator.h"
18
19#include "arcane/accelerator/core/RunQueue.h"
20#include "arcane/accelerator/core/Memory.h"
21
22#include "arcane/core/IData.h"
23#include "arcane/core/IVariable.h"
24#include "arcane/core/VariableRef.h"
25#include "arcane/core/internal/IDataInternal.h"
26#include "arcane/core/internal/IVariableInternal.h"
27#include "arcane/core/datatype/DataAllocationInfo.h"
29#include "arcane/core/materials/internal/IMeshMaterialVariableInternal.h"
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33/*!
34 * \file VariableUtils.h
35 *
36 * \brief Fonctions utilitaires sur les variables.
37 */
38/*---------------------------------------------------------------------------*/
39/*---------------------------------------------------------------------------*/
40
41namespace Arcane
42{
43using namespace Arcane::Accelerator;
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47
48void VariableUtils::
49prefetchVariableAsync(IVariable* var, const RunQueue* queue_or_null)
50{
52 if (!queue_or_null)
53 return;
54 if (!var->isUsed())
55 return;
56 IData* d = var->data();
57 INumericDataInternal* nd = d->_commonInternal()->numericData();
58 if (!nd)
59 return;
60 // On ne pré-charge que si la variable est en mémoire unifiée.
61 // Cela n'est utile que dans ce cas et de plus avec CUDA cela provoque
62 // une erreur si la mémoire n'est pas u
63 if (nd->memoryAllocator()->memoryResource() != eMemoryResource::UnifiedMemory)
64 return;
65 ConstMemoryView mem_view = nd->memoryView();
66 queue_or_null->prefetchMemory(MemoryPrefetchArgs(mem_view).addAsync());
67}
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
71
72void VariableUtils::
73prefetchVariableAsync(VariableRef& var, const RunQueue* queue_or_null)
74{
75 return prefetchVariableAsync(var.variable(), queue_or_null);
76}
77
78/*---------------------------------------------------------------------------*/
79/*---------------------------------------------------------------------------*/
80
81void VariableUtils::
82markVariableAsMostlyReadOnly(IVariable* var)
83{
85 var->setAllocationInfo(alloc_info);
86}
87
88/*---------------------------------------------------------------------------*/
89/*---------------------------------------------------------------------------*/
90
91void VariableUtils::
92markVariableAsMostlyReadOnly(VariableRef& var)
93{
95}
96
97/*---------------------------------------------------------------------------*/
98/*---------------------------------------------------------------------------*/
99
100void VariableUtils::
101markVariableAsMostlyReadOnly(::Arcane::Materials::MeshMaterialVariableRef& var)
102{
103 auto vars = var.materialVariable()->_internalApi()->variableReferenceList();
104 for (VariableRef* v : vars)
105 markVariableAsMostlyReadOnly(v->variable());
106}
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110
111void VariableUtils::
112experimentalChangeAllocator(::Arcane::Materials::IMeshMaterialVariable* var,
114{
116 Arcane::Materials::IMeshMaterialVariableInternal* mat_var = var->_internalApi();
117 for (VariableRef* vref : mat_var->variableReferenceList())
118 vref->variable()->_internalApi()->changeAllocator(mem_opts);
119 var->globalVariable()->_internalApi()->changeAllocator(mem_opts);
120}
121
122/*---------------------------------------------------------------------------*/
123/*---------------------------------------------------------------------------*/
124
125void VariableUtils::
126experimentalChangeAllocator(IVariable* var, eMemoryRessource mem)
127{
129 var->_internalApi()->changeAllocator(mem_opts);
130}
131
132/*---------------------------------------------------------------------------*/
133/*---------------------------------------------------------------------------*/
134
135void VariableUtils::
136experimentalChangeAllocator(VariableRef& var, eMemoryRessource mem)
137{
138 experimentalChangeAllocator(var.variable(), mem);
139}
140
141/*---------------------------------------------------------------------------*/
142/*---------------------------------------------------------------------------*/
143
144} // namespace Arcane
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Fonctions de gestion mémoire et des allocateurs.
Fonctions utilitaires sur les variables.
void markVariableAsMostlyReadOnly(IVariable *var)
Indique que la variable est essentiellement en lecture.
void prefetchVariableAsync(IVariable *var, const RunQueue *queue_or_null)
Pré-copie la mémoire associée à la variable var.
Arguments pour le préfetching mémoire.
Definition Memory.h:125
File d'exécution pour un accélérateur.
void prefetchMemory(const MemoryPrefetchArgs &args) const
Effectue un préfetching de la mémoire.
Definition RunQueue.cc:247
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
Definition MemoryView.h:38
Informations sur l'allocation d'une donnée.
Interface d'une donnée.
Definition IData.h:33
Interface d'une variable.
Definition IVariable.h:39
virtual IData * data()=0
Données associées à la variable.
virtual bool isUsed() const =0
Etat d'utilisation de la variable.
virtual void setAllocationInfo(const DataAllocationInfo &v)=0
Positionne les informations sur l'allocation.
virtual IVariableInternal * _internalApi()=0
API interne à Arcane.
Interface d'une variable matériau d'un maillage.
virtual IVariable * globalVariable() const =0
Variable globale sur le maillage associée.
Classe de base des références aux variables matériaux.
IMeshMaterialVariable * materialVariable() const
Variable matériau associée.
Options pour configurer les allocations.
Référence à une variable.
Definition VariableRef.h:56
IVariable * variable() const
Variable associée.
MemoryAllocationOptions getAllocationOptions(eMemoryResource mem_resource)
Allocation par défaut pour la ressource mem_resource.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
@ HostAndDeviceMostlyRead
Indique que la donnée sera utilisée à la fois sur accélérateur et sur CPU et qu'elle ne sera pas souv...
Arcane::eMemoryResource eMemoryRessource
Typedef pour la version Arcane historique (avec 2's')
@ UnifiedMemory
Alloue en utilisant la mémoire unifiée.