Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
AsyncRunQueuePool.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 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/* AsyncRunQueuePool.h (C) 2000-2022 */
9/* */
10/* Collection de file d'exécution asynchrone avec priorité sur accélérateur. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ACCELERATOR_ASYNC_RUNQUEUE_POOL_H
13#define ARCANE_ACCELERATOR_ASYNC_RUNQUEUE_POOL_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18#include "arcane/accelerator/core/Runner.h"
19#include "arcane/accelerator/core/RunQueue.h"
20#include "arcane/accelerator/core/RunQueueBuildInfo.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane::Accelerator
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \brief Collection de file d'exécution asynchrone avec priorité sur accélérateur.
32 *
33 * La taille de la collection est uniquement paramétrable à sa création et il
34 * existe une taille maximale de POOL_MAX_SIZE.
35 * Si la taille demandée est supérieure à celle-ci, la taille réelle de la
36 * collection sera de POOL_MAX_SIZE.
37 * L'opérateur d'accès aux éléments renvoit le (i % poolSize()) ème
38 *
39 * \warning API en cours de définition.
40 * \note Courtesy of D.Dureau from Pattern4GPU
41 */
43{
44 public:
45 //! au plus 32 queues (32 = nb de kernels max exécutables simultanément)
46 // TODO: Constante tirée du code de David Dureau dans Pattern4GPU, cette limitation est-elle nécessaire ?
47 static constexpr Int32 POOL_MAX_SIZE = 32;
48
49 public:
50 AsyncRunQueuePool() = delete;
51 AsyncRunQueuePool(const AsyncRunQueuePool&) = delete;
53 AsyncRunQueuePool& operator=(const AsyncRunQueuePool&) = delete;
54 AsyncRunQueuePool& operator=(AsyncRunQueuePool&&) = delete;
55
56 explicit AsyncRunQueuePool(Runner& runner, Int32 pool_size = POOL_MAX_SIZE,
58 : m_pool_size(std::min(pool_size, POOL_MAX_SIZE))
59 {
60 m_pool.reserve(m_pool_size);
61 for (Int32 i(0); i < m_pool_size; ++i) {
63 // TODO: pourra etre changé par std::to_underlying en c++23 (GCC11 CLANG13 MSVC19.30)
64 bi.setPriority(static_cast<std::underlying_type_t<eRunQueuePriority>>(queues_priority));
65 auto queue_ref = makeQueueRef(runner, bi);
66 queue_ref->setAsync(true);
67 m_pool.add(queue_ref);
68 }
69 }
70
71 // TODO: Doit on mettre le destructeur virutal pour un éventuel héritage ?
73 {
74 m_pool_size = 0;
75 m_pool.clear();
76 }
77
78 //! Pour récupérer la i % poolSize() ième queue d'exécution
79 inline const RunQueue& operator[](Int32 i) const
80 {
81 return *(m_pool[i % m_pool_size].get());
82 }
83
84 //! Pour récupérer la i % poolSize() ième queue d'exécution
85 inline RunQueue* operator[](Int32 i)
86 {
87 return m_pool[i % m_pool_size].get();
88 }
89
90 //! Force l'attente de toutes les RunQueue
91 void waitAll() const {
92 for (auto q : m_pool)
93 q->barrier();
94 }
95
96 //! Taille de la collection
97 inline Int32 poolSize() const {
98 return m_pool_size;
99 }
100
101 // TODO: Doit on changer pour protected pour un éventuel héritage ?
102 private:
104 Int32 m_pool_size;
105};
106
107/*---------------------------------------------------------------------------*/
108/*---------------------------------------------------------------------------*/
109/*!
110 * \brief Créé un pool de file temporaire associée à \a runner.
111 *
112 * La taille du pool est de AsyncRunQueuePool::POOL_MAX_SIZE et les queues ont
113 * une priorité par défault.
114 *
115 * Cet appel est thread-safe si runner.isConcurrentQueueCreation()==true.
116 */
119{
120 return AsyncRunQueuePool(runner);
121}
122
123/*!
124 * \brief Créé un pool de file temporaire associée à \a runner.
125 *
126 * Cet appel est thread-safe si runner.isConcurrentQueueCreation()==true.
127 */
130{
131 return AsyncRunQueuePool(runner, size, priority);
132}
133
134/*!
135 * \brief Créé un pool de file temporaire associée à \a runner.
136 *
137 * La taille du pool est de AsyncRunQueuePool::POOL_MAX_SIZE et les queues ont
138 * une priorité par défault.
139 *
140 * Cet appel est thread-safe si runner.isConcurrentQueueCreation()==true.
141 */
144{
145 ARCANE_CHECK_POINTER(runner);
146 return AsyncRunQueuePool(*runner);
147}
148
149/*!
150 * \brief Créé un pool de file temporaire associée à \a runner.
151 *
152 * Cet appel est thread-safe si runner.isConcurrentQueueCreation()==true.
153 */
156{
157 ARCANE_CHECK_POINTER(runner);
158 return AsyncRunQueuePool(*runner, size, priority);
159}
160
161/*---------------------------------------------------------------------------*/
162/*---------------------------------------------------------------------------*/
163
164} // End namespace Arcane::Accelerator
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
169#endif
#define ARCANE_CHECK_POINTER(ptr)
Macro retournant le pointeur ptr s'il est non nul ou lancant une exception s'il est nul.
Collection de file d'exécution asynchrone avec priorité sur accélérateur.
Int32 poolSize() const
Taille de la collection.
RunQueue * operator[](Int32 i)
Pour récupérer la i % poolSize() ième queue d'exécution.
static constexpr Int32 POOL_MAX_SIZE
au plus 32 queues (32 = nb de kernels max exécutables simultanément)
const RunQueue & operator[](Int32 i) const
Pour récupérer la i % poolSize() ième queue d'exécution.
void waitAll() const
Force l'attente de toutes les RunQueue.
Informations pour créer une RunQueue.
void setPriority(int priority)
Positionne la priorité.
File d'exécution pour un accélérateur.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:53
Vecteur 1D de données avec sémantique par valeur (style STL).
Espace de nom pour l'utilisation des accélérateurs.
Ref< RunQueue > makeQueueRef(const Runner &runner)
Créé une référence sur file avec la politique d'exécution par défaut de runner.
AsyncRunQueuePool makeAsyncQueuePool(Runner &runner)
Créé un pool de file temporaire associée à runner.
eRunQueuePriority
Niveaux de priorité prédéfinis pour les files d'exécution sur les accélérateurs.
@ Default
Utilise 0 comme valeur par défaut.