Skip to content

Commit 5491086

Browse files
Merge pull request #1808 from arcaneframework/dev/gg-add-support-to-change-data-memory-allocator
Add support to change memory resource used for default data allocator
2 parents aa6ca58 + cd9d676 commit 5491086

File tree

7 files changed

+148
-20
lines changed

7 files changed

+148
-20
lines changed

Diff for: arcane/src/arcane/accelerator/core/AcceleratorRuntimeInitialisationInfo.cc

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "arcane/utils/ITraceMng.h"
1717
#include "arcane/utils/String.h"
1818
#include "arcane/utils/Property.h"
19+
#include "arcane/utils/MemoryUtils.h"
1920

2021
#include "arcane/accelerator/core/Runner.h"
2122
#include "arcane/accelerator/core/DeviceId.h"
@@ -175,6 +176,7 @@ arcaneInitializeRunner(Accelerator::Runner& runner,ITraceMng* tm,
175176
if (policy==eExecutionPolicy::None)
176177
ARCANE_FATAL("Invalid policy eExecutionPolicy::None");
177178
tm->info() << "AcceleratorRuntime=" << accelerator_runtime;
179+
tm->info() << "DefaultDataAllocator MemoryResource=" << MemoryUtils::getDefaultDataMemoryResource();
178180
if (impl::isAcceleratorPolicy(policy)){
179181
tm->info() << "Using accelerator runtime=" << policy << " device=" << acc_info.deviceId();
180182
runner.initialize(policy,acc_info.deviceId());

Diff for: arcane/src/arcane/impl/ArcaneMain.cc

+16-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
#include "arcane/utils/CommandLineArguments.h"
3636
#include "arcane/utils/ApplicationInfo.h"
3737
#include "arcane/utils/TestLogger.h"
38+
#include "arcane/utils/MemoryUtils.h"
39+
#include "arcane/utils/internal/MemoryUtilsInternal.h"
3840

3941
#include "arcane/core/ArcaneException.h"
4042
#include "arcane/core/IMainFactory.h"
@@ -1113,7 +1115,7 @@ _checkAutoDetectMPI()
11131115
*
11141116
* \retval 0 si tout est OK
11151117
*
1116-
* \note Ne pas appeler directement cette méthode mais
1118+
* \note Il ne faut pas appeler directement cette méthode mais
11171119
* passer par ArcaneMainAutoDetectHelper.
11181120
*/
11191121
int ArcaneMain::
@@ -1130,7 +1132,7 @@ _checkAutoDetectAccelerator(bool& has_accelerator)
11301132
return 0;
11311133

11321134
try {
1133-
// Pour l'instant, seul les runtimes 'cuda' et 'hip' sont autorisés
1135+
// Pour l'instant, seul les runtimes 'cuda', 'hip' et 'sycl' sont autorisés
11341136
if (runtime_name != "cuda" && runtime_name != "hip" && runtime_name != "sycl")
11351137
ARCANE_FATAL("Invalid accelerator runtime '{0}'. Only 'cuda', 'hip' or 'sycl' is allowed", runtime_name);
11361138

@@ -1165,8 +1167,20 @@ _checkAutoDetectAccelerator(bool& has_accelerator)
11651167
if (!verbose_str.null())
11661168
runtime_info.setVerbose(true);
11671169

1170+
// Par défaut utilise la mémoire unifiée pour les données.
1171+
// Le runtime accélérateur pourra changer cela.
1172+
MemoryUtils::setDefaultDataMemoryResource(eMemoryResource::UnifiedMemory);
1173+
11681174
(*my_functor)(runtime_info);
11691175
has_accelerator = true;
1176+
1177+
// Permet de surcharger le choix de l'allocateur des données
1178+
String data_allocator_str = Arcane::platform::getEnvironmentVariable("ARCANE_DEFAULT_DATA_MEMORY_RESOURCE");
1179+
if (!data_allocator_str.null()){
1180+
eMemoryResource v = MemoryUtils::getMemoryResourceFromName(data_allocator_str);
1181+
if (v!=eMemoryResource::Unknown)
1182+
MemoryUtils::setDefaultDataMemoryResource(v);
1183+
}
11701184
}
11711185
catch (const Exception& ex) {
11721186
return arcanePrintArcaneException(ex, nullptr);

Diff for: arcane/src/arcane/tests/CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
set(TEST_DIRS . anyitem dof inout)
1+
set(TEST_DIRS . anyitem dof inout)
22

33
set(TEST_LIBS ${ARCANE_ADDITIONNAL_TEST_LIBRARIES})
44
if(MPI_FOUND AND NOT WIN32)
@@ -365,6 +365,7 @@ if (ARCANE_HAS_ACCELERATOR_API)
365365
arcane_add_test_sequential(standalone_accelerator_testsum dummy.arc "-A,StandaloneAcceleratorMethod=TestSum")
366366
arcane_add_test_sequential(standalone_accelerator_testbinop dummy.arc "-A,StandaloneAcceleratorMethod=TestBinOp")
367367
arcane_add_accelerator_test_sequential(standalone_accelerator_testsum dummy.arc "-A,StandaloneAcceleratorMethod=TestSum")
368+
arcane_add_accelerator_test_sequential(standalone_accelerator_testsum_hostpinned dummy.arc "-A,StandaloneAcceleratorMethod=TestSum" "-We,ARCANE_DEFAULT_DATA_MEMORY_RESOURCE,HostPinned")
368369
arcane_add_accelerator_test_sequential(standalone_accelerator_testbinop dummy.arc "-A,StandaloneAcceleratorMethod=TestBinOp")
369370
arcane_add_accelerator_test_sequential(standalone_accelerator_testemptykernel dummy.arc "-A,StandaloneAcceleratorMethod=TestEmptyKernel")
370371
endif()

Diff for: arcane/src/arcane/utils/MemoryUtils.cc

+46-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313

1414
#include "arcane/utils/MemoryUtils.h"
1515

16-
#include "arcane/utils/PlatformUtils.h"
16+
#include "arcane/utils/FatalErrorException.h"
1717
#include "arcane/utils/MemoryAllocator.h"
1818
#include "arcane/utils/IMemoryRessourceMng.h"
19+
#include "arcane/utils/String.h"
1920
#include "arcane/utils/internal/IMemoryRessourceMngInternal.h"
2021
#include "arcane/utils/internal/MemoryUtilsInternal.h"
2122
#include "arcane/utils/internal/MemoryResourceMng.h"
@@ -31,11 +32,54 @@ namespace
3132
IMemoryAllocator* global_accelerator_host_memory_allocator = nullptr;
3233
MemoryResourceMng global_default_data_memory_resource_mng;
3334
IMemoryRessourceMng* global_data_memory_resource_mng = nullptr;
35+
eMemoryResource global_data_memory_resource = eMemoryResource::Host;
3436
} // namespace
3537

3638
/*---------------------------------------------------------------------------*/
3739
/*---------------------------------------------------------------------------*/
3840

41+
eMemoryResource MemoryUtils::
42+
getDefaultDataMemoryResource()
43+
{
44+
return global_data_memory_resource;
45+
}
46+
47+
/*---------------------------------------------------------------------------*/
48+
/*---------------------------------------------------------------------------*/
49+
50+
void MemoryUtils::
51+
setDefaultDataMemoryResource(eMemoryResource v)
52+
{
53+
global_data_memory_resource = v;
54+
}
55+
56+
/*---------------------------------------------------------------------------*/
57+
/*---------------------------------------------------------------------------*/
58+
59+
eMemoryResource MemoryUtils::
60+
getMemoryResourceFromName(const String& name)
61+
{
62+
eMemoryResource v = eMemoryResource::Unknown;
63+
if (name.null())
64+
return v;
65+
if (name == "Device")
66+
v = eMemoryResource::Device;
67+
else if (name == "Host")
68+
v = eMemoryResource::Host;
69+
else if (name == "HostPinned")
70+
v = eMemoryResource::HostPinned;
71+
else if (name == "UnifiedMemory")
72+
v = eMemoryResource::UnifiedMemory;
73+
else
74+
ARCANE_FATAL("Invalid name '{0}' for memory resource. Valid names are "
75+
"'Device', 'Host', 'HostPinned' or 'UnifieMemory'.",
76+
name);
77+
return v;
78+
}
79+
80+
/*---------------------------------------------------------------------------*/
81+
/*---------------------------------------------------------------------------*/
82+
3983
IMemoryRessourceMng* MemoryUtils::
4084
setDataMemoryResourceMng(IMemoryRessourceMng* mng)
4185
{
@@ -63,7 +107,7 @@ getDataMemoryResourceMng()
63107
IMemoryAllocator* MemoryUtils::
64108
getDefaultDataAllocator()
65109
{
66-
return getDataMemoryResourceMng()->getAllocator(eMemoryResource::UnifiedMemory);
110+
return getDataMemoryResourceMng()->getAllocator(getDefaultDataMemoryResource());
67111
}
68112

69113
/*---------------------------------------------------------------------------*/

Diff for: arcane/src/arcane/utils/MemoryUtils.h

+48-15
Original file line numberDiff line numberDiff line change
@@ -29,29 +29,49 @@ namespace Arcane::MemoryUtils
2929
/*---------------------------------------------------------------------------*/
3030
/*---------------------------------------------------------------------------*/
3131
/*!
32-
* \brief Allocateur par défaut pour les données.
32+
* \brief Ressource mémoire utilisée par l'allocateur par défaut pour les données.
3333
*
34-
* Si un runtime accélérateur est initialisé, l'allocateur retourné permet
35-
* d'allouer en mémoire unifiée et donc la zone allouée sera accessible à la
36-
* fois sur l'accélérateur et sur l'hôte. Sinon, retourne un allocateur
37-
* aligné.
34+
* Par défaut, si un runtime accélérateur est initialisé, la ressource
35+
* associé est eMemoryResource::UnifiedMemory. Sinon, il s'agit de
36+
* eMemoryResource::Host.
3837
*
39-
* Il est garanti que l'alignement est au moins celui retourné par
40-
* AlignedMemoryAllocator::Simd().
38+
* \sa getDefaultDataAllocator();
4139
*/
42-
extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
43-
getDefaultDataAllocator();
40+
extern "C++" ARCANE_UTILS_EXPORT eMemoryResource
41+
getDefaultDataMemoryResource();
4442

43+
/*---------------------------------------------------------------------------*/
44+
/*---------------------------------------------------------------------------*/
4545
/*!
46-
* \brief Retourne l'allocateur sur l'hôte ou sur le device.
46+
* \brief Retourne la ressource mémoire par son nom.
4747
*
48-
* Si un runtime accélérateur est initialisé, l'allocateur retourné permet
49-
* d'allouer en utilisant la mémoire de l'accélérateur par défaut
50-
* (eMemoryResource::Device). Sinon, utilise l'allocateur de l'hôte
51-
* (eMemoryResource::Host).
48+
* Le nom correspond au nom de la valeur de l'énumération (par exemple
49+
* 'Device' pour eMemoryResource::Device.
50+
*
51+
* Si \a name est nul, retourn eMemoryResource::Unknown.
52+
* Si \a name ne correspondant pas à une valeur valide, lève une exception.
53+
*/
54+
extern "C++" ARCANE_UTILS_EXPORT eMemoryResource
55+
getMemoryResourceFromName(const String& name);
56+
57+
/*---------------------------------------------------------------------------*/
58+
/*---------------------------------------------------------------------------*/
59+
/*!
60+
* \brief Allocateur par défaut pour les données.
61+
*
62+
* L'allocateur par défaut pour les données est un allocateur qui permet
63+
* d'accéder à la zone mémoire à la fois par l'hôte et l'accélérateur.
64+
*
65+
* Il est possible de récupérer la ressource mémoire associée via
66+
* getDefaultDataMemoryResource();
67+
*
68+
* Cet appel est équivalent à getAllocator(getDefaultDataMemoryResource()).
69+
*
70+
* Il est garanti que l'alignement est au moins celui retourné par
71+
* AlignedMemoryAllocator::Simd().
5272
*/
5373
extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
54-
getDeviceOrHostAllocator();
74+
getDefaultDataAllocator();
5575

5676
/*---------------------------------------------------------------------------*/
5777
/*---------------------------------------------------------------------------*/
@@ -65,6 +85,19 @@ getDeviceOrHostAllocator();
6585
extern "C++" ARCANE_UTILS_EXPORT MemoryAllocationOptions
6686
getDefaultDataAllocator(eMemoryLocationHint hint);
6787

88+
/*---------------------------------------------------------------------------*/
89+
/*---------------------------------------------------------------------------*/
90+
/*!
91+
* \brief Retourne l'allocateur sur l'hôte ou sur le device.
92+
*
93+
* Si un runtime accélérateur est initialisé, l'allocateur retourné permet
94+
* d'allouer en utilisant la mémoire de l'accélérateur par défaut
95+
* (eMemoryResource::Device). Sinon, utilise l'allocateur de l'hôte
96+
* (eMemoryResource::Host).
97+
*/
98+
extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
99+
getDeviceOrHostAllocator();
100+
68101
/*---------------------------------------------------------------------------*/
69102
/*---------------------------------------------------------------------------*/
70103
/*!

Diff for: arcane/src/arcane/utils/internal/MemoryUtilsInternal.h

+11
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,17 @@ getDataMemoryResourceMng();
5656
extern "C++" ARCANE_UTILS_EXPORT IMemoryAllocator*
5757
setAcceleratorHostMemoryAllocator(IMemoryAllocator* a);
5858

59+
/*---------------------------------------------------------------------------*/
60+
/*---------------------------------------------------------------------------*/
61+
/*!
62+
* \brief Positionne la ressource mémoire utilisée pour l'allocateur
63+
* mémoire des données.
64+
*
65+
* \sa getDefaultDataMemoryResource();
66+
*/
67+
extern "C++" ARCANE_UTILS_EXPORT void
68+
setDefaultDataMemoryResource(eMemoryResource mem_resource);
69+
5970
/*---------------------------------------------------------------------------*/
6071
/*---------------------------------------------------------------------------*/
6172

Diff for: arcane/src/arcane/utils/tests/TestMemory.cc

+23
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "arcane/utils/Exception.h"
1313
#include "arcane/utils/MemoryUtils.h"
1414
#include "arcane/utils/NumericTypes.h"
15+
#include "arcane/utils/internal/MemoryUtilsInternal.h"
1516

1617
#include <random>
1718

@@ -173,6 +174,28 @@ TEST(Memory, Basic)
173174
}
174175
}
175176

177+
/*---------------------------------------------------------------------------*/
178+
/*---------------------------------------------------------------------------*/
179+
namespace
180+
{
181+
void _checkSetDataMemoryResource(const String& name, eMemoryResource expected_mem_resource)
182+
{
183+
eMemoryResource v = MemoryUtils::getMemoryResourceFromName(name);
184+
ASSERT_EQ(v, expected_mem_resource);
185+
MemoryUtils::setDefaultDataMemoryResource(v);
186+
eMemoryResource v2 = MemoryUtils::getDefaultDataMemoryResource();
187+
ASSERT_EQ(v2, expected_mem_resource);
188+
}
189+
} // namespace
190+
191+
TEST(Memory, Allocator)
192+
{
193+
_checkSetDataMemoryResource("Device", eMemoryResource::Device);
194+
_checkSetDataMemoryResource("HostPinned", eMemoryResource::HostPinned);
195+
_checkSetDataMemoryResource("Host", eMemoryResource::Host);
196+
_checkSetDataMemoryResource("UnifiedMemory", eMemoryResource::UnifiedMemory);
197+
}
198+
176199
/*---------------------------------------------------------------------------*/
177200
/*---------------------------------------------------------------------------*/
178201

0 commit comments

Comments
 (0)