Arcane  v4.1.4.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-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/* SyclAcceleratorRuntime.cc (C) 2000-2026 */
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{
40using Arcane::Accelerator::Impl::KernelLaunchArgs;
41
42#define ARCCORE_SYCL_FUNC_NOT_HANDLED \
43 std::cout << "WARNING: SYCL: function not handled " << A_FUNCINFO << "\n"
44
46
47/*---------------------------------------------------------------------------*/
48/*---------------------------------------------------------------------------*/
49
50// Cette file est utilisée pour les allocations.
51// Elle doit donc toujours exister car on ne sait pas quand aura lieu
52// la dernière désallocation.
53sycl::queue global_default_queue;
54namespace
55{
56 sycl::queue& _defaultQueue()
57 {
58 return global_default_queue;
59 }
60} // namespace
61
62/*---------------------------------------------------------------------------*/
63/*---------------------------------------------------------------------------*/
67class SyclMemoryAllocatorBase
68: public AlignedMemoryAllocator
69{
70 public:
71
72 SyclMemoryAllocatorBase()
73 : AlignedMemoryAllocator(128)
74 {}
75
76 bool hasRealloc(MemoryAllocationArgs) const override { return true; }
78 {
79 sycl::queue& q = _defaultQueue();
80 void* out = nullptr;
81 _allocate(&out, new_size, args, q);
82 if (!out)
83 ARCCORE_FATAL("Can not allocate memory size={0}", new_size);
84 Int64 a = reinterpret_cast<Int64>(out);
85 if ((a % 128) != 0)
86 ARCCORE_FATAL("Bad alignment for SYCL allocator: offset={0}", (a % 128));
87 return { out, new_size };
88 }
90 {
91 sycl::queue& q = _defaultQueue();
92 AllocatedMemoryInfo a = allocate(args, new_size);
93 q.submit([&](sycl::handler& cgh) {
94 cgh.memcpy(a.baseAddress(), current_ptr.baseAddress(), current_ptr.size());
95 });
96 q.wait();
97
98 deallocate(args, current_ptr);
99 return a;
100 }
102 {
103 sycl::queue& q = _defaultQueue();
104 _deallocate(ptr.baseAddress(), args, q);
105 }
106
107 protected:
108
109 virtual void _allocate(void** ptr, size_t new_size, MemoryAllocationArgs, sycl::queue& q) = 0;
110 virtual void _deallocate(void* ptr, MemoryAllocationArgs, sycl::queue& q) = 0;
111};
112
113/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115
117: public SyclMemoryAllocatorBase
118{
119 protected:
120
121 void _allocate(void** ptr, size_t new_size, MemoryAllocationArgs, sycl::queue& q) override
122 {
123 *ptr = sycl::malloc_shared(new_size, q);
124 }
125 void _deallocate(void* ptr, MemoryAllocationArgs, sycl::queue& q) override
126 {
127 sycl::free(ptr, q);
128 }
130};
131
132/*---------------------------------------------------------------------------*/
133/*---------------------------------------------------------------------------*/
134
136: public SyclMemoryAllocatorBase
137{
138 protected:
139
140 void _allocate(void** ptr, size_t new_size, MemoryAllocationArgs, sycl::queue& q) override
141 {
142 // TODO: Faire host-pinned
143 *ptr = sycl::malloc_host(new_size, q);
144 }
145 void _deallocate(void* ptr, MemoryAllocationArgs, sycl::queue& q) override
146 {
147 sycl::free(ptr, q);
148 }
150};
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
154
156: public SyclMemoryAllocatorBase
157{
158 protected:
159
160 void _allocate(void** ptr, size_t new_size, MemoryAllocationArgs, sycl::queue& q) override
161 {
162 *ptr = sycl::malloc_device(new_size, q);
163 }
164 void _deallocate(void* ptr, MemoryAllocationArgs, sycl::queue& q) override
165 {
166 sycl::free(ptr, q);
167 }
169};
170
171/*---------------------------------------------------------------------------*/
172/*---------------------------------------------------------------------------*/
173
174namespace
175{
176 UnifiedMemorySyclMemoryAllocator unified_memory_sycl_memory_allocator;
177 HostPinnedSyclMemoryAllocator host_pinned_sycl_memory_allocator;
178 DeviceSyclMemoryAllocator device_sycl_memory_allocator;
179} // namespace
180
181/*---------------------------------------------------------------------------*/
182/*---------------------------------------------------------------------------*/
183
184class SyclRunQueueStream
186{
187 public:
188
189 SyclRunQueueStream(SyclRunnerRuntime* runtime, const RunQueueBuildInfo& bi);
190 ~SyclRunQueueStream() override
191 {
192 }
193
194 public:
195
196 void notifyBeginLaunchKernel([[maybe_unused]] Impl::RunCommandImpl& c) override
197 {
198 return m_runtime->notifyBeginLaunchKernel();
199 }
201 {
202 return m_runtime->notifyEndLaunchKernel();
203 }
204 void barrier() override
205 {
206 m_sycl_stream->wait_and_throw();
207 }
208 bool _barrierNoException() override
209 {
210 m_sycl_stream->wait();
211 return false;
212 }
213 void copyMemory(const MemoryCopyArgs& args) override
214 {
215 auto source_bytes = args.source().bytes();
216 m_sycl_stream->memcpy(args.destination().data(), source_bytes.data(),
217 source_bytes.size());
218 if (!args.isAsync())
219 this->barrier();
220 }
221 void prefetchMemory([[maybe_unused]] const MemoryPrefetchArgs& args) override
222 {
223 auto source_bytes = args.source().bytes();
224 Int64 nb_byte = source_bytes.size();
225 if (nb_byte == 0)
226 return;
227 m_sycl_stream->prefetch(source_bytes.data(), nb_byte);
228 if (!args.isAsync())
229 this->barrier();
230 }
232 {
233 return Impl::NativeStream(m_sycl_stream.get());
234 }
235
236 void _setSyclLastCommandEvent([[maybe_unused]] void* sycl_event_ptr) override
237 {
238 sycl::event last_event;
239 if (sycl_event_ptr)
240 last_event = *(reinterpret_cast<sycl::event*>(sycl_event_ptr));
241 m_last_command_event = last_event;
242 }
243
244 public:
245
246 static sycl::async_handler _getAsyncHandler()
247 {
248 auto err_handler = [](const sycl::exception_list& exceptions) {
249 std::ostringstream ostr;
250 ostr << "Error in SYCL runtime\n";
251 for (const std::exception_ptr& e : exceptions) {
252 try {
253 std::rethrow_exception(e);
254 }
255 catch (const sycl::exception& e) {
256 ostr << "SYCL exception: " << e.what() << "\n";
257 }
258 }
259 ARCCORE_FATAL(ostr.str());
260 };
261 return err_handler;
262 }
263
265 sycl::event lastCommandEvent() { return m_last_command_event; }
266
267 public:
268
269 sycl::queue& trueStream() const
270 {
271 return *m_sycl_stream;
272 }
273
274 private:
275
276 Impl::IRunnerRuntime* m_runtime;
277 std::unique_ptr<sycl::queue> m_sycl_stream;
278 sycl::event m_last_command_event;
279};
280
281/*---------------------------------------------------------------------------*/
282/*---------------------------------------------------------------------------*/
283
284class SyclRunQueueEvent
286{
287 public:
288
289 explicit SyclRunQueueEvent([[maybe_unused]] bool has_timer)
290 {
291 }
292 ~SyclRunQueueEvent() override
293 {
294 }
295
296 public:
297
298 // Enregistre l'événement au sein d'une RunQueue
299 void recordQueue([[maybe_unused]] Impl::IRunQueueStream* stream) final
300 {
301 ARCCORE_CHECK_POINTER(stream);
302 auto* rq = static_cast<SyclRunQueueStream*>(stream);
303 m_sycl_event = rq->lastCommandEvent();
304#if defined(__ADAPTIVECPP__)
305 m_recorded_stream = stream;
306 // TODO: Vérifier s'il faut faire quelque chose
307#elif defined(__INTEL_LLVM_COMPILER)
308 //m_sycl_event = rq->trueStream().ext_oneapi_submit_barrier();
309#else
310 ARCCORE_THROW(NotSupportedException, "Only supported for AdaptiveCpp and Intel DPC++ implementation");
311#endif
312 }
313
314 void wait() final
315 {
316 //ARCCORE_SYCL_FUNC_NOT_HANDLED;
317 // TODO: Vérifier ce que cela signifie exactement
318 m_sycl_event.wait();
319 }
320
321 void waitForEvent([[maybe_unused]] Impl::IRunQueueStream* stream) final
322 {
323#if defined(__ADAPTIVECPP__)
324 auto* rq = static_cast<SyclRunQueueStream*>(stream);
325 m_sycl_event.wait(rq->trueStream().get_wait_list());
326#elif defined(__INTEL_LLVM_COMPILER)
327 std::vector<sycl::event> events;
328 events.push_back(m_sycl_event);
329 auto* rq = static_cast<SyclRunQueueStream*>(stream);
330 rq->trueStream().ext_oneapi_submit_barrier(events);
331#else
332 ARCCORE_THROW(NotSupportedException, "Only supported for AdaptiveCpp and Intel DPC++ implementation");
333#endif
334 }
335
336 Int64 elapsedTime([[maybe_unused]] IRunQueueEventImpl* start_event) final
337 {
338 ARCCORE_CHECK_POINTER(start_event);
339 // Il faut prendre l'évènement de début car on est certain qu'il contient
340 // la bonne valeur de 'sycl::event'.
341 sycl::event event = (static_cast<SyclRunQueueEvent*>(start_event))->m_sycl_event;
342 // Si pas d'évènement associé, on ne fait rien pour éviter une exception
343 if (event == sycl::event())
344 return 0;
345
346 bool is_submitted = event.get_info<sycl::info::event::command_execution_status>() == sycl::info::event_command_status::complete;
347 if (!is_submitted)
348 return 0;
349 Int64 start = event.get_profiling_info<sycl::info::event_profiling::command_start>();
350 Int64 end = event.get_profiling_info<sycl::info::event_profiling::command_end>();
351 return (end - start);
352 }
353
354 bool hasPendingWork() final
355 {
356 ARCCORE_THROW(NotImplementedException, "hasPendingWork()");
357 }
358
359 private:
360
361 sycl::event m_sycl_event;
362 Impl::IRunQueueStream* m_recorded_stream = nullptr;
363};
364
365/*---------------------------------------------------------------------------*/
366/*---------------------------------------------------------------------------*/
367
370{
371 friend class SyclRunQueueStream;
372
373 public:
374
375 void notifyBeginLaunchKernel() override
376 {
377 }
378 void notifyEndLaunchKernel() override
379 {
380 }
381 void barrier() override
382 {
383 // TODO Faire le wait sur la file par défaut n'est pas strictement équivalent
384 // à la barrière en CUDA qui synchronize tout le device.
385 m_default_queue->wait();
386 }
387 eExecutionPolicy executionPolicy() const override
388 {
390 }
391 Impl::IRunQueueStream* createStream(const RunQueueBuildInfo& bi) override
392 {
393 return new SyclRunQueueStream(this, bi);
394 }
395 Impl::IRunQueueEventImpl* createEventImpl() override
396 {
397 return new SyclRunQueueEvent(false);
398 }
399 Impl::IRunQueueEventImpl* createEventImplWithTimer() override
400 {
401 return new SyclRunQueueEvent(true);
402 }
403 void setMemoryAdvice([[maybe_unused]] ConstMemoryView buffer, [[maybe_unused]] eMemoryAdvice advice,
404 [[maybe_unused]] DeviceId device_id) override
405 {
406 }
407 void unsetMemoryAdvice([[maybe_unused]] ConstMemoryView buffer,
408 [[maybe_unused]] eMemoryAdvice advice, [[maybe_unused]] DeviceId device_id) override
409 {
410 }
411
412 void setCurrentDevice([[maybe_unused]] DeviceId device_id) final
413 {
414 ARCCORE_SYCL_FUNC_NOT_HANDLED;
415 }
416 const IDeviceInfoList* deviceInfoList() override { return &m_device_info_list; }
417
418 void getPointerAttribute(PointerAttribute& attribute, const void* ptr) override
419 {
420 sycl::usm::alloc sycl_mem_type = sycl::get_pointer_type(ptr, *m_default_context);
421 ePointerMemoryType mem_type = ePointerMemoryType::Unregistered;
422 const void* host_ptr = nullptr;
423 const void* device_ptr = nullptr;
424 if (sycl_mem_type == sycl::usm::alloc::host) {
425 // HostPinned. Doit être accessible depuis le device mais
426 //
427 mem_type = ePointerMemoryType::Host;
428 host_ptr = ptr;
429 // TODO: Regarder comment récupérer la valeur
430 device_ptr = ptr;
431 }
432 else if (sycl_mem_type == sycl::usm::alloc::device) {
433 mem_type = ePointerMemoryType::Device;
434 device_ptr = ptr;
435 }
436 else if (sycl_mem_type == sycl::usm::alloc::shared) {
437 mem_type = ePointerMemoryType::Managed;
438 // TODO: pour l'instant on remplit avec le pointeur car on ne sait
439 // pas comment récupérer l'info.
440 host_ptr = ptr;
441 device_ptr = ptr;
442 }
443 // TODO: à corriger
444 Int32 device_id = 0;
445 _fillPointerAttribute(attribute, mem_type, device_id, ptr, device_ptr, host_ptr);
446 }
447
448 DeviceMemoryInfo getDeviceMemoryInfo([[maybe_unused]] DeviceId device_id) override
449 {
450 return {};
451 }
452
453 KernelLaunchArgs computeKernalLaunchArgs(const KernelLaunchArgs& orig_args,
454 const void* kernel_ptr,
455 Int64 total_loop_size) override
456 {
457 Int32 shared_memory = orig_args.sharedMemorySize();
458 if (orig_args.isCooperative()) {
459 // En mode coopératif, s'assure qu'on ne lance pas plus de blocs
460 // que le maximum qui peut résider sur le GPU.
461 // Int32 nb_thread = orig_args.nbThreadPerBlock();
462 Int32 nb_block = orig_args.nbBlockPerGrid();
463 // Avec Sycl, il n'y a pas de moyen de récupérer le nombre maximal
464 // de blocs actifs pour une fonction donnée et du nombre de threads.
465 // On suppose qu'on peut prendre au maximum 4 blocks par SM.
466 int nb_block_per_sm = 4;
467 int max_block = nb_block_per_sm * m_multi_processor_count;
468 if (nb_block > max_block) {
469 KernelLaunchArgs modified_args(orig_args);
470 modified_args.setNbBlockPerGrid(max_block);
471 return modified_args;
472 }
473 }
474 return orig_args;
475 }
476
477 void fillDevicesAndSetDefaultQueue(bool is_verbose);
478 sycl::queue& defaultQueue() const { return *m_default_queue; }
479 sycl::device& defaultDevice() const { return *m_default_device; }
480
481 void finalize(ITraceMng*) override
482 {
483 // Supprime la queue globale utilisée pour les allocations.
484 global_default_queue = sycl::queue{};
485 }
486
487 private:
488
489 Impl::DeviceInfoList m_device_info_list;
490 std::unique_ptr<sycl::device> m_default_device;
491 std::unique_ptr<sycl::context> m_default_context;
492 std::unique_ptr<sycl::queue> m_default_queue;
493 int m_multi_processor_count = 0;
494
495 private:
496
497 void _init(sycl::device& device)
498 {
499 m_default_device = std::make_unique<sycl::device>(device);
500 m_default_queue = std::make_unique<sycl::queue>(device);
501 m_default_context = std::make_unique<sycl::context>(device);
502 }
503};
504
505/*---------------------------------------------------------------------------*/
506/*---------------------------------------------------------------------------*/
507
508SyclRunQueueStream::
509SyclRunQueueStream(SyclRunnerRuntime* runtime, const RunQueueBuildInfo& bi)
510: m_runtime(runtime)
511{
512 sycl::device& d = runtime->defaultDevice();
513 // Indique que les commandes lancées sont implicitement exécutées les
514 // unes derrière les autres.
515 auto queue_property = sycl::property::queue::in_order();
516 // Pour le profiling
517 auto profiling_property = sycl::property::queue::enable_profiling();
518 sycl::property_list queue_properties(queue_property, profiling_property);
519
520 // Gestionnaire d'erreur.
521 sycl::async_handler err_handler;
522 err_handler = _getAsyncHandler();
523 if (bi.isDefault())
524 m_sycl_stream = std::make_unique<sycl::queue>(d, err_handler, queue_properties);
525 else {
526 ARCCORE_SYCL_FUNC_NOT_HANDLED;
527 m_sycl_stream = std::make_unique<sycl::queue>(d, err_handler, queue_properties);
528 }
529}
530
531/*---------------------------------------------------------------------------*/
532/*---------------------------------------------------------------------------*/
533
534void SyclRunnerRuntime::
535fillDevicesAndSetDefaultQueue(bool is_verbose)
536{
537 if (is_verbose) {
538 for (auto platform : sycl::platform::get_platforms()) {
539 std::cout << "Platform: "
540 << platform.get_info<sycl::info::platform::name>()
541 << std::endl;
542 }
543 }
544
545 sycl::device device{ sycl::gpu_selector_v };
546 if (is_verbose)
547 std::cout << "\nDevice: " << device.get_info<sycl::info::device::name>()
548 << "\nVersion=" << device.get_info<sycl::info::device::version>()
549 << "\nDriverVersion=" << device.get_info<sycl::info::device::driver_version>()
550 << "\nMaxComputeUnits=" << device.get_info<sycl::info::device::max_compute_units>()
551 << "\nMaxWorkGroupSize=" << device.get_info<sycl::info::device::max_work_group_size>()
552 << "\nLocalMemSize=" << device.get_info<sycl::info::device::local_mem_size>()
553 << "\nGlobalMemSize=" << device.get_info<sycl::info::device::global_mem_size>()
554 << "\nMaxMemAllocSize=" << device.get_info<sycl::info::device::max_mem_alloc_size>()
555 << "\n";
556 m_multi_processor_count = device.get_info<sycl::info::device::max_compute_units>();
557 // Pour l'instant, on prend comme file par défaut la première trouvée
558 // et on ne considère qu'un seul device accessible.
559 _init(device);
560
561 DeviceInfo device_info;
562 device_info.setDescription("No description info");
563 device_info.setDeviceId(DeviceId(0));
564 device_info.setName(device.get_info<sycl::info::device::name>());
565 m_device_info_list.addDevice(device_info);
566}
567
568/*---------------------------------------------------------------------------*/
569/*---------------------------------------------------------------------------*/
570
572: public IMemoryCopier
573{
574 void copy(ConstMemoryView from, eMemoryResource from_mem,
576 const RunQueue* queue) override;
577};
578
579/*---------------------------------------------------------------------------*/
580/*---------------------------------------------------------------------------*/
581
582} // namespace Arcane::Accelerator::Sycl
583
584namespace
585{
587Arcane::Accelerator::Sycl::SyclMemoryCopier global_sycl_memory_copier;
588} // namespace
589
590/*---------------------------------------------------------------------------*/
591/*---------------------------------------------------------------------------*/
592
593namespace Arcane::Accelerator::Sycl
594{
595
596/*---------------------------------------------------------------------------*/
597/*---------------------------------------------------------------------------*/
598
599void SyclMemoryCopier::
600copy(ConstMemoryView from, [[maybe_unused]] eMemoryResource from_mem,
601 MutableMemoryView to, [[maybe_unused]] eMemoryResource to_mem,
602 const RunQueue* queue)
603{
604 if (queue) {
605 queue->copyMemory(MemoryCopyArgs(to.bytes(), from.bytes()).addAsync(queue->isAsync()));
606 return;
607 }
608 sycl::queue& q = global_sycl_runtime.defaultQueue();
609 q.memcpy(to.data(), from.data(), from.bytes().size()).wait();
610}
611
612} // namespace Arcane::Accelerator::Sycl
613
614/*---------------------------------------------------------------------------*/
615/*---------------------------------------------------------------------------*/
616
617// Cette fonction est le point d'entrée utilisé lors du chargement
618// dynamique de cette bibliothèque
619extern "C" ARCCORE_EXPORT void
620arcaneRegisterAcceleratorRuntimesycl(Arcane::Accelerator::RegisterRuntimeInfo& init_info)
621{
622 using namespace Arcane;
623 using namespace Arcane::Accelerator::Sycl;
624 Arcane::Accelerator::Impl::setUsingSYCLRuntime(true);
625 Arcane::Accelerator::Impl::setSYCLRunQueueRuntime(&global_sycl_runtime);
626 MemoryUtils::setAcceleratorHostMemoryAllocator(&unified_memory_sycl_memory_allocator);
629 mrm->setIsAccelerator(true);
630 mrm->setAllocator(eMemoryResource::UnifiedMemory, &unified_memory_sycl_memory_allocator);
631 mrm->setAllocator(eMemoryResource::HostPinned, &host_pinned_sycl_memory_allocator);
632 mrm->setAllocator(eMemoryResource::Device, &device_sycl_memory_allocator);
633 mrm->setCopier(&global_sycl_memory_copier);
634 global_sycl_runtime.fillDevicesAndSetDefaultQueue(init_info.isVerbose());
635 global_default_queue = global_sycl_runtime.defaultQueue();
636}
637
638/*---------------------------------------------------------------------------*/
639/*---------------------------------------------------------------------------*/
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
#define ARCCORE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCCORE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
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.
bool isCooperative() const
Indique si on lance en mode coopératif (i.e. cudaLaunchCooperativeKernel)
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 notifyBeginLaunchKernel(Impl::RunCommandImpl &c) override
Notification avant le lancement de la commande.
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.
eMemoryResource memoryResource() const override
Ressource mémoire fournie par l'allocateur.
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.