diff options
author | Clement Courbet <courbet@google.com> | 2018-04-04 08:13:32 +0000 |
---|---|---|
committer | Clement Courbet <courbet@google.com> | 2018-04-04 08:13:32 +0000 |
commit | 7287b2c1ec669791df8b1c704e2457338f6bee47 (patch) | |
tree | 43bc8f285b995f2f9bae92ce122bf0425c55a718 /llvm/tools/llvm-exegesis/lib/PerfHelper.h | |
parent | 4f98e0bc030dacf65af981968a8f4f8234f5f32f (diff) | |
download | bcm5719-llvm-7287b2c1ec669791df8b1c704e2457338f6bee47.tar.gz bcm5719-llvm-7287b2c1ec669791df8b1c704e2457338f6bee47.zip |
Add llvm-exegesis tool.
Summary:
[llvm-exegesis][RFC] Automatic Measurement of Instruction Latency/Uops
This is the code corresponding to the RFC "llvm-exegesis Automatic Measurement of Instruction Latency/Uops".
The RFC is available on the LLVM mailing lists as well as the following document
for easier reading:
https://docs.google.com/document/d/1QidaJMJUyQdRrFKD66vE1_N55whe0coQ3h1GpFzz27M/edit?usp=sharing
Subscribers: mgorny, gchatelet, orwant, llvm-commits
Differential Revision: https://reviews.llvm.org/D44519
llvm-svn: 329156
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib/PerfHelper.h')
-rw-r--r-- | llvm/tools/llvm-exegesis/lib/PerfHelper.h | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/PerfHelper.h b/llvm/tools/llvm-exegesis/lib/PerfHelper.h new file mode 100644 index 00000000000..22da2061c52 --- /dev/null +++ b/llvm/tools/llvm-exegesis/lib/PerfHelper.h @@ -0,0 +1,103 @@ +//===-- PerfHelper.h ------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// Helpers for measuring perf events. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TOOLS_LLVM_EXEGESIS_PERFHELPER_H +#define LLVM_TOOLS_LLVM_EXEGESIS_PERFHELPER_H + +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/StringRef.h" +#include <functional> +#include <memory> + +struct perf_event_attr; + +namespace exegesis { +namespace pfm { + +// Returns true on error. +bool pfmInitialize(); +void pfmTerminate(); + +// Retrieves the encoding for the event described by pfm_event_string. +// NOTE: pfm_initialize() must be called before creating PerfEvent objects. +class PerfEvent { +public: + // http://perfmon2.sourceforge.net/manv4/libpfm.html + // Events are expressed as strings. e.g. "INSTRUCTION_RETIRED" + explicit PerfEvent(llvm::StringRef pfm_event_string); + + PerfEvent(const PerfEvent &) = delete; + PerfEvent(PerfEvent &&other); + ~PerfEvent(); + + // The pfm_event_string passed at construction time. + llvm::StringRef name() const; + + // Whether the event was successfully created. + bool valid() const; + + // The encoded event to be passed to the Kernel. + const perf_event_attr *attribute() const; + + // The fully qualified name for the event. + // e.g. "snb_ep::INSTRUCTION_RETIRED:e=0:i=0:c=0:t=0:u=1:k=0:mg=0:mh=1" + llvm::StringRef getPfmEventString() const; + +private: + const std::string EventString; + std::string FullQualifiedEventString; + perf_event_attr *Attr; +}; + +// Uses a valid PerfEvent to configure the Kernel so we can measure the +// underlying event. +struct Counter { + // event: the PerfEvent to measure. + explicit Counter(const PerfEvent &event); + + Counter(const Counter &) = delete; + Counter(Counter &&other) = default; + + ~Counter(); + + void start(); // Starts the measurement of the event. + void stop(); // Stops the measurement of the event. + int64_t read() const; // Return the current value of the counter. + +private: + int FileDescriptor = -1; +}; + +// Helper to measure a list of PerfEvent for a particular function. +// callback is called for each successful measure (PerfEvent needs to be valid). +template <typename Function> +void Measure( + llvm::ArrayRef<PerfEvent> Events, + const std::function<void(const PerfEvent &Event, int64_t Value)> &Callback, + Function Fn) { + for (const auto &Event : Events) { + if (!Event.valid()) + continue; + Counter Cnt(Event); + Cnt.start(); + Fn(); + Cnt.stop(); + Callback(Event, Cnt.read()); + } +} + +} // namespace pfm +} // namespace exegesis + +#endif // LLVM_TOOLS_LLVM_EXEGESIS_PERFHELPER_H |