Arcane  v3.16.0.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
ItemEnumeratorTracer.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/* ItemEnumeratorTracer.cc (C) 2000-2023 */
9/* */
10/* Trace les appels aux énumérateur sur les entités. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/IPerformanceCounterService.h"
15
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/Profiling.h"
18#include "arcane/utils/ForLoopTraceInfo.h"
19
20#include "arcane/ItemEnumerator.h"
21#include "arcane/SimdItem.h"
22
23#include "arcane/impl/ItemEnumeratorTracer.h"
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28namespace Arcane
29{
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34extern "C++" ARCANE_IMPL_EXPORT Ref<IItemEnumeratorTracer>
35arcaneCreateItemEnumeratorTracer(ITraceMng* tm,Ref<IPerformanceCounterService> perf_counter)
36{
38}
39
40/*---------------------------------------------------------------------------*/
41/*---------------------------------------------------------------------------*/
42
43ItemEnumeratorTracer::
44ItemEnumeratorTracer(ITraceMng* tm,Ref<IPerformanceCounterService> perf_counter)
45: TraceAccessor(tm)
46, m_perf_counter(perf_counter)
47{
48}
49
50/*---------------------------------------------------------------------------*/
51/*---------------------------------------------------------------------------*/
52
53ItemEnumeratorTracer::
54~ItemEnumeratorTracer()
55{
56}
57
58/*---------------------------------------------------------------------------*/
59/*---------------------------------------------------------------------------*/
60
61void ItemEnumeratorTracer::
62_beginLoop(EnumeratorTraceInfo& eti)
63{
64 ++m_nb_call;
65 m_perf_counter->getCounters(eti.counters(), false);
66 eti.setBeginTime(platform::getRealTimeNS());
67}
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
71
72void ItemEnumeratorTracer::
73_endLoop(EnumeratorTraceInfo& eti)
74{
75 m_perf_counter->getCounters(eti.counters(), true);
76 const TraceInfo* ti = eti.traceInfo();
77 ForLoopTraceInfo loop_trace_info;
78 if (ti)
79 loop_trace_info = ForLoopTraceInfo(*ti);
80 ForLoopOneExecStat exec_stat;
81 exec_stat.setBeginTime(eti.beginTime());
82 exec_stat.setEndTime(platform::getRealTimeNS());
83 ProfilingRegistry::_threadLocalForLoopInstance()->merge(exec_stat, loop_trace_info);
84}
85
86/*---------------------------------------------------------------------------*/
87/*---------------------------------------------------------------------------*/
88
89void ItemEnumeratorTracer::
90enterEnumerator(const ItemEnumerator& e, EnumeratorTraceInfo& eti)
91{
92 m_nb_loop += e.count();
93 Int64 begin_time = platform::getRealTimeNS();
94 const TraceInfo* ti = eti.traceInfo();
95 if (ti && m_is_verbose)
96 info() << "Loop:" << (*ti) << " count=" << e.count() << " begin_time=" << begin_time;
97 _beginLoop(eti);
98}
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102
103void ItemEnumeratorTracer::
104exitEnumerator(const ItemEnumerator&, EnumeratorTraceInfo& eti)
105{
106 _endLoop(eti);
107 if (m_is_verbose)
108 info() << "EndLoop: cycle=" << eti.counters()[0] << " fp=" << eti.counters()[1]
109 << " L2DCM=" << eti.counters()[2];
110}
111
112/*---------------------------------------------------------------------------*/
113/*---------------------------------------------------------------------------*/
114
115void ItemEnumeratorTracer::
116enterEnumerator(const SimdItemEnumeratorBase& e, EnumeratorTraceInfo& eti)
117{
118 const TraceInfo* ti = eti.traceInfo();
119 if (ti && m_is_verbose)
120 info() << "SimdLoop:" << (*ti) << " count=" << e.count();
121 _beginLoop(eti);
122}
123
124/*---------------------------------------------------------------------------*/
125/*---------------------------------------------------------------------------*/
126
127void ItemEnumeratorTracer::
128exitEnumerator(const SimdItemEnumeratorBase&, EnumeratorTraceInfo& eti)
129{
130 _endLoop(eti);
131 if (m_is_verbose)
132 info() << "EndSimdLoop: cycle=" << eti.counters()[0] << " fp=" << eti.counters()[1]
133 << " L2DCM=" << eti.counters()[2];
134}
135
136/*---------------------------------------------------------------------------*/
137/*---------------------------------------------------------------------------*/
138
139void ItemEnumeratorTracer::
140dumpStats()
141{
142 info() << "ITEM_ENUMERATOR_TRACER Stats";
143 info() << " nb_call=" << m_nb_call
144 << " nb_loop=" << m_nb_loop
145 << " ratio=" << (Real)m_nb_loop / (Real)(m_nb_call + 1);
146}
147
148/*---------------------------------------------------------------------------*/
149/*---------------------------------------------------------------------------*/
150
151} // End namespace Arcane
152
153/*---------------------------------------------------------------------------*/
154/*---------------------------------------------------------------------------*/
Informations pour les traces d'un énumérator.
const TraceInfo * traceInfo() const
Informations de trace (ou nullptr) si aucune.
Int64ArrayView counters()
Valeurs de compteurs hardware.
Interface du gestionnaire de traces.
constexpr Integer count() const
Nombre d'éléments de l'énumérateur.
Interface d'un traceur d'énumérateur sur les entités.
Enumérateur sur une liste d'entités.
Référence à une instance.
Classe de base des énumérateurs sur les entités vectortielles (SimdItem).
Definition SimdItem.h:376
TraceMessage info() const
Flot pour un message d'information.
Int64 getRealTimeNS()
Temps horloge en nano-secondes.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
std::int64_t Int64
Type entier signé sur 64 bits.
double Real
Type représentant un réel.
auto makeRef(InstanceType *t) -> Ref< InstanceType >
Créé une référence sur un pointeur.