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