14#include "arcane/utils/Iostream.h"
15#include "arcane/utils/Ptr.h"
16#include "arcane/utils/StdHeader.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/List.h"
19#include "arcane/utils/ApplicationInfo.h"
20#include "arcane/utils/NotSupportedException.h"
21#include "arcane/utils/FatalErrorException.h"
22#include "arcane/utils/String.h"
23#include "arcane/utils/ITraceMng.h"
24#include "arcane/utils/OStringStream.h"
25#include "arcane/utils/IMemoryInfo.h"
26#include "arcane/utils/Array.h"
27#include "arcane/utils/IFunctor.h"
28#include "arcane/utils/StringBuilder.h"
29#include "arcane/utils/ScopedPtr.h"
30#include "arcane/utils/ValueConvert.h"
31#include "arcane/utils/IProcessorAffinityService.h"
32#include "arcane/utils/ArgumentException.h"
33#include "arcane/utils/CStringUtils.h"
34#include "arcane/utils/ITraceMngPolicy.h"
35#include "arcane/utils/CommandLineArguments.h"
36#include "arcane/utils/CriticalSection.h"
37#include "arccore/common/internal/ParameterListPropertyReader.h"
38#include "arccore/common/internal/Property.h"
40#include "arcane/impl/ArcaneMain.h"
41#include "arcane/impl/ParallelReplication.h"
43#include "arcane/core/IIOMng.h"
44#include "arcane/core/ICodeService.h"
45#include "arcane/core/ISession.h"
46#include "arcane/core/Timer.h"
47#include "arcane/core/ISubDomain.h"
48#include "arcane/core/IApplication.h"
49#include "arcane/core/ITimeLoopMng.h"
50#include "arcane/core/ITimeStats.h"
51#include "arcane/core/SequentialSection.h"
52#include "arcane/core/IParallelSuperMng.h"
53#include "arcane/core/ITimeHistoryMng.h"
54#include "arcane/core/IDirectExecution.h"
55#include "arcane/core/IDirectSubDomainExecuteFunctor.h"
56#include "arcane/core/ICaseMng.h"
57#include "arcane/core/ServiceFinder2.h"
58#include "arcane/core/SubDomainBuildInfo.h"
59#include "arcane/core/IParallelMng.h"
60#include "arcane/core/IMainFactory.h"
61#include "arcane/core/ApplicationBuildInfo.h"
62#include "arcane/core/CaseDatasetSource.h"
64#include "arcane/core/ServiceUtils.h"
66#include "arcane/core/IVariableMng.h"
67#include "arcane/core/VariableCollection.h"
68#include "arcane/core/internal/IVariableMngInternal.h"
70#include "arcane/impl/ExecutionStatsDumper.h"
71#include "arcane/impl/TimeLoopReader.h"
73#include "arccore/common/accelerator/internal/RunnerInternal.h"
93 Int32 m_max_iteration = 0;
94 bool m_is_continue =
false;
118 : m_sub_domain(
nullptr)
119 , m_time_stats(
nullptr)
120 , m_want_print_stats(
false)
131 SubInfo(
const SubInfo&) =
delete;
132 void operator=(
const SubInfo&) =
delete;
140 bool m_want_print_stats;
145 SessionExec(ArcaneMainBatch* arcane_main,
ISession* session,
Int32 nb_local_rank)
146 : m_arcane_main(arcane_main)
149 , m_direct_test_name(m_arcane_main->m_direct_test_name)
152 , m_sub_infos(nb_local_rank)
153 , m_direct_sub_domain_execute_functor(m_arcane_main->_directExecuteFunctor())
155 const CaseDatasetSource& dataset_source = m_arcane_main->applicationBuildInfo().caseDatasetSource();
159 m_sub_infos.fill(
nullptr);
163 for (
Integer i = 0, n = m_sub_infos.size(); i < n; ++i)
164 delete m_sub_infos[i];
170 void executeRank(
Int32 local_rank);
178 ArcaneMainBatch* m_arcane_main;
181 String m_direct_test_name;
202 : m_session_exec(session_exec)
203 , m_local_rank(local_rank)
211 m_session_exec->executeRank(m_local_rank);
225 void build()
override;
240 String m_direct_exec_name;
241 String m_direct_test_name;
263ArcaneMainBatch(
const ApplicationInfo& exe_info, IMainFactory* main_factory)
264: ArcaneMain(exe_info, main_factory)
266, m_check_case_only(false)
267, m_has_sub_domain_threads(false)
311 bool r = _sequentialParseArgs(args);
319bool ArcaneMainBatch::
324 String us_arcane_opt(
"-arcane_opt");
325 String us_init_only(
"init_only");
326 String us_check_case_only(
"check_case_only");
327 String us_continue(
"continue");
328 String us_max_iteration(
"max_iteration");
329 String us_casename(
"casename");
330 String us_direct_exec(
"direct_exec");
331 String us_direct_test(
"direct_test");
332 String us_direct_mesh(
"direct_mesh");
333 String us_tool_arg(
"tool_arg");
334 String us_direct_exec_mesh_arg(
"direct_exec_mesh_arg");
335 String us_nb_sub_domain(
"nb_sub_domain");
336 String us_nb_replication(
"nb_replication");
337 String us_idle_service(
"idle_service");
346 bool has_case_dataset_content = !(dataset_source.
fileName().empty() && dataset_source.
content().empty());
348 if (nb_arg < 2 && !has_case_dataset_content) {
349 trace->
info() <<
"Usage: program input_data ; for more information: program -arcane_opt help";
350 trace->
pfatal() <<
"No input data specified.";
354 StringBuilder tool_args_xml;
355 StringBuilder direct_exec_mesh_args_xml;
358 String nb_sub_domain_str;
359 String nb_replication_str;
361 if (!idle_service_name.null())
364 for (
Integer i = 1, s = nb_arg - 1; i < s; ++i) {
366 if (args[i] != us_arcane_opt) {
367 unknown_args.add(args[i]);
370 bool is_valid_opt =
false;
375 if (str == us_init_only) {
379 else if (str == us_check_case_only) {
383 else if (str == us_continue) {
387 else if (str == us_max_iteration) {
395 trace->
pfatal() <<
"Option 'max_iteration' must specify the number of iterations";
398 else if (str == us_casename) {
405 else if (str == us_direct_exec) {
408 m_direct_exec_name = args[i];
413 else if (str == us_direct_test) {
416 m_direct_test_name = args[i];
421 else if (str == us_tool_arg || str == us_direct_exec_mesh_arg) {
432 String to_add = String::format(
"<{0}>{1}</{2}>\n", arg, value, arg);
433 if (str == us_tool_arg)
434 tool_args_xml += to_add;
435 else if (str == us_direct_exec_mesh_arg)
436 direct_exec_mesh_args_xml += to_add;
439 else if (str == us_nb_sub_domain) {
442 nb_sub_domain_str = args[i];
447 else if (str == us_nb_replication) {
450 nb_replication_str = args[i];
455 else if (str == us_idle_service) {
464 trace->
pfatal() <<
"Unknown Arcane option <" << str <<
">\n";
468 bool use_direct_test = (!m_direct_test_name.null());
469 bool use_direct_exec = (!m_direct_exec_name.null());
471 if (use_direct_test) {
473 else if (use_direct_exec) {
476 tool_mesh = args[nb_arg - 1];
487 if (!nb_sub_domain_str.null()) {
488 Int32 nb_sub_domain = 0;
489 bool is_bad = builtInGetValue(nb_sub_domain, nb_sub_domain_str);
490 if (is_bad || nb_sub_domain <= 0) {
491 trace->
pfatal() <<
"Invalid number of subdomains : " << nb_sub_domain;
493 trace->
info() <<
"Use '" << nb_sub_domain <<
"' subdomains";
494 _applicationBuildInfo().setNbProcessusSubDomain(nb_sub_domain);
497 if (!nb_replication_str.null()) {
498 Int32 nb_replication = 0;
499 bool is_bad = builtInGetValue(nb_replication, nb_replication_str);
500 if (is_bad || nb_replication < 0) {
501 trace->
pfatal() <<
"Invalid number of replication : " << nb_replication;
503 trace->
info() <<
"Use replication of subdomains nb_replication=" << nb_replication;
504 _applicationBuildInfo().setNbReplicationSubDomain(nb_replication);
507 if (_applicationBuildInfo().nbReplicationSubDomain() != 0 && _applicationBuildInfo().nbProcessusSubDomain() != 0)
508 trace->
pfatal() <<
"The subdomains number of replication and restriction options are incompatible.";
510 if (!use_direct_test) {
511 String case_file = dataset_source.
fileName();
516 trace->
info() <<
"The file `" << case_file <<
"' is not a known file type.";
517 case_file = args[nb_arg - 2];
521 trace->
pfatal() <<
"File extension not valid.";
526 if (use_direct_exec) {
531 s +=
"<?xml version=\"1.0\"?>\n";
532 s +=
"<case codename=\"ArcaneDriver\" xml:lang=\"en\" codeversion=\"1.0\">";
534 s +=
" <title>DirectExec</title>\n";
535 s +=
" <description>DirectExec</description>\n";
536 s +=
" <timeloop>ArcaneDirectExecutionLoop</timeloop>\n";
540 s += String::format(
" <filename>{0}</filename>\n", tool_mesh);
541 s += direct_exec_mesh_args_xml;
544 s +=
" <arcane-direct-execution>\n";
545 s += String::format(
" <tool name='{0}'>\n", m_direct_exec_name);
548 s +=
" </arcane-direct-execution>\n";
553 trace->
info() <<
"Direct exec xml file=" << s;
562 if (!unknown_args.empty()) {
563 trace->
info() <<
"Unknown command line option: " << unknown_args[0];
574 struct LaunchThreadInfo
576 ArcaneMainBatch* arcane_main;
577 ArcaneMainBatch::SessionExec* session_exec;
578 IApplication* application;
589void _ThreadWrapper(LaunchThreadInfo* lti)
594 bool clean_abort =
false;
595 bool is_master = lti->thread_index == 0;
597 if (r != 0 && !clean_abort) {
615 ITraceMng* trace = _application()->traceMng();
624 if (nb_wanted_sub_domain > nb_total_rank)
626 nb_wanted_sub_domain, nb_total_rank);
629 trace->
info() <<
"NB_LOCAL_RANK=" << nb_local_rank;
630 if (nb_local_rank >= 1)
632 int return_value = 0;
635 if (dataset_source.
content().empty() && m_direct_test_name.null()) {
637 trace->
info() <<
"Reading input data '" << case_file <<
"'";
638 IIOMng* io_mng = _application()->ioMng();
646 m_session_exec =
new SessionExec(
this, m_session, nb_local_rank);
649 for (
Integer i = 0; i < nb_local_rank; ++i) {
650 thinfo[i].arcane_main =
this;
651 thinfo[i].session_exec = m_session_exec;
652 thinfo[i].application = _application();
653 thinfo[i].thread_index = i;
656 if (nb_local_rank > 1) {
658 for (
Integer i = 0; i < nb_local_rank; ++i) {
659 gths[i] =
new std::thread(_ThreadWrapper, &thinfo[i]);
661 for (
Integer i = 0; i < nb_local_rank; ++i) {
668 m_session_exec->executeRank(0);
683void ArcaneMainBatch::SessionExec::
684executeRank(
Int32 local_rank)
689 auto sub_info =
new SubInfo();
690 m_sub_infos[local_rank] = sub_info;
699 tm->
info() <<
"Binding threads";
705 IParallelSuperMng* psm = _application()->parallelSuperMng();
706 Ref<IParallelMng> world_pm = psm->internalCreateWorldParallelMng(local_rank);
707 sub_info->m_world_parallel_mng = world_pm;
709 if (!m_direct_test_name.null()) {
710 _execDirectTest(world_pm.get(), m_direct_test_name,
true);
722 ITraceMng* trace = world_pm->traceMng();
723 String stat_name =
"Rank";
724 stat_name = stat_name + world_pm->commRank();
725 ITimeStats* time_stat = _application()->mainFactory()->createTimeStats(world_pm->timerMng(), trace, stat_name);
726 sub_info->m_time_stats = time_stat;
727 time_stat->beginGatherStats();
728 world_pm->setTimeStats(time_stat);
730 Ref<IParallelMng> pm = world_pm;
731 Ref<IParallelMng> all_replica_pm = pm;
733 const Integer nb_wanted_sub_domain = _application()->applicationBuildInfo().nbProcessusSubDomain();
734 const Integer nb_wanted_replication = _application()->applicationBuildInfo().nbReplicationSubDomain();
736 if (world_pm->isParallel()) {
742 if (nb_wanted_replication > 1) {
743 Int32 comm_size = world_pm->commSize();
744 Int32 nb_sub_part = comm_size / nb_wanted_replication;
745 trace->info() <<
"Using sub-domain replication nb_sub_part=" << nb_sub_part;
746 if ((comm_size % nb_wanted_replication) != 0)
747 ARCANE_FATAL(
"The number of replication '{0}' must be a common factor of the number of allocated cores '{1}",
748 nb_wanted_replication, comm_size);
751 Ref<IParallelMng> replicate_pm;
752 trace->info() <<
"Building replicated parallel mng";
755 for (
Integer i_sd = 0; i_sd < nb_sub_part; ++i_sd) {
756 for (
Int32 i = 0; i < nb_wanted_replication; ++i) {
757 kept_ranks[i] = i_sd + (i * nb_sub_part);
758 trace->info() <<
"Rank r=" << kept_ranks[i];
760 Ref<IParallelMng> new_pm = world_pm->createSubParallelMngRef(kept_ranks);
762 replicate_pm = new_pm;
763 replicate_pm->setTimeStats(time_stat);
764 trace->info() <<
" Building own replicated parallel mng";
767 trace->info() <<
"!pm";
778 trace->info() <<
"Building sub-domain parallel mng";
781 for (
Integer i_repl = 0; i_repl < nb_wanted_replication; ++i_repl) {
782 for (
Int32 i = 0; i < nb_sub_part; ++i) {
783 kept_ranks[i] = i + (i_repl * nb_sub_part);
784 trace->info() <<
"Rank r=" << kept_ranks[i];
786 Ref<IParallelMng> new_pm = world_pm->createSubParallelMngRef(kept_ranks);
789 if (nb_sub_part == 1) {
793 pm = new_pm->sequentialParallelMngRef();
795 trace->info() <<
"pm: setting time_stat & m_rank_parallel_mng for replica rank=" << i_repl;
797 pm->setTimeStats(time_stat);
798 sub_info->m_rank_parallel_mng = new_pm;
799 auto pr =
new ParallelReplication(i_repl, nb_wanted_replication, replicate_pm);
800 pm->setReplication(pr);
803 trace->info() <<
"!pm";
809 else if (nb_wanted_sub_domain != 0) {
810 const Int32 nb_sub_part = nb_wanted_sub_domain;
812 for (
Int32 i = 0; i < nb_sub_part; ++i)
814 pm = world_pm->createSubParallelMngRef(kept_ranks);
816 trace->info() <<
"pm: setting time_stat & m_rank_parallel_mng";
818 pm->setTimeStats(time_stat);
819 sub_info->m_rank_parallel_mng = pm;
823 trace->info() <<
"!pm";
829 bool print_stats =
false;
830 ISubDomain* sub_domain =
nullptr;
836 trace->info() <<
"The rank doesn't own any subdomain!";
838 trace->info() <<
"No idle service specified";
842 trace->info() <<
"execDirectTest: " <<
m_properties.m_idle_service_name;
844 _execDirectTest(world_pm.get(),
m_properties.m_idle_service_name,
false);
851 _createAndRunSubDomain(sub_info, pm, all_replica_pm, local_rank);
852 sub_domain = sub_info->m_sub_domain;
853 print_stats = sub_info->m_want_print_stats;
856 time_stat->endGatherStats();
858 if (print_stats && sub_domain) {
862 IParallelMng* pm = sub_domain->parallelMng();
867 _printStats(sub_domain, trace, time_stat);
875 sub_domain->variableMng()->_internalApi()->removeAllShMemVariables();
880 world_pm->broadcast(UniqueArray<unsigned long>(1, 0xdfeb699fl).view(), 0);
886void ArcaneMainBatch::SessionExec::
887_createAndRunSubDomain(SubInfo* sub_info, Ref<IParallelMng> pm, Ref<IParallelMng> all_replica_pm,
Int32 local_rank)
891 SubDomainBuildInfo sdbi(pm, local_rank, all_replica_pm);
892 sdbi.setCaseFileName(m_case_file);
893 sdbi.setCaseContent(m_case_bytes);
894 ISubDomain* sub_domain =
m_code_service->createAndLoadCase(m_session, sdbi);
895 sub_info->m_sub_domain = sub_domain;
897 ITraceMng* trace = _application()->traceMng();
898 ITraceMng* sd_trace = sub_domain->traceMng();
899 ITraceMngPolicy* trace_policy = _application()->getTraceMngPolicy();
903 trace->info() <<
"REPLICATION: rank=" << pm->replication()->replicationRank();
905 if (!pm->replication()->isMasterRank()) {
906 trace->info() <<
"Disable output curves for replicates.";
907 sub_domain->timeHistoryMng()->setDumpActive(
false);
917 String cpu_set = pas->cpuSetString();
918 trace->info() <<
" CpuSet=" << cpu_set;
921 if (m_arcane_main->m_check_case_only) {
922 trace->info() <<
"Checking the input data";
925 TimeLoopReader stl(_application());
927 stl.registerTimeLoops(sub_domain);
928 stl.setUsedTimeLoop(sub_domain);
930 ICaseMng* cm = sub_domain->caseMng();
931 cm->readOptions(
true);
938 Timer::Action ts_action(sub_domain,
"Init");
939 Timer::Sentry ts(&init_timer);
945 trace->info() <<
"Option 'max_iteration' activated with " <<
m_properties.m_max_iteration;
952 CriticalSection cs(pm->threadMng());
953 ArcaneMain::redirectSignals();
955 int ret_compute_loop = 0;
957 IDirectExecution* direct_exec = sub_domain->directExecution();
958 if (direct_exec && direct_exec->isActive()) {
959 trace->info() <<
"Direct execution activated";
960 direct_exec->execute();
962 else if (m_arcane_main->m_init_only) {
963 trace->info() <<
"Option 'init_only' activated";
964 sub_info->m_want_print_stats =
true;
967 sub_info->m_want_print_stats =
true;
968 Timer::Action ts_action(sub_domain,
"Loop");
969 Timer::Sentry ts(&loop_timer);
972 trace_policy->setDefaultVerboseLevel(sd_trace, Trace::UNSPECIFIED_VERBOSITY_LEVEL);
973 if (m_direct_sub_domain_execute_functor) {
974 m_direct_sub_domain_execute_functor->setSubDomain(sub_domain);
975 m_direct_sub_domain_execute_functor->execute();
976 sub_domain->parallelMng()->barrier();
979 ret_compute_loop = sub_domain->timeLoopMng()->doComputeLoop(
m_properties.m_max_iteration);
980 if (ret_compute_loop < 0)
983 m_arcane_main->setErrorCode(8);
987 Real init_time = init_timer.totalTime();
988 Real loop_time = loop_timer.totalTime();
989 trace->info(0) <<
"TotalReel = " << (init_time + loop_time)
990 <<
" seconds (init: "
991 << init_time <<
" loop: " << loop_time <<
" )";
994 Timer::Action ts_action(sub_domain,
"Exit");
995 trace_policy->setDefaultVerboseLevel(sd_trace, Trace::DEFAULT_VERBOSITY_LEVEL);
996 sub_domain->doExitModules();
1004void ArcaneMainBatch::SessionExec::
1005_printStats(ISubDomain* sub_domain, ITraceMng* trace, ITimeStats* time_stat)
1007 ExecutionStatsDumper exec_dumper(trace);
1008 exec_dumper.dumpStats(sub_domain, time_stat);
1014void ArcaneMainBatch::SessionExec::
1015_execDirectTest(IParallelMng* world_pm,
const String& test_name,
bool is_collective)
1017 ITraceMng* trace = world_pm->traceMng();
1018 trace->info() <<
"Direct test name=" << test_name;
1020 ServiceFinder2T<IDirectExecution, IApplication> sf(_application(), _application());
1021 Ref<IDirectExecution> exec(sf.createReference(test_name));
1023 String msg = String::format(
"Can not find 'IDirectExecution' service name '{0}'", test_name);
1025 throw ParallelFatalErrorException(A_FUNCINFO, msg);
1027 throw FatalErrorException(A_FUNCINFO, msg);
1030 trace->info() <<
"Begin execution of direct service";
1033 exec->setParallelMng(world_pm);
1045 _application()->removeSession(m_session);
1047 m_session =
nullptr;
1050 delete m_session_exec;
1051 m_session_exec =
nullptr;
1053 ITraceMng* tm = _application()->traceMng();
1064 m_session->doAbort();
1077template <
typename V>
void ArcaneMainBatchProperties::
1078_applyPropertyVisitor(V& p)
1080 auto b = p.builder();
1082 p << b.addInt32(
"MaxIteration")
1083 .addDescription(
"Maximum number of iteration")
1084 .addCommandLineArgument(
"MaxIteration")
1085 .addGetter([](
auto a) {
return a.x.m_max_iteration; })
1086 .addSetter([](
auto a) { a.x.m_max_iteration = a.v; });
1088 p << b.addBool(
"Continue")
1089 .addDescription(
"True if continue from previous execution (restart)")
1090 .addCommandLineArgument(
"Continue")
1091 .addGetter([](
auto a) {
return a.x.m_is_continue; })
1092 .addSetter([](
auto a) { a.x.m_is_continue = a.v; });
1094 p << b.addString(
"IdleService")
1095 .addDescription(
"Name of the idle service for additionnal cores")
1096 .addCommandLineArgument(
"IdleService")
1097 .addGetter([](
auto a) {
return a.x.m_idle_service_name; })
1098 .addSetter([](
auto a) { a.x.m_idle_service_name = a.v; });
1104ARCANE_REGISTER_PROPERTY_CLASS(ArcaneMainBatchProperties, ());
#define ARCANE_THROW(exception_class,...)
Macro for throwing an exception with formatting.
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
static void finalize(ITraceMng *tm)
Finalizes execution.
static void stopAllProfiling()
Stops all profiling activities.
CaseDatasetSource & caseDatasetSource()
Dataset source.
Properties associated with ArcaneMain.
String m_idle_service_name
Service name for unused CPUs.
void executeFunctor() override
Executes the associated method.
Info per subdomain that must be destroyed at the end of execution.
Execution information for a session.
Ref< ICodeService > m_code_service
Code service.
bool m_has_sub_domain_threads
indicates if threads are used to manage subdomains
UniqueArray< std::byte > m_case_bytes
Content of the case dataset as an XML document.
String m_case_file
Name of the file containing the case.
const ArcaneMainBatchProperties m_properties
Execution properties.
Batch execution of a code.
String m_case_name
Case name.
void doAbort() override
Performs an abort.
Ref< ICodeService > m_code_service
Code service.
bool m_init_only
true if only initialization is performed.
ArcaneMainBatchProperties m_properties
Session.
void initialize() override
Initializes the instance. The instance is not usable until this method has been called.
int execute() override
Starts execution. This method only returns when the program exits.
bool m_check_case_only
true if only dataset verification is performed.
void finalize() override
Performs the last operations before instance destruction.
bool m_has_sub_domain_threads
indicates if threads are used to manage subdomains
void build() override
Constructs the class members. The instance is not usable until this method has been called....
bool parseArgs(StringList args) override
Parses arguments.
const ApplicationInfo & applicationInfo() const override
Executable information.
static int callFunctorWithCatchedException(IFunctor *functor, IArcaneMain *amain, bool *clean_abort, bool is_print=true)
Calls the functor functor while catching possible exceptions.
IApplication * application() const override
Application.
void build() override
Constructs the class members. The instance is not usable until this method has been called....
const ApplicationBuildInfo & applicationBuildInfo() const override
Information to build the IApplication instance.
int errorCode() const override
Execution error code.
void initialize() override
Initializes the instance. The instance is not usable until this method has been called.
bool parseArgs(StringList args) override
Parses arguments.
Exception when an argument is invalid.
Source of a case dataset.
void setFileName(const String &name)
Sets the file name of the dataset.
String fileName() const
File name of the dataset.
void setContent(Span< const std::byte > bytes)
Sets the content of the dataset.
ByteConstSpan content() const
Content of the dataset.
Integer count() const
Number of elements in the collection.
virtual IParallelSuperMng * parallelSuperMng()=0
Supervisory parallelism manager.
Interface of the code management class.
virtual ITraceMng * traceMng() const =0
Trace manager.
Interface of a functor to execute code directly after the creation of a subdomain without going throu...
Interface of the input/output manager.
virtual bool collectiveRead(const String &filename, ByteArray &bytes)=0
Collective reading of a file.
Factory for Arcane classes.
Interface of the parallelism manager for a subdomain.
Abstract class of the parallelism supervisor.
virtual void tryAbort()=0
Attempts to abort.
virtual Int32 nbLocalSubDomain()=0
Number of subdomains to create locally.
virtual Int32 commSize() const =0
Returns the total number of processes used.
Interface of a CPU core affinity management service.
virtual void bindThread(Int32 cpu)=0
Constrains the current thread to stay on the core with index cpu.
Interface for a case execution session.
Interface of the subdomain manager.
Interface managing execution time statistics.
virtual TraceMessage pfatal()=0
Stream for a parallel fatal error message.
virtual TraceMessage info()=0
Stream for an information message.
Exception when a 'parallel' fatal error is generated.
Reference to an instance.
Unicode character string.
bool empty() const
True if the string is empty (null or "").
@ TimerReal
Timer using real time.
1D data vector with value semantics (STL style).
Integer toInteger(const char *str, bool *is_ok=0)
Converts the string str to an unsigned integer. If is_ok is not null, it is set to true if the conver...
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type representing an integer.
List< String > StringList
Unicode string list.
UniqueArray< Int32 > Int32UniqueArray
Dynamic 1D array of 32-bit integers.
double Real
Type representing a real number.
std::int32_t Int32
Signed integer type of 32 bits.