cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
perfevent.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_PROFILING_PERFEVENT_H
4#define pRC_CORE_PROFILING_PERFEVENT_H
5
6#include <cstdint>
7#include <cstring>
8
9extern "C"
10{
11#include <unistd.h>
12
13#include <linux/perf_event.h>
14#include <sys/ioctl.h>
15#include <sys/syscall.h>
16}
17
18#include <prc/core/log/log.hpp>
20
22{
23 enum class Events
24 {
25 Cycles,
29 };
30
31 template<Events Event>
33 {
34 private:
35 static constexpr auto type()
36 {
37 if constexpr(Event == Events::Cycles ||
38 Event == Events::Instructions ||
39 Event == Events::CacheReferences ||
40 Event == Events::CacheMisses)
41 {
42 return PERF_TYPE_HARDWARE;
43 }
44 }
45
46 static constexpr auto config()
47 {
48 if constexpr(Event == Events::Cycles)
49 {
50 return PERF_COUNT_HW_CPU_CYCLES;
51 }
52 else if constexpr(Event == Events::Instructions)
53 {
54 return PERF_COUNT_HW_INSTRUCTIONS;
55 }
56 else if constexpr(Event == Events::CacheReferences)
57 {
58 return PERF_COUNT_HW_CACHE_REFERENCES;
59 }
60 else if constexpr(Event == Events::CacheMisses)
61 {
62 return PERF_COUNT_HW_CACHE_MISSES;
63 }
64 }
65
66 public:
68 {
69 struct perf_event_attr pea;
70 std::memset(&pea, 0, sizeof(struct perf_event_attr));
71 pea.type = type();
72 pea.size = sizeof(struct perf_event_attr);
73 pea.config = config();
74 pea.disabled = 1;
75 pea.exclude_kernel = 1;
76 pea.exclude_hv = 1;
77 pea.inherit = 1;
78
79 mFD = syscall(__NR_perf_event_open, &pea, 0, -1, -1, 0);
80 if(mFD == -1)
81 {
82 Logging::warning("Unable to open perf event descriptor.");
83 }
84 }
85
87 : mFD(other.mFD)
88 , mValue(other.mValue)
89 {
90 other.mFD = -1;
91 }
92
94 {
95 mFD = rhs.mFD;
96 mValue = rhs.mValue;
97 rhs.mFD = -1;
98 }
99
101 {
102 close(mFD);
103 }
104
105 PerfEvent(PerfEvent const &) = delete;
106 PerfEvent &operator=(PerfEvent const &) = delete;
107
108 auto start()
109 {
110 if(mFD != -1)
111 {
112 ioctl(mFD, PERF_EVENT_IOC_RESET, 0);
113 ioctl(mFD, PERF_EVENT_IOC_ENABLE, 0);
114 }
115 return;
116 }
117
118 auto stop()
119 {
120 if(mFD != -1)
121 {
122 ioctl(mFD, PERF_EVENT_IOC_DISABLE, 0);
123 std::uint64_t value;
124 if(read(mFD, &value, sizeof(std::uint64_t)) !=
125 sizeof(std::uint64_t))
126 {
127 Logging::error("Unable to read perf event counter.");
128 }
129 mValue += value;
130 }
131 return;
132 }
133
134 auto reset()
135 {
136 if(mFD != -1)
137 {
138 ioctl(mFD, PERF_EVENT_IOC_RESET, 0);
139 mValue = 0;
140 }
141 }
142
143 auto value() const
144 {
145 return Integer(mValue);
146 }
147
148 private:
149 int mFD = -1;
150 std::uint64_t mValue = 0;
151 };
152}
153#endif // pRC_CORE_PROFILING_PERFEVENT_H
Definition perfevent.hpp:33
~PerfEvent()
Definition perfevent.hpp:100
PerfEvent()
Definition perfevent.hpp:67
PerfEvent(PerfEvent const &)=delete
auto start()
Definition perfevent.hpp:108
auto reset()
Definition perfevent.hpp:134
PerfEvent & operator=(PerfEvent const &)=delete
auto stop()
Definition perfevent.hpp:118
auto value() const
Definition perfevent.hpp:143
PerfEvent & operator=(PerfEvent &&rhs) &
Definition perfevent.hpp:93
PerfEvent(PerfEvent &&other)
Definition perfevent.hpp:86
Definition perfevent.hpp:22
Events
Definition perfevent.hpp:24
static void warning(Xs &&...args)
Definition log.hpp:21
static void error(Xs &&...args)
Definition log.hpp:14
Integer(Integer< true, 8 >::Fundamental const) -> Integer< true, 8 >