14#include "arcane/accelerator/sycl/SyclAccelerator.h"
15#include "arcane/accelerator/sycl/internal/SyclAcceleratorInternal.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/NotSupportedException.h"
19#include "arcane/utils/FatalErrorException.h"
20#include "arcane/utils/IMemoryRessourceMng.h"
21#include "arcane/utils/internal/IMemoryRessourceMngInternal.h"
23#include "arcane/accelerator/core/RunQueueBuildInfo.h"
24#include "arcane/accelerator/core/Memory.h"
25#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
26#include "arcane/accelerator/core/internal/RegisterRuntimeInfo.h"
27#include "arcane/accelerator/core/internal/IRunQueueStream.h"
28#include "arcane/accelerator/core/internal/IRunQueueEventImpl.h"
29#include "arcane/accelerator/core/DeviceInfoList.h"
30#include "arcane/accelerator/core/RunQueue.h"
34namespace Arcane::Accelerator::Sycl
39#define ARCANE_SYCL_FUNC_NOT_HANDLED \
40 std::cout << "WARNING: SYCL: function not handled " << A_FUNCINFO << "\n"
42class SyclRunnerRuntime;
61 return m_runtime->notifyBeginLaunchKernel();
65 return m_runtime->notifyEndLaunchKernel();
69 m_sycl_stream->wait_and_throw();
73 m_sycl_stream->wait();
79 m_sycl_stream->memcpy(args.destination().data(),
source_bytes.data(),
96 return m_sycl_stream.get();
109 static sycl::async_handler _getAsyncHandler()
112 std::ostringstream
ostr;
113 ostr <<
"Error in SYCL runtime\n";
114 for (
const std::exception_ptr& e :
exceptions) {
116 std::rethrow_exception(e);
118 catch (
const sycl::exception& e) {
119 ostr <<
"SYCL exception: " << e.what() <<
"\n";
132 sycl::queue& trueStream()
const
134 return *m_sycl_stream;
140 std::unique_ptr<sycl::queue> m_sycl_stream;
141 sycl::event m_last_command_event;
166 m_sycl_event =
rq->lastCommandEvent();
167#if defined(__ADAPTIVECPP__)
168 m_recorded_stream = stream;
170#elif defined(__INTEL_LLVM_COMPILER)
186#if defined(__ADAPTIVECPP__)
188 m_sycl_event.wait(
rq->trueStream().get_wait_list());
189#elif defined(__INTEL_LLVM_COMPILER)
190 std::vector<sycl::event>
events;
191 events.push_back(m_sycl_event);
193 rq->trueStream().ext_oneapi_submit_barrier(
events);
206 if (
event==sycl::event())
209 bool is_submitted =
event.get_info<sycl::info::event::command_execution_status>() == sycl::info::event_command_status::complete;
212 Int64 start =
event.get_profiling_info<sycl::info::event_profiling::command_start>();
213 Int64 end =
event.get_profiling_info<sycl::info::event_profiling::command_end>();
214 return (end - start);
219 sycl::event m_sycl_event;
233 void notifyBeginLaunchKernel()
override
236 void notifyEndLaunchKernel()
override
239 void barrier()
override
243 m_default_queue->wait();
265 void unsetMemoryAdvice([[
maybe_unused]] ConstMemoryView buffer,
272 ARCANE_SYCL_FUNC_NOT_HANDLED;
274 const IDeviceInfoList* deviceInfoList()
override {
return &m_device_info_list; }
278 sycl::usm::alloc
sycl_mem_type = sycl::get_pointer_type(
ptr, *m_default_context);
285 mem_type = ePointerMemoryType::Host;
291 mem_type = ePointerMemoryType::Device;
295 mem_type = ePointerMemoryType::Managed;
306 void fillDevicesAndSetDefaultQueue(
bool is_verbose);
307 sycl::queue& defaultQueue()
const {
return *m_default_queue; }
308 sycl::device& defaultDevice()
const {
return *m_default_device; }
313 std::unique_ptr<sycl::device> m_default_device;
314 std::unique_ptr<sycl::context> m_default_context;
315 std::unique_ptr<sycl::queue> m_default_queue;
319 void _init(sycl::device& device)
321 m_default_device = std::make_unique<sycl::device>(device);
322 m_default_queue = std::make_unique<sycl::queue>(device);
323 m_default_context = std::make_unique<sycl::context>(device);
334 sycl::device& d = runtime->defaultDevice();
348 ARCANE_SYCL_FUNC_NOT_HANDLED;
356void SyclRunnerRuntime::
357fillDevicesAndSetDefaultQueue(
bool is_verbose)
361 std::cout <<
"Platform: "
362 << platform.get_info<sycl::info::platform::name>()
367 sycl::device device{ sycl::gpu_selector_v };
369 std::cout <<
"\nDevice: " << device.get_info<sycl::info::device::name>()
370 <<
"\nVersion=" << device.get_info<sycl::info::device::version>()
376 DeviceInfo device_info;
377 device_info.setDescription(
"No description info");
378 device_info.setDeviceId(DeviceId(0));
379 device_info.setName(device.get_info<sycl::info::device::name>());
380 m_device_info_list.addDevice(device_info);
408namespace Arcane::Accelerator::Sycl
424 q.memcpy(
to.data(),
from.data(),
from.bytes().size()).wait();
434extern "C" ARCANE_EXPORT
void
438 using namespace Arcane::Accelerator::Sycl;
439 Arcane::Accelerator::impl::setUsingSYCLRuntime(
true);
443 mrm->setIsAccelerator(
true);
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
#define ARCANE_THROW(exception_class,...)
Macro pour envoyer une exception avec formattage.
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Identifiant d'un composant du système.
Interface d'une liste de devices.
Arguments pour la copie mémoire.
Arguments pour le préfetching mémoire.
Informations sur une adresse mémoire.
Informations pour initialiser le runtime accélérateur.
Informations pour créer une RunQueue.
File d'exécution pour un accélérateur.
bool isAsync() const
Indique si la file d'exécution est asynchrone.
void copyMemory(const MemoryCopyArgs &args) const
Copie des informations entre deux zones mémoires.
void copy(ConstMemoryView from, eMemoryRessource from_mem, MutableMemoryView to, eMemoryRessource to_mem, const RunQueue *queue) override
Copie les données de from vers to avec la queue queue.
void * _internalImpl() override
Pointeur sur la structure interne dépendante de l'implémentation.
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.
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.
Interface d'une liste de devices.
Interface de l'implémentation d'un évènement.
Interface d'un flux d'exécution pour une RunQueue.
Interface du runtime associé à une RunQueue.
Implémentation d'une commande pour accélérateur.
Interface pour les copies mémoire avec support des accélérateurs.
Partie interne à Arcane de 'IMemoryRessourceMng'.
virtual IMemoryRessourceMngInternal * _internal()=0
Interface interne.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Exception lorsqu'une opération n'est pas supportée.
eMemoryAdvice
Conseils pour la gestion mémoire.
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.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eMemoryRessource
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.
Espace de nom de Arccore.
std::int64_t Int64
Type entier signé sur 64 bits.
std::int32_t Int32
Type entier signé sur 32 bits.