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/DeviceInfoList.h"
26#include "arcane/accelerator/core/RunQueue.h"
27#include "arcane/accelerator/core/DeviceMemoryInfo.h"
28#include "arcane/accelerator/core/NativeStream.h"
29#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
30#include "arcane/accelerator/core/internal/RegisterRuntimeInfo.h"
31#include "arcane/accelerator/core/internal/IRunQueueStream.h"
32#include "arcane/accelerator/core/internal/IRunQueueEventImpl.h"
36namespace Arcane::Accelerator::Sycl
41#define ARCANE_SYCL_FUNC_NOT_HANDLED \
42 std::cout << "WARNING: SYCL: function not handled " << A_FUNCINFO << "\n"
44class SyclRunnerRuntime;
63 return m_runtime->notifyBeginLaunchKernel();
67 return m_runtime->notifyEndLaunchKernel();
71 m_sycl_stream->wait_and_throw();
75 m_sycl_stream->wait();
81 m_sycl_stream->memcpy(args.destination().data(),
source_bytes.data(),
111 static sycl::async_handler _getAsyncHandler()
114 std::ostringstream
ostr;
115 ostr <<
"Error in SYCL runtime\n";
116 for (
const std::exception_ptr& e :
exceptions) {
118 std::rethrow_exception(e);
120 catch (
const sycl::exception& e) {
121 ostr <<
"SYCL exception: " << e.what() <<
"\n";
134 sycl::queue& trueStream()
const
136 return *m_sycl_stream;
142 std::unique_ptr<sycl::queue> m_sycl_stream;
143 sycl::event m_last_command_event;
168 m_sycl_event =
rq->lastCommandEvent();
169#if defined(__ADAPTIVECPP__)
170 m_recorded_stream = stream;
172#elif defined(__INTEL_LLVM_COMPILER)
188#if defined(__ADAPTIVECPP__)
190 m_sycl_event.wait(
rq->trueStream().get_wait_list());
191#elif defined(__INTEL_LLVM_COMPILER)
192 std::vector<sycl::event>
events;
193 events.push_back(m_sycl_event);
195 rq->trueStream().ext_oneapi_submit_barrier(
events);
208 if (
event==sycl::event())
211 bool is_submitted =
event.get_info<sycl::info::event::command_execution_status>() == sycl::info::event_command_status::complete;
214 Int64 start =
event.get_profiling_info<sycl::info::event_profiling::command_start>();
215 Int64 end =
event.get_profiling_info<sycl::info::event_profiling::command_end>();
216 return (end - start);
221 sycl::event m_sycl_event;
235 void notifyBeginLaunchKernel()
override
238 void notifyEndLaunchKernel()
override
241 void barrier()
override
245 m_default_queue->wait();
267 void unsetMemoryAdvice([[
maybe_unused]] ConstMemoryView buffer,
274 ARCANE_SYCL_FUNC_NOT_HANDLED;
276 const IDeviceInfoList* deviceInfoList()
override {
return &m_device_info_list; }
280 sycl::usm::alloc
sycl_mem_type = sycl::get_pointer_type(
ptr, *m_default_context);
287 mem_type = ePointerMemoryType::Host;
293 mem_type = ePointerMemoryType::Device;
297 mem_type = ePointerMemoryType::Managed;
313 void fillDevicesAndSetDefaultQueue(
bool is_verbose);
314 sycl::queue& defaultQueue()
const {
return *m_default_queue; }
315 sycl::device& defaultDevice()
const {
return *m_default_device; }
320 std::unique_ptr<sycl::device> m_default_device;
321 std::unique_ptr<sycl::context> m_default_context;
322 std::unique_ptr<sycl::queue> m_default_queue;
326 void _init(sycl::device& device)
328 m_default_device = std::make_unique<sycl::device>(device);
329 m_default_queue = std::make_unique<sycl::queue>(device);
330 m_default_context = std::make_unique<sycl::context>(device);
341 sycl::device& d = runtime->defaultDevice();
355 ARCANE_SYCL_FUNC_NOT_HANDLED;
363void SyclRunnerRuntime::
364fillDevicesAndSetDefaultQueue(
bool is_verbose)
368 std::cout <<
"Platform: "
369 << platform.get_info<sycl::info::platform::name>()
374 sycl::device device{ sycl::gpu_selector_v };
376 std::cout <<
"\nDevice: " << device.get_info<sycl::info::device::name>()
377 <<
"\nVersion=" << device.get_info<sycl::info::device::version>()
383 DeviceInfo device_info;
384 device_info.setDescription(
"No description info");
385 device_info.setDeviceId(DeviceId(0));
386 device_info.setName(device.get_info<sycl::info::device::name>());
387 m_device_info_list.addDevice(device_info);
415namespace Arcane::Accelerator::Sycl
431 q.memcpy(
to.data(),
from.data(),
from.bytes().size()).wait();
441extern "C" ARCANE_EXPORT
void
445 using namespace Arcane::Accelerator::Sycl;
446 Arcane::Accelerator::impl::setUsingSYCLRuntime(
true);
448 Arcane::platform::setAcceleratorHostMemoryAllocator(getSyclMemoryAllocator());
450 mrm->setIsAccelerator(
true);
451 mrm->setAllocator(eMemoryRessource::UnifiedMemory, getSyclUnifiedMemoryAllocator());
452 mrm->setAllocator(eMemoryRessource::HostPinned, getSyclHostPinnedMemoryAllocator());
453 mrm->setAllocator(eMemoryRessource::Device, getSyclDeviceMemoryAllocator());
#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.
Information mémoire d'un accélérateur.
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.
impl::NativeStream nativeStream() 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é à un accélérateur.
Type opaque pour encapsuler une 'stream' native.
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'.
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 -*-
Espace de nom de Arccore.
std::int64_t Int64
Type entier signé sur 64 bits.
eMemoryResource
Liste des ressources mémoire disponibles.
std::int32_t Int32
Type entier signé sur 32 bits.