Arcane  v4.1.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
RunQueueRuntime.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 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/* RunQueueRuntime.cc (C) 2000-2025 */
9/* */
10/* Implémentation d'un RunQueue pour une cible donnée. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/base/NotImplementedException.h"
15#include "arccore/base/MemoryView.h"
16#include "arccore/base/PlatformUtils.h"
17#include "arccore/base/FatalErrorException.h"
18
19#include "arccore/common/MemoryUtils.h"
20
21#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
22#include "arcane/accelerator/core/internal/IRunQueueStream.h"
23#include "arcane/accelerator/core/internal/IRunQueueEventImpl.h"
24#include "arcane/accelerator/core/Memory.h"
25#include "arcane/accelerator/core/DeviceInfoList.h"
26#include "arcane/accelerator/core/DeviceMemoryInfo.h"
27#include "arcane/accelerator/core/NativeStream.h"
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
31
32namespace Arcane::Accelerator::impl
33{
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
38class ARCANE_ACCELERATOR_CORE_EXPORT HostRunQueueStream
39: public IRunQueueStream
40{
41 public:
42
43 HostRunQueueStream(IRunnerRuntime* runtime)
44 : m_runtime(runtime)
45 {}
46
47 public:
48
49 void notifyBeginLaunchKernel(RunCommandImpl&) override { return m_runtime->notifyBeginLaunchKernel(); }
50 void notifyEndLaunchKernel(RunCommandImpl&) override { return m_runtime->notifyEndLaunchKernel(); }
51 void barrier() override { return m_runtime->barrier(); }
52 void copyMemory(const MemoryCopyArgs& args) override
53 {
54 MemoryUtils::copyHost(args.destination(), args.source());
55 }
56 void prefetchMemory(const MemoryPrefetchArgs&) override {}
57 NativeStream nativeStream() override { return {}; }
58 bool _barrierNoException() override { return false; }
59
60 private:
61
62 IRunnerRuntime* m_runtime;
63};
64
65/*---------------------------------------------------------------------------*/
66/*---------------------------------------------------------------------------*/
67
68class ARCANE_ACCELERATOR_CORE_EXPORT HostRunQueueEvent
69: public IRunQueueEventImpl
70{
71 public:
72
73 explicit HostRunQueueEvent(bool has_timer)
74 : m_has_timer(has_timer)
75 {}
76
77 public:
78
79 void recordQueue(IRunQueueStream*) final
80 {
81 if (m_has_timer)
82 m_recorded_time = platform::getRealTime();
83 }
84 void wait() final {}
85 void waitForEvent(IRunQueueStream*) final {}
86 bool hasPendingWork() final { return false; }
88 {
89 ARCANE_CHECK_POINTER(start_event);
90 auto* true_start_event = static_cast<HostRunQueueEvent*>(start_event);
91 if (!m_has_timer || !true_start_event->m_has_timer)
92 ARCANE_FATAL("Event has no timer support");
93 double diff_time = m_recorded_time - true_start_event->m_recorded_time;
94 Int64 diff_as_int64 = static_cast<Int64>(diff_time * 1.0e9);
95 return diff_as_int64;
96 }
97
98 private:
99
100 bool m_has_timer = false;
101 double m_recorded_time = 0.0;
102};
103
104/*---------------------------------------------------------------------------*/
105/*---------------------------------------------------------------------------*/
106
107class ARCANE_ACCELERATOR_CORE_EXPORT CommonRunnerRuntime
108: public IRunnerRuntime
109{
110 public:
111
112 CommonRunnerRuntime()
113 {
114 DeviceInfo d;
115 d.setDeviceId(DeviceId());
116 d.setName("HostDevice");
117 m_device_info_list.addDevice(d);
118 }
119
120 public:
121
122 void notifyBeginLaunchKernel() final {}
123 void notifyEndLaunchKernel() final {}
124 void barrier() final {}
125 IRunQueueStream* createStream(const RunQueueBuildInfo&) final { return new HostRunQueueStream(this); }
126 IRunQueueEventImpl* createEventImpl() final { return new HostRunQueueEvent(false); }
127 IRunQueueEventImpl* createEventImplWithTimer() final { return new HostRunQueueEvent(true); }
128 void setMemoryAdvice(ConstMemoryView, eMemoryAdvice, DeviceId) final {}
129 void unsetMemoryAdvice(ConstMemoryView, eMemoryAdvice, DeviceId) final {}
130 void setCurrentDevice(DeviceId) final {}
131 const IDeviceInfoList* deviceInfoList() final { return &m_device_info_list; }
132 void getPointerAttribute(PointerAttribute& attribute, const void* ptr) final
133 {
134 _fillPointerAttribute(attribute, ptr);
135 }
136 DeviceMemoryInfo getDeviceMemoryInfo(DeviceId) override
137 {
138 // TODO: à implémenter
139 return {};
140 }
141
142 private:
143
144 DeviceInfoList m_device_info_list;
145};
146
147/*---------------------------------------------------------------------------*/
148/*---------------------------------------------------------------------------*/
149
150class ARCANE_ACCELERATOR_CORE_EXPORT SequentialRunnerRuntime
151: public CommonRunnerRuntime
152{
153 eExecutionPolicy executionPolicy() const final { return eExecutionPolicy::Sequential; }
154};
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
159class ARCANE_ACCELERATOR_CORE_EXPORT ThreadRunnerRuntime
160: public CommonRunnerRuntime
161{
162 public:
163
164 eExecutionPolicy executionPolicy() const final { return eExecutionPolicy::Thread; }
165};
166
167namespace
168{
169 SequentialRunnerRuntime global_sequential_runqueue_runtime;
170 ThreadRunnerRuntime global_thread_runqueue_runtime;
171} // namespace
172
173/*---------------------------------------------------------------------------*/
174/*---------------------------------------------------------------------------*/
175
177extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT IRunnerRuntime*
178getSequentialRunQueueRuntime()
179{
180 return &global_sequential_runqueue_runtime;
181}
182
184extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT IRunnerRuntime*
185getThreadRunQueueRuntime()
186{
187 return &global_thread_runqueue_runtime;
188}
189
190/*---------------------------------------------------------------------------*/
191/*---------------------------------------------------------------------------*/
192
193} // End namespace Arcane::Accelerator::impl
194
195/*---------------------------------------------------------------------------*/
196/*---------------------------------------------------------------------------*/
#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.
Definition DeviceId.h:33
Information sur un device.
Definition DeviceInfo.h:32
Information mémoire d'un accélérateur.
Interface d'une liste de devices.
Arguments pour la copie mémoire.
Definition Memory.h:61
Arguments pour le préfetching mémoire.
Definition Memory.h:123
Informations sur une adresse mémoire.
Informations pour créer une RunQueue.
Interface d'une liste de devices.
Int64 elapsedTime(IRunQueueEventImpl *start_event) final
Temps écoulé (en nanoseconde) entre l'évènement from_event et cet évènement.
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.
void copyMemory(const MemoryCopyArgs &args) override
Effectue une copie entre deux zones mémoire.
void notifyBeginLaunchKernel(RunCommandImpl &) override
Notification avant le lancement de la commande.
bool _barrierNoException() override
Barrière sans exception. Retourne true en cas d'erreur.
void notifyEndLaunchKernel(RunCommandImpl &) override
Notification de fin de lancement de la commande.
void prefetchMemory(const MemoryPrefetchArgs &) override
Effectue un pré-chargement d'une zone mémoire.
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.
Vue constante sur une zone mémoire contigue contenant des éléments de taille fixe.
eMemoryAdvice
Conseils pour la gestion mémoire.
Definition Memory.h:34
eExecutionPolicy
Politique d'exécution pour un Runner.
@ Sequential
Politique d'exécution séquentielle.
@ Thread
Politique d'exécution multi-thread.
ARCCORE_COMMON_EXPORT void copyHost(MutableMemoryView destination, ConstMemoryView source)
Copie dans destination les données de source.
ARCCORE_BASE_EXPORT Real getRealTime()
Temps Real utilisé en secondes.
std::int64_t Int64
Type entier signé sur 64 bits.