16 #ifndef WIDTH_EXTENDER_HEADER_
17 #define WIDTH_EXTENDER_HEADER_
43 virtual uint64 operator () () = 0;
49 std::shared_ptr<SafeMsrHandle> msr;
51 MsrHandleCounter(std::shared_ptr<SafeMsrHandle> msr_, uint64 msr_addr_) : msr(msr_), msr_addr(msr_addr_) { }
55 msr->read(msr_addr, &value);
62 std::shared_ptr<ClientBW> clientBW;
64 uint64 operator () () {
return clientBW->getImcReads(); }
69 std::shared_ptr<ClientBW> clientBW;
71 uint64 operator () () {
return clientBW->getImcWrites(); }
76 std::shared_ptr<ClientBW> clientBW;
78 uint64 operator () () {
return clientBW->getIoRequests(); }
83 std::shared_ptr<SafeMsrHandle> msr;
84 MBLCounter(std::shared_ptr<SafeMsrHandle> msr_) : msr(msr_) { }
89 uint64 msr_qm_evtsel = 0, value = 0;
90 msr->read(IA32_QM_EVTSEL, &msr_qm_evtsel);
92 msr_qm_evtsel &= 0xfffffffffffffff0ULL;
93 msr_qm_evtsel |=
event & ((1ULL << 8) - 1ULL);
96 msr->write(IA32_QM_EVTSEL, msr_qm_evtsel);
97 msr->read(IA32_QM_CTR, &value);
106 std::shared_ptr<SafeMsrHandle> msr;
107 MBTCounter(std::shared_ptr<SafeMsrHandle> msr_) : msr(msr_) { }
108 uint64 operator () ()
112 uint64 msr_qm_evtsel = 0, value = 0;
113 msr->read(IA32_QM_EVTSEL, &msr_qm_evtsel);
115 msr_qm_evtsel &= 0xfffffffffffffff0ULL;
116 msr_qm_evtsel |=
event & ((1ULL << 8) - 1ULL);
119 msr->write(IA32_QM_EVTSEL, msr_qm_evtsel);
120 msr->read(IA32_QM_CTR, &value);
128 std::thread * UpdateThread;
133 uint64 extended_value;
134 uint64 last_raw_value;
135 uint64 counter_width;
136 uint32 watchdog_delay_ms;
143 uint64 internal_read()
145 uint64 result = 0, new_raw_value = 0;
148 new_raw_value = (*raw_counter)();
149 if (new_raw_value < last_raw_value)
151 extended_value += ((1ULL << counter_width) - last_raw_value) + new_raw_value;
155 extended_value += (new_raw_value - last_raw_value);
158 last_raw_value = new_raw_value;
160 result = extended_value;
162 CounterMutex.unlock();
168 CounterWidthExtender(AbstractRawCounter * raw_counter_, uint64 counter_width_, uint32 watchdog_delay_ms_);
173 return internal_read();
178 extended_value = last_raw_value = (*raw_counter)();
179 CounterMutex.unlock();
Definition: width_extender.h:41
Definition: width_extender.h:67
Interface to access client bandwidth counters.
Some common utility routines.
Definition: width_extender.h:104
Main CPU counters header.
Definition: width_extender.h:74
Definition: width_extender.h:38
Definition: width_extender.h:81
Definition: width_extender.h:60
Definition: width_extender.h:47