timemory 3.3.0
Modular C++ Toolkit for Performance Analysis and Logging. Profiling API and Tools for C, C++, CUDA, Fortran, and Python. The C++ template API is essentially a framework to creating tools: it is designed to provide a unifying interface for recording various performance measurements alongside data logging and interfaces to other tools.
ert_timer.hpp
Go to the documentation of this file.
1// MIT License
2//
3// Copyright (c) 2020, The Regents of the University of California,
4// through Lawrence Berkeley National Laboratory (subject to receipt of any
5// required approvals from the U.S. Dept. of Energy). All rights reserved.
6//
7// Permission is hereby granted, free of charge, to any person obtaining a copy
8// of this software and associated documentation files (the "Software"), to deal
9// in the Software without restriction, including without limitation the rights
10// to use, copy, modify, merge, publish, distribute, sublicense, and
11// copies of the Software, and to permit persons to whom the Software is
12// furnished to do so, subject to the following conditions:
13//
14// The above copyright notice and this permission notice shall be included in all
15// copies or substantial portions of the Software.
16//
17// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23// SOFTWARE.
24
25#pragma once
26
27#include "timemory/components/timing/backends.hpp"
29#include "timemory/tpls/cereal/cereal.hpp"
30#include "timemory/units.hpp"
31
32#include <cstdint>
33#include <iosfwd>
34#include <iostream>
35
36namespace tim
37{
38namespace component
39{
41{
42 using ratio_t = std::nano;
43 using value_type = int64_t;
45 using fmtflags = std::ios_base::fmtflags;
46
47 static const short precision = 3;
48 static const short width = 8;
49 static const fmtflags format_flags =
50 std::ios_base::fixed | std::ios_base::dec | std::ios_base::showpoint;
51
52 static std::string get_label() { return "wall"; }
53 static std::string get_description() { return "wall-clock timer for ERT"; }
54 static int64_t get_unit() { return units::sec; }
55 static std::string get_display_unit() { return units::time_repr(units::sec); }
56
57 static auto get_width() { return width; }
58 static auto get_precision() { return precision; }
59 static auto get_format_flags() { return format_flags; }
60
61 static value_type record() noexcept
62 {
63 return tim::get_clock_real_now<int64_t, ratio_t>();
64 }
65
66 auto load() const { return value; }
67
68 double get() const noexcept { return load() / static_cast<double>(get_unit()); }
69
70 auto get_display() const noexcept { return get(); }
71
72 void start() noexcept { value = record(); }
73 void stop() noexcept
74 {
75 value = (record() - value);
76 ++laps;
77 }
78
79 template <typename Archive>
80 void serialize(Archive& ar, const unsigned int)
81 {
82 ar(cereal::make_nvp("laps", laps));
83 ar(cereal::make_nvp("value", value));
84 ar(cereal::make_nvp("accum", value));
85 }
86
87 friend std::ostream& operator<<(std::ostream& os, const this_type& obj)
88 {
89 obj.print(os);
90 return os;
91 }
92
93 void print(std::ostream& os) const { operation::base_printer<this_type>(os, *this); }
94
95private:
96 int64_t laps = 0;
97 value_type value = 0;
98};
99} // namespace component
100} // namespace tim
Definition for various functions for base_printer in operations.
std::string time_repr(int64_t _unit)
Definition: units.hpp:145
Definition: kokkosp.cpp:39
tim::mpl::apply< std::string > string
Definition: macros.hpp:53
const std::string std::ostream * os
static auto get_precision()
Definition: ert_timer.hpp:58
static int64_t get_unit()
Definition: ert_timer.hpp:54
double get() const noexcept
Definition: ert_timer.hpp:68
friend std::ostream & operator<<(std::ostream &os, const this_type &obj)
Definition: ert_timer.hpp:87
auto get_display() const noexcept
Definition: ert_timer.hpp:70
static value_type record() noexcept
Definition: ert_timer.hpp:61
static std::string get_description()
Definition: ert_timer.hpp:53
static std::string get_label()
Definition: ert_timer.hpp:52
static std::string get_display_unit()
Definition: ert_timer.hpp:55
static const short width
Definition: ert_timer.hpp:48
void stop() noexcept
Definition: ert_timer.hpp:73
static const fmtflags format_flags
Definition: ert_timer.hpp:49
static const short precision
Definition: ert_timer.hpp:47
static auto get_width()
Definition: ert_timer.hpp:57
void print(std::ostream &os) const
Definition: ert_timer.hpp:93
void serialize(Archive &ar, const unsigned int)
Definition: ert_timer.hpp:80
std::ios_base::fmtflags fmtflags
Definition: ert_timer.hpp:45
static auto get_format_flags()
Definition: ert_timer.hpp:59
void start() noexcept
Definition: ert_timer.hpp:72
invoked from the base class to provide default printing behavior