diff options
author | Moritz Pflanzer <moritz.pflanzer@arm.com> | 2017-08-30 12:47:06 +0100 |
---|---|---|
committer | Anthony Barbier <anthony.barbier@arm.com> | 2018-11-02 16:35:24 +0000 |
commit | 09e4f98e31a9bb77bebeccd59c70f0715ab2c292 (patch) | |
tree | dcf5992df5961042a221cb426372eeb21a2d8023 /tests/framework/instruments/PMUCounter.cpp | |
parent | 906443f38fe2c168f4a0b2db5cd9852865fc4922 (diff) | |
download | ComputeLibrary-09e4f98e31a9bb77bebeccd59c70f0715ab2c292.tar.gz |
COMPMID-482: Refactor PMU counters
Change-Id: I9b254ce693363ecbbd7c188d211c85471134a91e
Reviewed-on: http://mpd-gerrit.cambridge.arm.com/84328
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Tested-by: Kaizen <jeremy.johnson+kaizengerrit@arm.com>
Diffstat (limited to 'tests/framework/instruments/PMUCounter.cpp')
-rw-r--r-- | tests/framework/instruments/PMUCounter.cpp | 118 |
1 files changed, 26 insertions, 92 deletions
diff --git a/tests/framework/instruments/PMUCounter.cpp b/tests/framework/instruments/PMUCounter.cpp index 7994a15862..b962bd9b2b 100644 --- a/tests/framework/instruments/PMUCounter.cpp +++ b/tests/framework/instruments/PMUCounter.cpp @@ -23,117 +23,51 @@ */ #include "PMUCounter.h" -#define _GNU_SOURCE 1 -#include <asm/unistd.h> -#include <csignal> -#include <cstdio> -#include <cstdlib> -#include <cstring> -#include <fcntl.h> -#include <linux/hw_breakpoint.h> -#include <linux/perf_event.h> -#include <sys/ioctl.h> -#include <unistd.h> -#undef _GNU_SOURCE - -#include <stdexcept> - namespace arm_compute { namespace test { namespace framework { -CycleCounter::CycleCounter() -{ - const pid_t pid = getpid(); - - struct perf_event_attr perf_config; //NOLINT - memset(&perf_config, 0, sizeof(struct perf_event_attr)); - - perf_config.config = PERF_COUNT_HW_CPU_CYCLES; - perf_config.size = sizeof(struct perf_event_attr); - perf_config.type = PERF_TYPE_HARDWARE; - // The inherit bit specifies that this counter should count events of child - // tasks as well as the task specified - perf_config.inherit = 1; - // Enables saving of event counts on context switch for inherited tasks - perf_config.inherit_stat = 1; - - _fd = syscall(__NR_perf_event_open, &perf_config, pid, -1, -1, 0); - - if(_fd < 0) - { - throw std::runtime_error("perf_event_open for cycles failed"); - } -} - -std::string CycleCounter::id() const -{ - return "Cycle Counter"; -} - -void CycleCounter::start() +std::string PMUCounter::id() const { - ioctl(_fd, PERF_EVENT_IOC_RESET, 0); - ioctl(_fd, PERF_EVENT_IOC_ENABLE, 0); + return "PMU Counter"; } -void CycleCounter::stop() +void PMUCounter::start() { - ioctl(_fd, PERF_EVENT_IOC_DISABLE, 0); - read(_fd, &_cycles, sizeof(_cycles)); + _pmu_cycles.reset(); + _pmu_instructions.reset(); } -Instrument::Measurement CycleCounter::measurement() const +void PMUCounter::stop() { - return Measurement(_cycles, "cycles"); -} - -InstructionCounter::InstructionCounter() -{ - const pid_t pid = getpid(); - - struct perf_event_attr perf_config; //NOLINT - memset(&perf_config, 0, sizeof(struct perf_event_attr)); - - perf_config.config = PERF_COUNT_HW_INSTRUCTIONS; - perf_config.size = sizeof(struct perf_event_attr); - perf_config.type = PERF_TYPE_HARDWARE; - // The inherit bit specifies that this counter should count events of child - // tasks as well as the task specified - perf_config.inherit = 1; - // Enables saving of event counts on context switch for inherited tasks - perf_config.inherit_stat = 1; - - _fd = syscall(__NR_perf_event_open, &perf_config, pid, -1, -1, 0); - - if(_fd < 0) + try { - throw std::runtime_error("perf_event_open for instructions failed"); + _cycles = _pmu_cycles.get_value<long long>(); + } + catch(const std::runtime_error &) + { + _cycles = 0; } -} - -std::string InstructionCounter::id() const -{ - return "Instruction Counter"; -} - -void InstructionCounter::start() -{ - ioctl(_fd, PERF_EVENT_IOC_RESET, 0); - ioctl(_fd, PERF_EVENT_IOC_ENABLE, 0); -} -void InstructionCounter::stop() -{ - ioctl(_fd, PERF_EVENT_IOC_DISABLE, 0); - read(_fd, &_instructions, sizeof(_instructions)); + try + { + _instructions = _pmu_instructions.get_value<long long>(); + } + catch(const std::runtime_error &) + { + _instructions = 0; + } } -Instrument::Measurement InstructionCounter::measurement() const +Instrument::MeasurementsMap PMUCounter::measurements() const { - return Measurement(_instructions, "instructions"); + return MeasurementsMap + { + { "CPU cycles", Measurement(_cycles, "cycles") }, + { "CPU instructions", Measurement(_instructions, "instructions") }, + }; } } // namespace framework } // namespace test |