Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
EnumeratorTraceWrapper.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/* EnumeratorTraceWrapper.h (C) 2000-2024 */
9/* */
10/* Enumérateur sur des groupes d'entités du maillage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_ENUMERATORTRACEWRAPPER_H
13#define ARCANE_ENUMERATORTRACEWRAPPER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/ArrayView.h"
18#include "arcane/utils/TraceInfo.h"
19
20#include <array>
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25#ifndef ARCANE_TRACE_ENUMERATOR
26// Décommenter si on souhaite toujours activer les traces des énumérateurs
27//#define ARCANE_TRACE_ENUMERATOR
28#endif
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33namespace Arcane
34{
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38/*!
39 * \brief Informations pour les traces d'un énumérator.
40 */
42{
43 public:
44
45 //! Valeurs de compteurs hardware.
46 Int64ArrayView counters() { return Int64ArrayView(8, m_counters.data()); }
47
48 //! Temps du début en nanoseconde
49 Int64 beginTime() const { return m_begin_time; }
50
51 //! Positionne le temps de début
52 void setBeginTime(Int64 v) { m_begin_time = v; }
53
54 //! Positionne les informations de trace
55 void setTraceInfo(const TraceInfo* ti)
56 {
57 if (ti) {
58 m_trace_info = *ti;
59 m_has_trace_info = true;
60 }
61 else
62 m_has_trace_info = false;
63 }
64
65 //! Informations de trace (ou nullptr) si aucune
66 const TraceInfo* traceInfo() const
67 {
68 return (m_has_trace_info) ? &m_trace_info : nullptr;
69 }
70
71 private:
72
73 std::array<Int64, 8> m_counters = {};
74 Int64 m_begin_time = 0;
75 TraceInfo m_trace_info;
76 bool m_has_trace_info = false;
77};
78
79/*---------------------------------------------------------------------------*/
80/*---------------------------------------------------------------------------*/
81/*!
82 * \brief Wrapper autour d'un énumérator pour les traces.
83 *
84 * \a TrueEnumerator est le type du véritable énumérateur et
85 * \a TraceInterface celui de l'interface de gestion. Le type \a TraceInterface
86 * doit posséder les propriétés suivantes:
87 * - une méthode singleton() renvoyant une instance.
88 * - une méthode enterEnumerator() et une méthode exitEnumerator() pour
89 * chaque type d'énumérateur supporté.
90 */
91template <typename TrueEnumerator, typename TracerInterface>
93: public TrueEnumerator
94{
95 public:
96
97 ARCCORE_HOST_DEVICE EnumeratorTraceWrapper(TrueEnumerator&& tenum)
98 : TrueEnumerator(tenum)
99 {
100#ifndef ARCCORE_DEVICE_CODE
101 m_tracer = TracerInterface::singleton();
102 if (m_tracer)
103 m_tracer->enterEnumerator(*this, m_infos);
104#endif
105 }
106 ARCCORE_HOST_DEVICE EnumeratorTraceWrapper(TrueEnumerator&& tenum, [[maybe_unused]] const TraceInfo& ti)
107 : TrueEnumerator(tenum)
108 {
109#ifndef ARCCORE_DEVICE_CODE
110 m_tracer = TracerInterface::singleton();
111 if (m_tracer) {
112 m_infos.setTraceInfo(&ti);
113 m_tracer->enterEnumerator(*this, m_infos);
114 }
115#endif
116 }
117 ARCCORE_HOST_DEVICE ~EnumeratorTraceWrapper() ARCANE_NOEXCEPT_FALSE
118 {
119#ifndef ARCCORE_DEVICE_CODE
120 if (m_tracer)
121 m_tracer->exitEnumerator(*this, m_infos);
122#endif
123 }
124
125 private:
126
127 TracerInterface* m_tracer = nullptr;
128 EnumeratorTraceInfo m_infos;
129};
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133
134#if defined(ARCANE_TRACE_ENUMERATOR)
135#define A_TRACE_ITEM_ENUMERATOR(_EnumeratorClassName) \
136 ::Arcane::EnumeratorTraceWrapper<_EnumeratorClassName, ::Arcane::IItemEnumeratorTracer>
137#define A_TRACE_ENUMERATOR_WHERE , A_FUNCINFO
138#else
139#define A_TRACE_ITEM_ENUMERATOR(_EnumeratorClassName) \
140 _EnumeratorClassName
141#define A_TRACE_ENUMERATOR_WHERE
142#endif
143
144/*---------------------------------------------------------------------------*/
145/*---------------------------------------------------------------------------*/
146
147} // namespace Arcane
148
149/*---------------------------------------------------------------------------*/
150/*---------------------------------------------------------------------------*/
151
152#endif
Informations pour les traces d'un énumérator.
const TraceInfo * traceInfo() const
Informations de trace (ou nullptr) si aucune.
Int64 beginTime() const
Temps du début en nanoseconde.
Int64ArrayView counters()
Valeurs de compteurs hardware.
void setTraceInfo(const TraceInfo *ti)
Positionne les informations de trace.
void setBeginTime(Int64 v)
Positionne le temps de début.
Wrapper autour d'un énumérator pour les traces.
Vue modifiable d'un tableau d'un type T.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
ArrayView< Int64 > Int64ArrayView
Equivalent C d'un tableau à une dimension d'entiers 64 bits.
Definition UtilsTypes.h:609