Arcane  v4.1.1.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
SyclAcceleratorRuntime.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/* SyclAcceleratorRuntime.cc (C) 2000-2025 */
9/* */
10/* Runtime pour 'SYCL'. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/accelerator_native/SyclAccelerator.h"
15
16#include "arccore/base/FatalErrorException.h"
17#include "arccore/base/NotImplementedException.h"
18#include "arccore/base/NotSupportedException.h"
19
20#include "arccore/common/AlignedMemoryAllocator.h"
21#include "arccore/common/AllocatedMemoryInfo.h"
22#include "arccore/common/internal/MemoryUtilsInternal.h"
23#include "arccore/common/internal/IMemoryResourceMngInternal.h"
24
25#include "arccore/common/accelerator/RunQueueBuildInfo.h"
26#include "arccore/common/accelerator/Memory.h"
27#include "arccore/common/accelerator/DeviceInfoList.h"
28#include "arccore/common/accelerator/KernelLaunchArgs.h"
29#include "arccore/common/accelerator/RunQueue.h"
30#include "arccore/common/accelerator/DeviceMemoryInfo.h"
31#include "arccore/common/accelerator/NativeStream.h"
32#include "arccore/common/accelerator/internal/IRunnerRuntime.h"
33#include "arccore/common/accelerator/internal/RegisterRuntimeInfo.h"
34#include "arccore/common/accelerator/internal/RunCommandImpl.h"
35#include "arccore/common/accelerator/internal/IRunQueueStream.h"
36#include "arccore/common/accelerator/internal/IRunQueueEventImpl.h"
37
38namespace Arcane::Accelerator::Sycl
39{
40
41#define ARCANE_SYCL_FUNC_NOT_HANDLED \
42 std::cout << "WARNING: SYCL: function not handled " << A_FUNCINFO << "\n"
43
45
46/*---------------------------------------------------------------------------*/
47/*---------------------------------------------------------------------------*/
48
49// Cette file est utilisée pour les allocations.
50// Elle doit donc toujours exister car on ne sait pas quand aura lieu
51// la dernière désallocation.
52sycl::queue global_default_queue;
53namespace
54{
55 sycl::queue& _defaultQueue()
56 {
57 return global_default_queue;
58 }
59} // namespace
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
66class SyclMemoryAllocatorBase
67: public AlignedMemoryAllocator
68{
69 public:
70
71 SyclMemoryAllocatorBase()
72 : AlignedMemoryAllocator(128)
73 {}
74
75 bool hasRealloc(MemoryAllocationArgs) const override { return true; }
77 {
78 sycl::queue& q = _defaultQueue();
79 void* out = nullptr;
80 _allocate(&out, new_size, args, q);
81 if (!out)
82 ARCCORE_FATAL("Can not allocate memory size={0}", new_size);
83 Int64 a = reinterpret_cast<Int64>(out);
84 if ((a % 128) != 0)
85 ARCCORE_FATAL("Bad alignment for SYCL allocator: offset={0}", (a % 128));
86 return { out, new_size };
87 }
89 {
90 sycl::queue& q = _defaultQueue();
91 AllocatedMemoryInfo a = allocate(args, new_size);
92 q.submit([&](sycl::handler& cgh) {
93 cgh.memcpy(a.baseAddress(), current_ptr.baseAddress(), current_ptr.size());
94 });
95 q.wait();
96
97 deallocate(args, current_ptr);
98 return a;
99 }
101 {
102 sycl::queue& q = _defaultQueue();
103 _deallocate(ptr.baseAddress(), args, q);
104 }
105
106 protected:
107
108 virtual void _allocate(void** ptr, size_t new_size, MemoryAllocationArgs, sycl::queue& q) = 0;
109 virtual void _deallocate(void* ptr, MemoryAllocationArgs, sycl::queue& q) = 0;
110};
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
114
116: public SyclMemoryAllocatorBase
117{
118 protected:
119
120 void _allocate(void** ptr, size_t new_size, MemoryAllocationArgs, sycl::queue& q) override
121 {
122 *ptr = sycl::malloc_shared(new_size, q);
123 }
124 void _deallocate(void* ptr, MemoryAllocationArgs, sycl::queue& q) override
125 {
126 sycl::free(ptr, q);
127 }
129};
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133
135: public SyclMemoryAllocatorBase
136{
137 protected:
138
139 void _allocate(void** ptr, size_t new_size, MemoryAllocationArgs, sycl::queue& q) override
140 {
141 // TODO: Faire host-pinned
142 *ptr = sycl::malloc_host(new_size, q);
143 }
144 void _deallocate(void* ptr, MemoryAllocationArgs, sycl::queue& q) override
145 {
146 sycl::free(ptr, q);
147 }
149};
150
151/*---------------------------------------------------------------------------*/
152/*---------------------------------------------------------------------------*/
153
155: public SyclMemoryAllocatorBase
156{
157 protected:
158
159 void _allocate(void** ptr, size_t new_size, MemoryAllocationArgs, sycl::queue& q) override
160 {
161 *ptr = sycl::malloc_device(new_size, q);
162 }
163 void _deallocate(void* ptr, MemoryAllocationArgs, sycl::queue& q) override
164 {
165 sycl::free(ptr, q);
166 }
168};
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
172
173namespace
174{
175 UnifiedMemorySyclMemoryAllocator unified_memory_sycl_memory_allocator;
176 HostPinnedSyclMemoryAllocator host_pinned_sycl_memory_allocator;
177 DeviceSyclMemoryAllocator device_sycl_memory_allocator;
178} // namespace
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
182
183class SyclRunQueueStream
185{
186 public:
187
188 SyclRunQueueStream(SyclRunnerRuntime* runtime, const RunQueueBuildInfo& bi);
189 ~SyclRunQueueStream() override
190 {
191 }
192
193 public:
194
195 void notifyBeginLaunchKernel([[maybe_unused]] impl::RunCommandImpl& c) override
196 {
197 return m_runtime->notifyBeginLaunchKernel();
198 }
200 {
201 return m_runtime->notifyEndLaunchKernel();
202 }
203 void barrier() override
204 {
205 m_sycl_stream->wait_and_throw();
206 }
207 bool _barrierNoException() override
208 {
209 m_sycl_stream->wait();
210 return false;
211 }
212 void copyMemory(const MemoryCopyArgs& args) override
213 {
214 auto source_bytes = args.source().bytes();
215 m_sycl_stream->memcpy(args.destination().data(), source_bytes.data(),
216 source_bytes.size());
217 if (!args.isAsync())
218 this->barrier();
219 }
220 void prefetchMemory([[maybe_unused]] const MemoryPrefetchArgs& args) override
221 {
222 auto source_bytes = args.source().bytes();
223 Int64 nb_byte = source_bytes.size();
224 if (nb_byte == 0)
225 return;
226 m_sycl_stream->prefetch(source_bytes.data(), nb_byte);
227 if (!args.isAsync())
228 this->barrier();
229 }
231 {
232 return Impl::NativeStream(m_sycl_stream.get());
233 }
234
235 void _setSyclLastCommandEvent([[maybe_unused]] void* sycl_event_ptr) override
236 {
237 sycl::event last_event;
238 if (sycl_event_ptr)
239 last_event = *(reinterpret_cast<sycl::event*>(sycl_event_ptr));
240 m_last_command_event = last_event;
241 }
242
243 public:
244
245 static sycl::async_handler _getAsyncHandler()
246 {
247 auto err_handler = [](const sycl::exception_list& exceptions) {
248 std::ostringstream ostr;
249 ostr << "Error in SYCL runtime\n";
250 for (const std::exception_ptr& e : exceptions) {
251 try {
252 std::rethrow_exception(e);
253 }
254 catch (const sycl::exception& e) {
255 ostr << "SYCL exception: " << e.what() << "\n";
256 }
257 }
258 ARCCORE_FATAL(ostr.str());
259 };
260 return err_handler;
261 }
262
264 sycl::event lastCommandEvent() { return m_last_command_event; }
265
266 public:
267
268 sycl::queue& trueStream() const
269 {
270 return *m_sycl_stream;
271 }
272
273 private:
274
275 impl::IRunnerRuntime* m_runtime;
276 std::unique_ptr<sycl::queue> m_sycl_stream;
277 sycl::event m_last_command_event;
278};
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
282
283class SyclRunQueueEvent
285{
286 public:
287
288 explicit SyclRunQueueEvent([[maybe_unused]] bool has_timer)
289 {
290 }
291 ~SyclRunQueueEvent() override
292 {
293 }
294
295 public:
296
297 // Enregistre l'événement au sein d'une RunQueue
298 void recordQueue([[maybe_unused]] impl::IRunQueueStream* stream) final
299 {
300 ARCCORE_CHECK_POINTER(stream);
301 auto* rq = static_cast<SyclRunQueueStream*>(stream);
302 m_sycl_event = rq->lastCommandEvent();
303#if defined(__ADAPTIVECPP__)
304 m_recorded_stream = stream;
305 // TODO: Vérifier s'il faut faire quelque chose
306#elif defined(__INTEL_LLVM_COMPILER)
307 //m_sycl_event = rq->trueStream().ext_oneapi_submit_barrier();
308#else
309 ARCCORE_THROW(NotSupportedException, "Only supported for AdaptiveCpp and Intel DPC++ implementation");
310#endif
311 }
312
313 void wait() final
314 {
315 //ARCANE_SYCL_FUNC_NOT_HANDLED;
316 // TODO: Vérifier ce que cela signifie exactement
317 m_sycl_event.wait();
318 }
319
320 void waitForEvent([[maybe_unused]] impl::IRunQueueStream* stream) final
321 {
322#if defined(__ADAPTIVECPP__)
323 auto* rq = static_cast<SyclRunQueueStream*>(stream);
324 m_sycl_event.wait(rq->trueStream().get_wait_list());
325#elif defined(__INTEL_LLVM_COMPILER)
326 std::vector<sycl::event> events;
327 events.push_back(m_sycl_event);
328 auto* rq = static_cast<SyclRunQueueStream*>(stream);
329 rq->trueStream().ext_oneapi_submit_barrier(events);
330#else
331 ARCANE_THROW(NotSupportedException, "Only supported for AdaptiveCpp and Intel DPC++ implementation");
332#endif
333 }
334
335 Int64 elapsedTime([[maybe_unused]] IRunQueueEventImpl* start_event) final
336 {
337 ARCCORE_CHECK_POINTER(start_event);
338 // Il faut prendre l'évènement de début car on est certain qu'il contient
339 // la bonne valeur de 'sycl::event'.
340 sycl::event event = (static_cast<SyclRunQueueEvent*>(start_event))->m_sycl_event;
341 // Si pas d'évènement associé, on ne fait rien pour éviter une exception
342 if (event==sycl::event())
343 return 0;
344
345 bool is_submitted = event.get_info<sycl::info::event::command_execution_status>() == sycl::info::event_command_status::complete;
346 if (!is_submitted)
347 return 0;
348 Int64 start = event.get_profiling_info<sycl::info::event_profiling::command_start>();
349 Int64 end = event.get_profiling_info<sycl::info::event_profiling::command_end>();
350 return (end - start);
351 }
352
353 bool hasPendingWork() final
354 {
355 ARCCORE_THROW(NotImplementedException,"hasPendingWork()");
356 }
357
358 private:
359
360 sycl::event m_sycl_event;
361 impl::IRunQueueStream* m_recorded_stream = nullptr;
362};
363
364/*---------------------------------------------------------------------------*/
365/*---------------------------------------------------------------------------*/
366
369{
370 friend class SyclRunQueueStream;
371
372 public:
373
374 void notifyBeginLaunchKernel() override
375 {
376 }
377 void notifyEndLaunchKernel() override
378 {
379 }
380 void barrier() override
381 {
382 // TODO Faire le wait sur la file par défaut n'est pas strictement équivalent
383 // à la barrière en CUDA qui synchronize tout le device.
384 m_default_queue->wait();
385 }
386 eExecutionPolicy executionPolicy() const override
387 {
389 }
390 impl::IRunQueueStream* createStream(const RunQueueBuildInfo& bi) override
391 {
392 return new SyclRunQueueStream(this, bi);
393 }
394 impl::IRunQueueEventImpl* createEventImpl() override
395 {
396 return new SyclRunQueueEvent(false);
397 }
398 impl::IRunQueueEventImpl* createEventImplWithTimer() override
399 {
400 return new SyclRunQueueEvent(true);
401 }
402 void setMemoryAdvice([[maybe_unused]] ConstMemoryView buffer, [[maybe_unused]] eMemoryAdvice advice,
403 [[maybe_unused]] DeviceId device_id) override
404 {
405 }
406 void unsetMemoryAdvice([[maybe_unused]] ConstMemoryView buffer,
407 [[maybe_unused]] eMemoryAdvice advice, [[maybe_unused]] DeviceId device_id) override
408 {
409 }
410
411 void setCurrentDevice([[maybe_unused]] DeviceId device_id) final
412 {
413 ARCANE_SYCL_FUNC_NOT_HANDLED;
414 }
415 const IDeviceInfoList* deviceInfoList() override { return &m_device_info_list; }
416
417 void getPointerAttribute(PointerAttribute& attribute, const void* ptr) override
418 {
419 sycl::usm::alloc sycl_mem_type = sycl::get_pointer_type(ptr, *m_default_context);
420 ePointerMemoryType mem_type = ePointerMemoryType::Unregistered;
421 const void* host_ptr = nullptr;
422 const void* device_ptr = nullptr;
423 if (sycl_mem_type == sycl::usm::alloc::host) {
424 // HostPinned. Doit être accessible depuis le device mais
425 //
426 mem_type = ePointerMemoryType::Host;
427 host_ptr = ptr;
428 // TODO: Regarder comment récupérer la valeur
429 device_ptr = ptr;
430 }
431 else if (sycl_mem_type == sycl::usm::alloc::device) {
432 mem_type = ePointerMemoryType::Device;
433 device_ptr = ptr;
434 }
435 else if (sycl_mem_type == sycl::usm::alloc::shared) {
436 mem_type = ePointerMemoryType::Managed;
437 // TODO: pour l'instant on remplit avec le pointeur car on ne sait
438 // pas comment récupérer l'info.
439 host_ptr = ptr;
440 device_ptr = ptr;
441 }
442 // TODO: à corriger
443 Int32 device_id = 0;
444 _fillPointerAttribute(attribute, mem_type, device_id, ptr, device_ptr, host_ptr);
445 }
446
447 DeviceMemoryInfo getDeviceMemoryInfo([[maybe_unused]] DeviceId device_id) override
448 {
449 return {};
450 }
451
452 void fillDevicesAndSetDefaultQueue(bool is_verbose);
453 sycl::queue& defaultQueue() const { return *m_default_queue; }
454 sycl::device& defaultDevice() const { return *m_default_device; }
455
456 void finalize(ITraceMng*) override
457 {
458 // Supprime la queue globale utilisée pour les allocations.
459 global_default_queue = sycl::queue{};
460 }
461
462 private:
463
464 impl::DeviceInfoList m_device_info_list;
465 std::unique_ptr<sycl::device> m_default_device;
466 std::unique_ptr<sycl::context> m_default_context;
467 std::unique_ptr<sycl::queue> m_default_queue;
468
469 private:
470
471 void _init(sycl::device& device)
472 {
473 m_default_device = std::make_unique<sycl::device>(device);
474 m_default_queue = std::make_unique<sycl::queue>(device);
475 m_default_context = std::make_unique<sycl::context>(device);
476 }
477};
478
479/*---------------------------------------------------------------------------*/
480/*---------------------------------------------------------------------------*/
481
482SyclRunQueueStream::
483SyclRunQueueStream(SyclRunnerRuntime* runtime, const RunQueueBuildInfo& bi)
484: m_runtime(runtime)
485{
486 sycl::device& d = runtime->defaultDevice();
487 // Indique que les commandes lancées sont implicitement exécutées les
488 // unes derrière les autres.
489 auto queue_property = sycl::property::queue::in_order();
490 // Pour le profiling
491 auto profiling_property = sycl::property::queue::enable_profiling();
492 sycl::property_list queue_properties(queue_property, profiling_property);
493
494 // Gestionnaire d'erreur.
495 sycl::async_handler err_handler;
496 err_handler = _getAsyncHandler();
497 if (bi.isDefault())
498 m_sycl_stream = std::make_unique<sycl::queue>(d, err_handler, queue_properties);
499 else {
500 ARCANE_SYCL_FUNC_NOT_HANDLED;
501 m_sycl_stream = std::make_unique<sycl::queue>(d, err_handler, queue_properties);
502 }
503}
504
505/*---------------------------------------------------------------------------*/
506/*---------------------------------------------------------------------------*/
507
508void SyclRunnerRuntime::
509fillDevicesAndSetDefaultQueue(bool is_verbose)
510{
511 if (is_verbose){
512 for (auto platform : sycl::platform::get_platforms()) {
513 std::cout << "Platform: "
514 << platform.get_info<sycl::info::platform::name>()
515 << std::endl;
516 }
517 }
518
519 sycl::device device{ sycl::gpu_selector_v };
520 if (is_verbose)
521 std::cout << "\nDevice: " << device.get_info<sycl::info::device::name>()
522 << "\nVersion=" << device.get_info<sycl::info::device::version>()
523 << std::endl;
524 // Pour l'instant, on prend comme file par défaut la première trouvée
525 // et on ne considère qu'un seul device accessible.
526 _init(device);
527
528 DeviceInfo device_info;
529 device_info.setDescription("No description info");
530 device_info.setDeviceId(DeviceId(0));
531 device_info.setName(device.get_info<sycl::info::device::name>());
532 m_device_info_list.addDevice(device_info);
533}
534
535/*---------------------------------------------------------------------------*/
536/*---------------------------------------------------------------------------*/
537
539: public IMemoryCopier
540{
541 void copy(ConstMemoryView from, eMemoryResource from_mem,
543 const RunQueue* queue) override;
544};
545
546/*---------------------------------------------------------------------------*/
547/*---------------------------------------------------------------------------*/
548
549} // namespace Arcane::Accelerator::Sycl
550
551namespace
552{
554Arcane::Accelerator::Sycl::SyclMemoryCopier global_sycl_memory_copier;
555} // namespace
556
557/*---------------------------------------------------------------------------*/
558/*---------------------------------------------------------------------------*/
559
560namespace Arcane::Accelerator::Sycl
561{
562
563/*---------------------------------------------------------------------------*/
564/*---------------------------------------------------------------------------*/
565
566void SyclMemoryCopier::
567copy(ConstMemoryView from, [[maybe_unused]] eMemoryResource from_mem,
568 MutableMemoryView to, [[maybe_unused]] eMemoryResource to_mem,
569 const RunQueue* queue)
570{
571 if (queue) {
572 queue->copyMemory(MemoryCopyArgs(to.bytes(), from.bytes()).addAsync(queue->isAsync()));
573 return;
574 }
575 sycl::queue& q = global_sycl_runtime.defaultQueue();
576 q.memcpy(to.data(), from.data(), from.bytes().size()).wait();
577}
578
579} // namespace Arcane::Accelerator::Sycl
580
581/*---------------------------------------------------------------------------*/
582/*---------------------------------------------------------------------------*/
583
584// Cette fonction est le point d'entrée utilisé lors du chargement
585// dynamique de cette bibliothèque
586extern "C" ARCCORE_EXPORT void
587arcaneRegisterAcceleratorRuntimesycl(Arcane::Accelerator::RegisterRuntimeInfo& init_info)
588{
589 using namespace Arcane;
590 using namespace Arcane::Accelerator::Sycl;
591 Arcane::Accelerator::impl::setUsingSYCLRuntime(true);
592 Arcane::Accelerator::impl::setSYCLRunQueueRuntime(&global_sycl_runtime);
593 MemoryUtils::setAcceleratorHostMemoryAllocator(&unified_memory_sycl_memory_allocator);
596 mrm->setIsAccelerator(true);
597 mrm->setAllocator(eMemoryResource::UnifiedMemory, &unified_memory_sycl_memory_allocator);
598 mrm->setAllocator(eMemoryResource::HostPinned, &host_pinned_sycl_memory_allocator);
599 mrm->setAllocator(eMemoryResource::Device, &device_sycl_memory_allocator);
600 mrm->setCopier(&global_sycl_memory_copier);
601 global_sycl_runtime.fillDevicesAndSetDefaultQueue(init_info.isVerbose());
602 global_default_queue = global_sycl_runtime.defaultQueue();
603}
604
605/*---------------------------------------------------------------------------*/
606/*---------------------------------------------------------------------------*/
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
Informations pour initialiser le runtime accélérateur.
bool isDefault() const
Indique si l'instance a uniquement les valeurs par défaut.
bool isAsync() const
Indique si la file d'exécution est asynchrone.
Definition RunQueue.cc:320
void copyMemory(const MemoryCopyArgs &args) const
Copie des informations entre deux zones mémoires.
Definition RunQueue.cc:237
eMemoryResource memoryResource() const override
Ressource mémoire fournie par l'allocateur.
eMemoryResource memoryResource() const override
Ressource mémoire fournie par l'allocateur.
bool hasRealloc(MemoryAllocationArgs) const override
Indique si l'allocateur supporte la sémantique de realloc.
AllocatedMemoryInfo reallocate(MemoryAllocationArgs args, AllocatedMemoryInfo current_ptr, Int64 new_size) override
Réalloue de la mémoire pour new_size octets et retourne le pointeur.
AllocatedMemoryInfo allocate(MemoryAllocationArgs args, Int64 new_size) override
void deallocate(MemoryAllocationArgs args, AllocatedMemoryInfo ptr) override
Libère la mémoire dont l'adresse de base est ptr.
void copy(ConstMemoryView from, eMemoryResource from_mem, MutableMemoryView to, eMemoryResource to_mem, const RunQueue *queue) override
Copie les données de from vers to avec la queue queue.
void barrier() override
Bloque jusqu'à ce que toutes les actions associées à cette file soient terminées.
sycl::event lastCommandEvent()
Évènement correspondant à la dernière commande.
void prefetchMemory(const MemoryPrefetchArgs &args) override
Effectue un pré-chargement d'une zone mémoire.
Impl::NativeStream nativeStream() override
Pointeur sur la structure interne dépendante de l'implémentation.
void copyMemory(const MemoryCopyArgs &args) override
Effectue une copie entre deux zones mémoire.
bool _barrierNoException() override
Barrière sans exception. Retourne true en cas d'erreur.
void _setSyclLastCommandEvent(void *sycl_event_ptr) override
Pour SYCL, positionne l'évènement associé à la dernière commande exécutée.
void notifyEndLaunchKernel(impl::RunCommandImpl &) override
Notification de fin de lancement de la commande.
void notifyBeginLaunchKernel(impl::RunCommandImpl &c) override
Notification avant le lancement de la commande.
eMemoryResource memoryResource() const override
Ressource mémoire fournie par l'allocateur.
Interface de l'implémentation d'un évènement.
Interface d'un flux d'exécution pour une RunQueue.
Interface du runtime associé à un accélérateur.
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 sur une zone mémoire contigue contenant des éléments de taille fixe.
constexpr SpanType bytes() const
Vue sous forme d'octets.
constexpr const std::byte * data() const
Pointeur sur la zone mémoire.
Interface pour les copies mémoire avec support des accélérateurs.
Partie interne à Arcane de 'IMemoryRessourceMng'.
virtual void setAllocator(eMemoryResource r, IMemoryAllocator *allocator)=0
Positionne l'allocateur pour la ressource r.
virtual void setIsAccelerator(bool v)=0
Indique si un accélérateur est disponible.
virtual void setCopier(IMemoryCopier *copier)=0
Positionne l'instance gérant les copies.
virtual IMemoryResourceMngInternal * _internal()=0
Interface interne.
Interface du gestionnaire de traces.
Classe contenant des informations pour spécialiser les allocations.
Vue modifiable sur une zone mémoire contigue contenant des éléments de taille fixe.
constexpr std::byte * data() const
Pointeur sur la zone mémoire.
constexpr SpanType bytes() const
Vue sous forme d'octets.
Exception lorsqu'une fonction n'est pas implémentée.
Exception lorsqu'une opération n'est pas supportée.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:325
ePointerMemoryType
Type de mémoire pour un pointeur.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ SYCL
Politique d'exécution utilisant l'environnement SYCL.
ARCCORE_COMMON_EXPORT IMemoryRessourceMng * getDataMemoryResourceMng()
Gestionnaire de ressource mémoire pour les données.
ARCCORE_COMMON_EXPORT IMemoryAllocator * setAcceleratorHostMemoryAllocator(IMemoryAllocator *a)
Positionne l'allocateur spécifique pour les accélérateurs.
ARCCORE_COMMON_EXPORT void setDefaultDataMemoryResource(eMemoryResource mem_resource)
Positionne la ressource mémoire utilisée pour l'allocateur mémoire des données.
Espace de nom pour les fonctions dépendant de la plateforme.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
eMemoryResource
Liste des ressources mémoire disponibles.
@ HostPinned
Alloue sur l'hôte.
@ UnifiedMemory
Alloue en utilisant la mémoire unifiée.
@ Device
Alloue sur le device.
std::int32_t Int32
Type entier signé sur 32 bits.