Arcane  v3.14.10.0
Documentation développeur
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/*---------------------------------------------------------------------------*/
43{
44 public:
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
79 inline const RunQueue& operator[](Int32 i) const
80 {
81 return *(m_pool[i % m_pool_size].get());
82 }
83
85 inline RunQueue* operator[](Int32 i)
86 {
87 return m_pool[i % m_pool_size].get();
88 }
89
91 void waitAll() const {
92 for (auto q : m_pool)
93 q->barrier();
94 }
95
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/*---------------------------------------------------------------------------*/
119{
120 return AsyncRunQueuePool(runner);
121}
122
130{
131 return AsyncRunQueuePool(runner, size, priority);
132}
133
144{
145 ARCANE_CHECK_POINTER(runner);
146 return AsyncRunQueuePool(*runner);
147}
148
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.
File d'exécution pour un accélérateur.
Gestionnaire d'exécution pour accélérateur.
Definition core/Runner.h:53
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
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.