Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ParallelLoopOptions.h
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/* ParallelLoopOptions.h (C) 2000-2024 */
9/* */
10/* Options de configuration pour les boucles parallèles en multi-thread. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_PARALLELLOOPOPTIONS_H
13#define ARCANE_UTILS_PARALLELLOOPOPTIONS_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27/*!
28 * \ingroup Concurrency
29 * \brief Options d'exécution d'une boucle parallèle en multi-thread.
30 *
31 * Cette classe permet de spécifier des paramètres d'exécution d'une
32 * boucle parallèle.
33 */
34class ARCANE_UTILS_EXPORT ParallelLoopOptions
35{
36 private:
37
38 //! Drapeau pour indiquer quels champs ont été positionnés.
39 enum SetFlags
40 {
41 SF_MaxThread = 1,
42 SF_GrainSize = 2,
43 SF_Partitioner = 4
44 };
45
46 public:
47
48 //! Type du partitionneur
49 enum class Partitioner
50 {
51 //! Laisse le partitionneur géré le partitionnement et l'ordonnancement (défaut)
52 Auto = 0,
53 /*!
54 * \brief Utilise un partitionnement statique.
55 *
56 * Dans ce mode, grainSize() n'est pas utilisé et le partitionnement ne
57 * dépend que du nombre de threads et de l'intervalle d'itération.
58 *
59 * A noter que l'ordonnencement reste dynamique et donc du exécution à
60 * l'autre ce n'est pas forcément le même thread qui va exécuter
61 * le même bloc d'itération.
62 */
63 Static = 1,
64 /*!
65 * \brief Utilise un partitionnement et un ordonnancement statique.
66 *
67 * Ce mode est similaire à Partitioner::Static mais l'ordonnancement
68 * est déterministe pour l'attribution des tâches: la valeur
69 * renvoyée par TaskFactory::currentTaskIndex() est déterministe.
70 *
71 * \note Actuellement ce mode de partitionnement n'est disponible que
72 * pour la parallélisation des boucles 1D.
73 */
74 Deterministic = 2
75 };
76
77 public:
78
80 : m_grain_size(0)
81 , m_max_thread(-1)
82 , m_partitioner(Partitioner::Auto)
83 , m_flags(0)
84 {}
85
86 public:
87
88 //! Nombre maximal de threads autorisés.
89 Int32 maxThread() const { return m_max_thread; }
90 /*!
91 * \brief Positionne le nombre maximal de threads autorisé.
92 *
93 * Si \a v vaut 0 ou 1, l'exécution sera séquentielle.
94 * Si \a v est supérieur à TaskFactory::nbAllowedThread(), c'est
95 * cette dernière valeur qui sera utilisée.
96 */
97 void setMaxThread(Integer v)
98 {
99 m_max_thread = v;
100 m_flags |= SF_MaxThread;
101 }
102 //! Indique si maxThread() est positionné
103 bool hasMaxThread() const { return m_flags & SF_MaxThread; }
104
105 //! Taille d'un intervalle d'itération.
106 Integer grainSize() const { return m_grain_size; }
107 //! Positionne la taille (approximative) d'un intervalle d'itération
108 void setGrainSize(Integer v)
109 {
110 m_grain_size = v;
111 m_flags |= SF_GrainSize;
112 }
113 //! Indique si grainSize() est positionné
114 bool hasGrainSize() const { return m_flags & SF_GrainSize; }
115
116 //! Type du partitionneur
117 Partitioner partitioner() const { return m_partitioner; }
118 //! Positionne le type du partitionneur
120 {
121 m_partitioner = v;
122 m_flags |= SF_Partitioner;
123 }
124 //! Indique si grainSize() est positionné
125 bool hasPartitioner() const { return m_flags & SF_Partitioner; }
126
127 public:
128
129 //! Fusionne les valeurs non modifiées de l'instance par celles de \a po.
131 {
132 if (!hasMaxThread())
133 setMaxThread(po.maxThread());
134 if (!hasGrainSize())
135 setGrainSize(po.grainSize());
136 if (!hasPartitioner())
137 setPartitioner(po.partitioner());
138 }
139
140 private:
141
142 //! Taille d'un bloc de la boucle
143 Int32 m_grain_size = 0;
144 //!< Nombre maximum de threads pour la boucle
145 Int32 m_max_thread = -1;
146 //!< Type de partitionneur.
147 Partitioner m_partitioner = Partitioner::Auto;
148
149 unsigned int m_flags = 0;
150};
151
152/*---------------------------------------------------------------------------*/
153/*---------------------------------------------------------------------------*/
154
155} // End namespace Arcane
156
157/*---------------------------------------------------------------------------*/
158/*---------------------------------------------------------------------------*/
159
160#endif
Déclarations des types utilisés dans Arcane.
Options d'exécution d'une boucle parallèle en multi-thread.
bool hasPartitioner() const
Indique si grainSize() est positionné
Integer grainSize() const
Taille d'un intervalle d'itération.
Partitioner partitioner() const
Type du partitionneur.
void setPartitioner(Partitioner v)
Positionne le type du partitionneur.
bool hasGrainSize() const
Indique si grainSize() est positionné
void mergeUnsetValues(const ParallelLoopOptions &po)
Fusionne les valeurs non modifiées de l'instance par celles de po.
Int32 maxThread() const
Nombre maximal de threads autorisés.
bool hasMaxThread() const
Indique si maxThread() est positionné
void setGrainSize(Integer v)
Positionne la taille (approximative) d'un intervalle d'itération.
void setMaxThread(Integer v)
Positionne le nombre maximal de threads autorisé.
Partitioner
Type du partitionneur.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-