Arcane  v3.14.10.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-2024 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-2024 */
9/* */
10/* Implémentation d'un RunQueue pour une cible donnée. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/accelerator/core/internal/IRunnerRuntime.h"
15#include "arcane/accelerator/core/internal/IRunQueueStream.h"
16#include "arcane/accelerator/core/internal/IRunQueueEventImpl.h"
17#include "arcane/accelerator/core/Memory.h"
18#include "arcane/accelerator/core/DeviceInfoList.h"
19
20#include "arcane/utils/NotImplementedException.h"
21#include "arcane/utils/MemoryView.h"
22#include "arcane/utils/PlatformUtils.h"
23#include "arcane/utils/FatalErrorException.h"
24
25#include <cstring>
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30namespace Arcane::Accelerator::impl
31{
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35
36class ARCANE_ACCELERATOR_CORE_EXPORT HostRunQueueStream
37: public IRunQueueStream
38{
39 public:
40
42 : m_runtime(runtime)
43 {}
44
45 public:
46
47 void notifyBeginLaunchKernel(RunCommandImpl&) override { return m_runtime->notifyBeginLaunchKernel(); }
48 void notifyEndLaunchKernel(RunCommandImpl&) override { return m_runtime->notifyEndLaunchKernel(); }
49 void barrier() override { return m_runtime->barrier(); }
50 void copyMemory(const MemoryCopyArgs& args) override
51 {
52 args.destination().copyHost(args.source());
53 }
54 void prefetchMemory(const MemoryPrefetchArgs&) override {}
55 void* _internalImpl() override { return nullptr; }
56 bool _barrierNoException() override { return false; }
57
58 private:
59
60 IRunnerRuntime* m_runtime;
61};
62
63/*---------------------------------------------------------------------------*/
64/*---------------------------------------------------------------------------*/
65
66class ARCANE_ACCELERATOR_CORE_EXPORT HostRunQueueEvent
67: public IRunQueueEventImpl
68{
69 public:
70
71 explicit HostRunQueueEvent(bool has_timer)
72 : m_has_timer(has_timer)
73 {}
74
75 public:
76
77 void recordQueue(IRunQueueStream*) final
78 {
79 if (m_has_timer)
80 m_recorded_time = platform::getRealTime();
81 }
82 void wait() final {}
83 void waitForEvent(IRunQueueStream*) final {}
85 {
87 auto* true_start_event = static_cast<HostRunQueueEvent*>(start_event);
88 if (!m_has_timer || !true_start_event->m_has_timer)
89 ARCANE_FATAL("Event has no timer support");
90 double diff_time = m_recorded_time - true_start_event->m_recorded_time;
91 Int64 diff_as_int64 = static_cast<Int64>(diff_time * 1.0e9);
92 return diff_as_int64;
93 }
94
95 private:
96
97 bool m_has_timer = false;
98 double m_recorded_time = 0.0;
99};
100
101/*---------------------------------------------------------------------------*/
102/*---------------------------------------------------------------------------*/
103
104class ARCANE_ACCELERATOR_CORE_EXPORT CommonRunnerRuntime
105: public IRunnerRuntime
106{
107 public:
108
110 {
111 DeviceInfo d;
112 d.setDeviceId(DeviceId());
113 d.setName("HostDevice");
114 m_device_info_list.addDevice(d);
115 }
116
117 public:
118
119 void notifyBeginLaunchKernel() final {}
120 void notifyEndLaunchKernel() final {}
121 void barrier() final {}
122 IRunQueueStream* createStream(const RunQueueBuildInfo&) final { return new HostRunQueueStream(this); }
123 IRunQueueEventImpl* createEventImpl() final { return new HostRunQueueEvent(false); }
124 IRunQueueEventImpl* createEventImplWithTimer() final { return new HostRunQueueEvent(true); }
125 void setMemoryAdvice(ConstMemoryView, eMemoryAdvice, DeviceId) final {}
126 void unsetMemoryAdvice(ConstMemoryView, eMemoryAdvice, DeviceId) final {}
127 void setCurrentDevice(DeviceId) final {}
128 const IDeviceInfoList* deviceInfoList() final { return &m_device_info_list; }
129 void getPointerAttribute(PointerAttribute& attribute, const void* ptr) final
130 {
131 _fillPointerAttribute(attribute,ptr);
132 }
133
134 private:
135
136 DeviceInfoList m_device_info_list;
137};
138
139/*---------------------------------------------------------------------------*/
140/*---------------------------------------------------------------------------*/
141
142class ARCANE_ACCELERATOR_CORE_EXPORT SequentialRunnerRuntime
143: public CommonRunnerRuntime
144{
145 eExecutionPolicy executionPolicy() const final { return eExecutionPolicy::Sequential; }
146};
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
151class ARCANE_ACCELERATOR_CORE_EXPORT ThreadRunnerRuntime
152: public CommonRunnerRuntime
153{
154 public:
155
156 eExecutionPolicy executionPolicy() const final { return eExecutionPolicy::Thread; }
157};
158
159namespace
160{
163} // namespace
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
169extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT IRunnerRuntime*
170getSequentialRunQueueRuntime()
171{
173}
174
176extern "C++" ARCANE_ACCELERATOR_CORE_EXPORT IRunnerRuntime*
177getThreadRunQueueRuntime()
178{
180}
181
182/*---------------------------------------------------------------------------*/
183/*---------------------------------------------------------------------------*/
184
185} // End namespace Arcane::Accelerator::impl
186
187/*---------------------------------------------------------------------------*/
188/*---------------------------------------------------------------------------*/
#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
Interface d'une liste de devices.
Arguments pour la copie mémoire.
Definition Memory.h:63
Arguments pour le préfetching mémoire.
Definition Memory.h:125
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.
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.
void * _internalImpl() override
Pointeur sur la structure interne dépendante de l'implémentation.
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é à une RunQueue.
Implémentation d'une commande pour accélérateur.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
eMemoryAdvice
Conseils pour la gestion mémoire.
Definition Memory.h:36
eExecutionPolicy
Politique d'exécution pour un Runner.
std::int64_t Int64
Type entier signé sur 64 bits.