Arcane  v3.14.10.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ArcaneLauncher.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 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/* ArcaneLauncher.cc (C) 2000-2023 */
9/* */
10/* Classe gérant le lancement de l'exécution. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/launcher/ArcaneLauncher.h"
15
16#include "arcane/launcher/IDirectExecutionContext.h"
17#include "arcane/launcher/DirectSubDomainExecutionContext.h"
18
19#include "arcane/utils/Property.h"
20#include "arcane/utils/FatalErrorException.h"
21#include "arcane/utils/JSONPropertyReader.h"
22#include "arcane/utils/ParameterListPropertyReader.h"
23#include "arcane/utils/PlatformUtils.h"
24#include "arcane/utils/JSONReader.h"
25#include "arcane/utils/Exception.h"
26#include "arcane/utils/ParameterList.h"
27#include "arcane/utils/Ref.h"
29
30#include "arcane/impl/ArcaneMain.h"
31#include "arcane/impl/ArcaneSimpleExecutor.h"
32
33#include "arcane/IDirectSubDomainExecuteFunctor.h"
34
35#include <iomanip>
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40namespace Arcane
41{
42
43namespace
44{
45bool global_has_init_done = false;
46bool _checkInitCalled()
47{
48 if (!global_has_init_done){
49 std::cerr << "ArcaneLauncher::init() has to be called before";
50 return true;
51 }
52 return false;
53}
54bool global_has_standalone_sub_domain = false;
55}
56
57/*---------------------------------------------------------------------------*/
58/*---------------------------------------------------------------------------*/
59
62{
63 public:
65 : m_simple_exec(simple_exec) {}
66
67 public:
73 {
74 return m_simple_exec->createSubDomain(case_file_name);
75 }
76 ISubDomain* subDomain() const { return nullptr; }
77 private:
78 ArcaneSimpleExecutor* m_simple_exec;
79};
80
81/*---------------------------------------------------------------------------*/
82/*---------------------------------------------------------------------------*/
83
84void
85_checkReadConfigFile(StringView config_file_name)
86{
87 // TODO: en parallèle, ne faire la lecture que par un seul PE.
88 if (config_file_name.empty())
89 return;
90 std::cout << "TRY_READING_CONFIG " << config_file_name << "\n";
91 if (!platform::isFileReadable(config_file_name))
92 return;
93 UniqueArray<std::byte> bytes;
94 bool is_bad = platform::readAllFile(config_file_name,false,bytes);
95 if (is_bad)
96 return;
97 ApplicationInfo& app_info(ArcaneLauncher::applicationInfo());
98 app_info.setRuntimeConfigFileContent(bytes);
99 JSONDocument jdoc;
100 jdoc.parse(bytes);
101 JSONValue config = jdoc.root().child("configuration");
102 if (config.null())
103 return;
104 std::cout << "READING CONFIG\n";
105 properties::readFromJSON(config,app_info);
106}
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110
112run()
113{
114 return ArcaneMain::run();
115}
116
117/*---------------------------------------------------------------------------*/
118/*---------------------------------------------------------------------------*/
119
125
126/*---------------------------------------------------------------------------*/
127/*---------------------------------------------------------------------------*/
128
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
155
158{
160 String exe_dir = platform::getFileDirName(exe_full_path);
161 return exe_dir;
162}
163
164/*---------------------------------------------------------------------------*/
165/*---------------------------------------------------------------------------*/
166
168: public IFunctor
169{
170 public:
171 typedef std::function<int(IDirectExecutionContext*)> OldFunctorType;
172 typedef std::function<int(DirectExecutionContext&)> FunctorType;
173 public:
175 : m_simple_executor(x), m_functor(ft){}
176 DirectCodeFunctor(ArcaneSimpleExecutor* x,OldFunctorType* ft)
177 : m_simple_executor(x), m_old_functor(ft){}
178 void executeFunctor() override
179 {
181 if (m_functor){
183 m_return_value = (*m_functor)(direct_context);
184 }
185 else if (m_old_functor)
186 m_return_value = (*m_old_functor)(&direct_context_impl);
187 }
188 int returnValue() const { return m_return_value; }
189 public:
190 ArcaneSimpleExecutor* m_simple_executor = nullptr;
191 OldFunctorType* m_old_functor = nullptr;
192 FunctorType* m_functor = nullptr;
193 int m_return_value = 0;
194};
195
196/*---------------------------------------------------------------------------*/
197/*---------------------------------------------------------------------------*/
198// Obsolète
200runDirect(std::function<int(IDirectExecutionContext* c)> func)
201{
202 if (_checkInitCalled())
203 return (-1);
204 int final_return = 0;
205 {
207 int r = simple_exec.initialize();
208 if (r!=0)
209 return r;
210 // Encapsule le code dans un functor qui va gérer les
211 // exceptions. Sans cela, en cas d'exception et si le code
212 // appelant ne fait rien on aura un appel à std::terminate
214 simple_exec.runCode(&direct_functor);
215 final_return = direct_functor.returnValue();
216 }
217 return final_return;
218}
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
224run(std::function<int(DirectExecutionContext&)> func)
225{
226 if (_checkInitCalled())
227 return (-1);
228
229 int final_return = 0;
230 {
232 int r = simple_exec.initialize();
233 if (r!=0)
234 return r;
235 // Encapsule le code dans un functor qui va gérer les
236 // exceptions. Sans cela, en cas d'exception et si le code
237 // appelant ne fait rien on aura un appel à std::terminate
239 simple_exec.runCode(&direct_functor);
240 final_return = direct_functor.returnValue();
241 }
242 return final_return;
243}
244
245/*---------------------------------------------------------------------------*/
246/*---------------------------------------------------------------------------*/
247
250{
251 public:
253 : m_function(func){}
254 public:
255 int execute() override
256 {
257 if (!m_sub_domain)
258 ARCANE_FATAL("Can not execute 'IDirectSubDomainExecuteFunctor' without sub domain");
260 return m_function(direct_context);
261 }
262 void setSubDomain(ISubDomain* sd) override { m_sub_domain = sd; }
263 private:
264 std::function<int(DirectSubDomainExecutionContext&)> m_function;
265 public:
266 ISubDomain* m_sub_domain = nullptr;
267};
268
269/*---------------------------------------------------------------------------*/
270/*---------------------------------------------------------------------------*/
271
273run(std::function<int(DirectSubDomainExecutionContext&)> func)
274{
275 if (_checkInitCalled())
276 return (-1);
277
279 // En exécution directe, par défaut il n'y a pas de fichier de configuration
280 // du code. Si l'utilisateur n'a pas positionné de fichier de configuration,
281 // alors on le positionne à la chaîne nulle.
282 String config_file = applicationBuildInfo().configFileName();
283 // Le défaut est la chaîne vide. La chaîne nulle indique explicitement qu'on
284 // ne souhaite pas de fichier de configuration
285 if (config_file.empty())
286 applicationBuildInfo().setConfigFileName(String());
287 int r = ArcaneMain::_internalRun(&direct_exec);
288 return r;
289}
290
291/*---------------------------------------------------------------------------*/
292/*---------------------------------------------------------------------------*/
293
294namespace
295{
296class MyVisitor
298{
299 public:
300 void visit(const properties::IPropertySetting* s) override
301 {
302 if (!s->commandLineArgument().null()){
303 std::cout << "ARG:" << std::setw(30) << s->commandLineArgument()
304 << " " << s->description() << "\n";
305 }
306 }
307};
308
309void
310_listPropertySettings()
311{
312 using namespace Arcane::properties;
313 MyVisitor my_visitor;
314 visitAllRegisteredProperties(&my_visitor);
315}
316}
317
319init(const CommandLineArguments& args)
320{
321 try{
323 ARCANE_FATAL("ArcaneLauncher::init() has already been called");
325 applicationInfo().setCommandLineArguments(args);
326 bool do_list = false;
327 if (do_list)
329 const CommandLineArguments& cargs = applicationInfo().commandLineArguments();
330 String runtime_config_file_name = cargs.getParameter("RuntimeConfigFile");
331 if (!runtime_config_file_name.empty())
332 _checkReadConfigFile(runtime_config_file_name);
334 properties::readFromParameterList(args.parameters(),dotnet_info);
336 properties::readFromParameterList(args.parameters(),accelerator_info);
338 properties::readFromParameterList(args.parameters(),loop_options);
340 }
341 catch(const Exception& ex){
342 cerr << ex << '\n';
343 cerr << "** (ArcaneLauncher) Can't continue with the execution.\n";
344 throw;
345 }
346}
347
348/*---------------------------------------------------------------------------*/
349/*---------------------------------------------------------------------------*/
350
356
357/*---------------------------------------------------------------------------*/
358/*---------------------------------------------------------------------------*/
359
365
366/*---------------------------------------------------------------------------*/
367/*---------------------------------------------------------------------------*/
368
369void ArcaneLauncher::
370_initStandalone()
371{
373 ARCANE_FATAL("ArcaneLauncher::init() has to be called before");
374 // Cela est nécessaire pour éventuellement charger dynamiquement le runtime
375 // associé aux accélérateurs
376 ArcaneMain::_initRuntimes();
377}
378
379/*---------------------------------------------------------------------------*/
380/*---------------------------------------------------------------------------*/
381
384{
385 _initStandalone();
386 return {};
387}
388
389/*---------------------------------------------------------------------------*/
390/*---------------------------------------------------------------------------*/
391
394{
396 ARCANE_FATAL("ArcaneLauncher::createStandaloneSubDomain() should only be called once");
397 _initStandalone();
399 s._initUniqueInstance(case_file_name);
401 return s;
402}
403
404/*---------------------------------------------------------------------------*/
405/*---------------------------------------------------------------------------*/
406
407void ArcaneLauncher::
408_notifyRemoveStandaloneSubDomain()
409{
411}
412
413/*---------------------------------------------------------------------------*/
414/*---------------------------------------------------------------------------*/
415
416} // End namespace Arcane
417
418/*---------------------------------------------------------------------------*/
419/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Classes, Types et macros pour gérer la concurrence.
Informations pour construire une instance de IApplication.
Informations sur une application.
int execute() override
Exécute l'opération du fonctor.
void setSubDomain(ISubDomain *sd) override
Positionne le sous-domaine associé. Cette méthode doit être appelée avant execute()
static StandaloneAcceleratorMng createStandaloneAcceleratorMng()
Créé une implémentation autonome pour gérer les accélérateurs.
static int run()
Point d'entrée de l'exécutable dans Arcane.
static String getExeDirectory()
Nom complet du répertoire où se trouve l'exécutable.
static DotNetRuntimeInitialisationInfo & dotNetRuntimeInitialisationInfo()
Informations pour l'initialisation du runtime '.Net'.
static void init(const CommandLineArguments &args)
Positionne les informations à partir des arguments de la ligne de commande et initialise le lanceur.
static ApplicationBuildInfo & applicationBuildInfo()
Informations sur les paramêtre d'exécutions de l'application.
static StandaloneSubDomain createStandaloneSubDomain(const String &case_file_name)
Créé une implémentation autonome pour gérer un sous-domaine.
static bool isInitialized()
Indique si init() a déjà été appelé.
static ApplicationInfo & applicationInfo()
Informations sur l'application.
static AcceleratorRuntimeInitialisationInfo & acceleratorRuntimeInitialisationInfo()
Informations pour l'initialisation des accélerateurs.
static int runDirect(std::function< int(IDirectExecutionContext *)> func)
static void setDefaultMainFactory(IMainFactory *mf)
Positionne la fabrique par défaut pour créer les différents gestionnaires.
static ApplicationBuildInfo & defaultApplicationBuildInfo()
Informations pour l'initialisation des accélerateurs.
static AcceleratorRuntimeInitialisationInfo & defaultAcceleratorRuntimeInitialisationInfo()
Informations pour l'initialisation des accélerateurs.
static DotNetRuntimeInitialisationInfo & defaultDotNetRuntimeInitialisationInfo()
Informations pour l'initialisation du runtime '.Net'.
static int run()
Point d'entrée de l'exécutable dans Arcane.
static ApplicationInfo & defaultApplicationInfo()
Infos par défaut de l'application.
static void setDefaultMainFactory(IMainFactory *mf)
Positionne la fabrique par défaut.
Classe permettant d'exécuter directement du code sans passer par la boucle en temps.
Arguments de la ligne de commande.
const ParameterList & parameters() const
Liste des paramètres.
void executeFunctor() override
Exécute la méthode associé
ISubDomain * createSequentialSubDomain(const String &case_file_name) override
Créé un sous-domaine en séquentiel avec le fichier de jeu de données ayant pour nom case_file_name.
ISubDomain * createSequentialSubDomain() override
Créé un sous-domaine en séquentiel sans jeu de données.
Contexte d'exécution directe.
Contexte d'exécution directe avec création d'un sous-domaine.
Informations pour l'initialisation du runtime '.Net'.
Implémentation de la classe de gestion de l'exécution.
Interface d'un fonctor pour exécuter du code directement après la création d'un sous-domaine sans pas...
Manufacture des classes d'Arcane.
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Definition Lima.cc:120
Options d'exécution d'une boucle parallèle en multi-thread.
Implémentation autonome de 'IAcceleratorMng.h'.
Implémentation autonome d'un sous-domaine.
static void setDefaultParallelLoopOptions(const ParallelLoopOptions &v)
Positionne les valeurs par défaut d'exécution d'une boucle parallèle.
Interface d'un paramètre de propriété.
Definition Property.h:115
virtual String description() const =0
Description de la propriété
virtual String commandLineArgument() const =0
Nom de l'argument de la ligne de commande (nul si aucun)
Interface d'un visiteur sur une propriété.
Definition Property.h:180
Classe de base d'une exception.
Chaîne de caractères unicode.
String getExeFullPath()
Retourne le nom complet avec le chemin de l'exécutable.
bool readAllFile(StringView filename, bool is_binary, ByteArray &out_bytes)
Lit le contenu d'un fichier et le conserve dans out_bytes.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-