14#include "arcane/accelerator/hip/HipAccelerator.h"
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/Array.h"
18#include "arcane/utils/TraceInfo.h"
19#include "arcane/utils/FatalErrorException.h"
20#include "arcane/utils/NotImplementedException.h"
21#include "arcane/utils/IMemoryRessourceMng.h"
22#include "arcane/utils/OStringStream.h"
23#include "arcane/utils/internal/IMemoryRessourceMngInternal.h"
25#include "arcane/accelerator/core/RunQueueBuildInfo.h"
26#include "arcane/accelerator/core/Memory.h"
27#include "arcane/accelerator/core/DeviceInfoList.h"
28#include "arcane/accelerator/core/RunQueue.h"
29#include "arcane/accelerator/core/DeviceMemoryInfo.h"
30#include "arcane/accelerator/core/NativeStream.h"
31#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
32#include "arcane/accelerator/core/internal/RegisterRuntimeInfo.h"
33#include "arcane/accelerator/core/internal/IRunQueueStream.h"
34#include "arcane/accelerator/core/internal/IRunQueueEventImpl.h"
35#include "arcane/accelerator/core/internal/RunCommandImpl.h"
39#ifdef ARCANE_HAS_ROCTX
45namespace Arcane::Accelerator::Hip
62 int priority =
bi.priority();
75#ifdef ARCANE_HAS_ROCTX
76 auto kname =
c.kernelName();
82 return m_runtime->notifyBeginLaunchKernel();
86#ifdef ARCANE_HAS_ROCTX
89 return m_runtime->notifyEndLaunchKernel();
101 auto r =
hipMemcpyAsync(args.destination().data(), args.source().data(),
109 auto src = args.source().bytes();
207 void notifyBeginLaunchKernel()
override
209 ++m_nb_kernel_launched;
211 std::cout <<
"BEGIN HIP KERNEL!\n";
213 void notifyEndLaunchKernel()
override
217 std::cout <<
"END HIP KERNEL!\n";
219 void barrier()
override
241 auto v = buffer.bytes();
242 const void*
ptr = v.data();
243 size_t count = v.size();
268 auto v = buffer.bytes();
269 const void*
ptr = v.data();
270 size_t count = v.size();
297 ARCANE_FATAL(
"Device {0} is not an accelerator device",
id);
300 const IDeviceInfoList* deviceInfoList()
override {
return &m_device_info_list; }
306 auto mem_type = ePointerMemoryType::Unregistered;
311#if HIP_VERSION_MAJOR >= 6
317 mem_type = ePointerMemoryType::Managed;
319 mem_type = ePointerMemoryType::Host;
321 mem_type = ePointerMemoryType::Device;
329 ptr, pa.devicePointer, pa.hostPointer);
352#ifdef ARCANE_HAS_ROCTX
356 void popProfilerRange()
override
358#ifdef ARCANE_HAS_ROCTX
365 void fillDevices(
bool is_verbose);
369 Int64 m_nb_kernel_launched = 0;
370 bool m_is_verbose =
false;
377void HipRunnerRuntime::
378fillDevices(
bool is_verbose)
382 std::ostream&
omain = std::cout;
384 omain <<
"ArcaneHIP: Initialize Arcane HIP runtime nb_available_device=" <<
nb_device <<
"\n";
387 std::ostream& o =
ostr.stream();
395 o <<
"\nDevice " << i <<
" name=" <<
dp.name <<
"\n";
396 o <<
" computeCapability = " <<
dp.major <<
"." <<
dp.minor <<
"\n";
397 o <<
" totalGlobalMem = " <<
dp.totalGlobalMem <<
"\n";
398 o <<
" sharedMemPerBlock = " <<
dp.sharedMemPerBlock <<
"\n";
399 o <<
" regsPerBlock = " <<
dp.regsPerBlock <<
"\n";
400 o <<
" warpSize = " <<
dp.warpSize <<
"\n";
401 o <<
" memPitch = " <<
dp.memPitch <<
"\n";
402 o <<
" maxThreadsPerBlock = " <<
dp.maxThreadsPerBlock <<
"\n";
403 o <<
" totalConstMem = " <<
dp.totalConstMem <<
"\n";
404 o <<
" clockRate = " <<
dp.clockRate <<
"\n";
406 o <<
" multiProcessorCount = " <<
dp.multiProcessorCount <<
"\n";
407 o <<
" kernelExecTimeoutEnabled = " <<
dp.kernelExecTimeoutEnabled <<
"\n";
408 o <<
" integrated = " <<
dp.integrated <<
"\n";
409 o <<
" canMapHostMemory = " <<
dp.canMapHostMemory <<
"\n";
410 o <<
" computeMode = " <<
dp.computeMode <<
"\n";
411 o <<
" maxThreadsDim = " <<
dp.maxThreadsDim[0] <<
" " <<
dp.maxThreadsDim[1]
412 <<
" " <<
dp.maxThreadsDim[2] <<
"\n";
413 o <<
" maxGridSize = " <<
dp.maxGridSize[0] <<
" " <<
dp.maxGridSize[1]
414 <<
" " <<
dp.maxGridSize[2] <<
"\n";
415 o <<
" concurrentManagedAccess = " <<
dp.concurrentManagedAccess <<
"\n";
416 o <<
" directManagedMemAccessFromHost = " <<
dp.directManagedMemAccessFromHost <<
"\n";
417 o <<
" gcnArchName = " <<
dp.gcnArchName <<
"\n";
418 o <<
" pageableMemoryAccess = " <<
dp.pageableMemoryAccess <<
"\n";
419 o <<
" pageableMemoryAccessUsesHostPageTables = " <<
dp.pageableMemoryAccessUsesHostPageTables <<
"\n";
421#if HIP_VERSION_MAJOR >= 6
422 o <<
" gpuDirectRDMASupported = " <<
dp.gpuDirectRDMASupported <<
"\n";
423 o <<
" hostNativeAtomicSupported = " <<
dp.hostNativeAtomicSupported <<
"\n";
424 o <<
" unifiedFunctionPointers = " <<
dp.unifiedFunctionPointers <<
"\n";
438 omain << description;
485extern "C" ARCANE_EXPORT
void
489 using namespace Arcane::Accelerator::Hip;
490 Arcane::Accelerator::impl::setUsingHIPRuntime(
true);
492 Arcane::platform::setAcceleratorHostMemoryAllocator(getHipMemoryAllocator());
494 mrm->setIsAccelerator(
true);
495 mrm->setAllocator(eMemoryRessource::UnifiedMemory, getHipUnifiedMemoryAllocator());
496 mrm->setAllocator(eMemoryRessource::HostPinned, getHipHostPinnedMemoryAllocator());
497 mrm->setAllocator(eMemoryRessource::Device, getHipDeviceMemoryAllocator());
#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_FATAL(...)
Macro envoyant une exception FatalErrorException.
Identifiant d'un composant du système.
bool isHost() const
Indique si l'instance est associée à l'hôte.
Int32 asInt32() const
Valeur numérique du device.
Information sur un device.
Information mémoire d'un accélérateur.
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 notifyBeginLaunchKernel(impl::RunCommandImpl &c) override
Notification avant le lancement de la commande.
bool _barrierNoException() override
Barrière sans exception. Retourne true en cas d'erreur.
void barrier() override
Bloque jusqu'à ce que toutes les actions associées à cette file soient terminées.
void notifyEndLaunchKernel(impl::RunCommandImpl &) override
Notification de fin de lancement de la 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.
impl::NativeStream nativeStream() override
Pointeur sur la structure interne dépendante de l'implémentation.
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.
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.
Flot de sortie lié à une String.
Chaîne de caractères unicode.
eMemoryAdvice
Conseils pour la gestion mémoire.
@ AccessedByHost
Indique que la zone mémoire est accédée par l'hôte.
@ PreferredLocationDevice
Privilégié le positionnement de la mémoire sur l'accélérateur.
@ MostlyRead
Indique que la zone mémoire est principalement en lecture seule.
@ PreferredLocationHost
Privilégié le positionnement de la mémoire sur l'hôte.
@ AccessedByDevice
Indique que la zone mémoire est accédée par l'accélérateur.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ HIP
Politique d'exécution utilisant l'environnement HIP.
-*- 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.