14#include "arcane/accelerator/cuda/CudaAccelerator.h"
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/Array.h"
18#include "arcane/utils/TraceInfo.h"
19#include "arcane/utils/NotSupportedException.h"
20#include "arcane/utils/FatalErrorException.h"
21#include "arcane/utils/NotImplementedException.h"
22#include "arcane/utils/IMemoryRessourceMng.h"
23#include "arcane/utils/MemoryView.h"
24#include "arcane/utils/OStringStream.h"
25#include "arcane/utils/ValueConvert.h"
26#include "arcane/utils/internal/IMemoryRessourceMngInternal.h"
28#include "arcane/accelerator/core/RunQueueBuildInfo.h"
29#include "arcane/accelerator/core/Memory.h"
30#include "arcane/accelerator/core/DeviceInfoList.h"
32#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
33#include "arcane/accelerator/core/internal/RegisterRuntimeInfo.h"
34#include "arcane/accelerator/core/internal/RunCommandImpl.h"
35#include "arcane/accelerator/core/internal/IRunQueueStream.h"
36#include "arcane/accelerator/core/internal/IRunQueueEventImpl.h"
37#include "arcane/accelerator/core/PointerAttribute.h"
38#include "arcane/accelerator/core/RunQueue.h"
39#include "arcane/accelerator/core/DeviceMemoryInfo.h"
40#include "arcane/accelerator/core/NativeStream.h"
42#include "arcane/accelerator/cuda/runtime/internal/Cupti.h"
48#ifdef ARCANE_HAS_CUDA_NVTOOLSEXT
49#include <nvtx3/nvToolsExt.h>
54namespace Arcane::Accelerator::Cuda
58 Int32 global_cupti_flush = 0;
59 CuptiInfo global_cupti_info;
65void arcaneCheckCudaErrors(
const TraceInfo& ti, CUresult e)
67 if (e == CUDA_SUCCESS)
69 const char* error_name =
nullptr;
70 CUresult e2 = cuGetErrorName(e, &error_name);
71 if (e2 != CUDA_SUCCESS)
72 error_name =
"Unknown";
74 const char* error_message =
nullptr;
75 CUresult e3 = cuGetErrorString(e, &error_message);
76 if (e3 != CUDA_SUCCESS)
77 error_message =
"Unknown";
79 ARCANE_FATAL(
"CUDA Error trace={0} e={1} name={2} message={3}",
80 ti, e, error_name, error_message);
97 int priority =
bi.priority();
110#ifdef ARCANE_HAS_CUDA_NVTOOLSEXT
111 auto kname =
c.kernelName();
117 return m_runtime->notifyBeginLaunchKernel();
121#ifdef ARCANE_HAS_CUDA_NVTOOLSEXT
124 return m_runtime->notifyEndLaunchKernel();
141 ARCANE_CHECK_CUDA(
r);
147 auto src = args.source().bytes();
157 ARCANE_CHECK_CUDA(
r);
170 return m_cuda_stream;
252 void notifyBeginLaunchKernel()
override
254 ++m_nb_kernel_launched;
256 std::cout <<
"BEGIN CUDA KERNEL!\n";
258 void notifyEndLaunchKernel()
override
262 std::cout <<
"END CUDA KERNEL!\n";
264 void barrier()
override
286 auto v = buffer.bytes();
287 const void*
ptr = v.data();
288 size_t count = v.size();
313 auto v = buffer.bytes();
314 const void*
ptr = v.data();
315 size_t count = v.size();
342 ARCANE_FATAL(
"Device {0} is not an accelerator device",
id);
346 const IDeviceInfoList* deviceInfoList()
final {
return &m_device_info_list; }
348 void startProfiling()
override
353 void stopProfiling()
override
358 bool isProfilingActive()
override
371 ptr,
ca.devicePointer,
ca.hostPointer);
394#ifdef ARCANE_HAS_CUDA_NVTOOLSEXT
412 void popProfilerRange()
override
414#ifdef ARCANE_HAS_CUDA_NVTOOLSEXT
421 finalizeCudaMemoryAllocators(
tm);
426 void fillDevices(
bool is_verbose);
430 Int64 m_nb_kernel_launched = 0;
431 bool m_is_verbose =
false;
438void CudaRunnerRuntime::
439fillDevices(
bool is_verbose)
443 std::ostream&
omain = std::cout;
445 omain <<
"ArcaneCUDA: Initialize Arcane CUDA runtime nb_available_device=" <<
nb_device <<
"\n";
450 std::ostream& o =
ostr.stream();
451 o <<
"Device " << i <<
" name=" <<
dp.name <<
"\n";
452 o <<
" computeCapability = " <<
dp.major <<
"." <<
dp.minor <<
"\n";
453 o <<
" totalGlobalMem = " <<
dp.totalGlobalMem <<
"\n";
454 o <<
" sharedMemPerBlock = " <<
dp.sharedMemPerBlock <<
"\n";
455 o <<
" regsPerBlock = " <<
dp.regsPerBlock <<
"\n";
456 o <<
" warpSize = " <<
dp.warpSize <<
"\n";
457 o <<
" memPitch = " <<
dp.memPitch <<
"\n";
458 o <<
" maxThreadsPerBlock = " <<
dp.maxThreadsPerBlock <<
"\n";
459 o <<
" totalConstMem = " <<
dp.totalConstMem <<
"\n";
460 o <<
" clockRate = " <<
dp.clockRate <<
"\n";
461 o <<
" deviceOverlap = " <<
dp.deviceOverlap <<
"\n";
462 o <<
" cooperativeLaunch = " <<
dp.cooperativeLaunch <<
"\n";
463 o <<
" multiProcessorCount = " <<
dp.multiProcessorCount <<
"\n";
464 o <<
" kernelExecTimeoutEnabled = " <<
dp.kernelExecTimeoutEnabled <<
"\n";
465 o <<
" integrated = " <<
dp.integrated <<
"\n";
466 o <<
" canMapHostMemory = " <<
dp.canMapHostMemory <<
"\n";
467 o <<
" computeMode = " <<
dp.computeMode <<
"\n";
468 o <<
" directManagedMemAccessFromHost = " <<
dp.directManagedMemAccessFromHost <<
"\n";
469 o <<
" hostNativeAtomicSupported = " <<
dp.hostNativeAtomicSupported <<
"\n";
470 o <<
" pageableMemoryAccess = " <<
dp.pageableMemoryAccess <<
"\n";
471 o <<
" concurrentManagedAccess = " <<
dp.concurrentManagedAccess <<
"\n";
472 o <<
" pageableMemoryAccessUsesHostPageTables = " <<
dp.pageableMemoryAccessUsesHostPageTables <<
"\n";
473 o <<
" hostNativeAtomicSupported = " <<
dp.hostNativeAtomicSupported <<
"\n";
474 o <<
" maxThreadsDim = " <<
dp.maxThreadsDim[0] <<
" " <<
dp.maxThreadsDim[1]
475 <<
" " <<
dp.maxThreadsDim[2] <<
"\n";
476 o <<
" maxGridSize = " <<
dp.maxGridSize[0] <<
" " <<
dp.maxGridSize[1]
477 <<
" " <<
dp.maxGridSize[2] <<
"\n";
495 omain << description;
504 Int32 global_cupti_level = 0;
507 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_CUPTI_LEVEL",
true))
508 global_cupti_level = v.value();
509 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_CUPTI_FLUSH",
true))
510 global_cupti_flush = v.value();
511 bool do_print_cupti =
true;
512 if (
auto v = Convert::Type<Int32>::tryParseFromEnvironment(
"ARCANE_CUPTI_PRINT",
true))
513 do_print_cupti = (v.value() != 0);
515 if (global_cupti_level > 0) {
516#ifndef ARCANE_HAS_CUDA_CUPTI
517 ARCANE_FATAL(
"Trying to enable CUPTI but Arcane is not compiled with cupti support");
519 global_cupti_info.init(global_cupti_level, do_print_cupti);
520 global_cupti_info.start();
561extern "C" ARCANE_EXPORT
void
565 using namespace Arcane::Accelerator::Cuda;
566 Arcane::Accelerator::impl::setUsingCUDARuntime(
true);
568 initializeCudaMemoryAllocators();
569 Arcane::platform::setAcceleratorHostMemoryAllocator(getCudaMemoryAllocator());
571 mrm->setIsAccelerator(
true);
572 mrm->setAllocator(eMemoryRessource::UnifiedMemory, getCudaUnifiedMemoryAllocator());
573 mrm->setAllocator(eMemoryRessource::HostPinned, getCudaHostPinnedMemoryAllocator());
574 mrm->setAllocator(eMemoryRessource::Device, getCudaDeviceMemoryAllocator());
#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.
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.
void barrier() override
Bloque jusqu'à ce que toutes les actions associées à cette file soient terminées.
bool _barrierNoException() override
Barrière sans exception. Retourne true en cas d'erreur.
void prefetchMemory(const MemoryPrefetchArgs &args) override
Effectue un pré-chargement d'une zone mémoire.
void notifyEndLaunchKernel(impl::RunCommandImpl &) override
Notification de fin de lancement de la commande.
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.
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.
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.
Interface du gestionnaire de traces.
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.
ePointerMemoryType
Type de mémoire pour un pointeur.
eExecutionPolicy
Politique d'exécution pour un Runner.
@ CUDA
Politique d'exécution utilisant l'environnement CUDA.
-*- 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.