63775f241a
* EvaluateAST and validation of RawAST * Adding MetricDimension class and concepts * set_dimensions() and improved ValidateRawAST() * source formatting (clang-format v11) (#124) Co-authored-by: bwelton <bwelton@users.noreply.github.com> * Addressing 1st round of review comments * Modified the parser production rules to support the right syntax for REDUCE and SELECT derived metric expressions * changes to raw_ast.hpp and fmt::format() * Parser tests updated to support corrected REDUCE and SELECT syntax * changes to EvaluateAST::set_dimensions() and other dimension related code changes * Added a test for EvaluateAST::evaluate() to test basic arithmetic on EvaluateAST * Format source code (via clang-format v11) on sauverma/evaluate-ast (#146) * source formatting (clang-format v11) * Add dimension information to counter record Restructures counter records to have the following design: rocprofiler_record_id_t which is an int64_t that encodes both the counter id and dimension information for the record. The first 16 bits are reserved for the counter id while the last 48 are split among the dimensions specified in rocprofiler_dimension_t (currently 8 bits per dimension). Each of the 8 bits for the dimension stores the dimension value for that dimension for this record (i.e. a value of 8 on dimension XCC would denote XCC[8] for the counter). The split among the dimensions will automatically adjust as dimensions are added or removed. The record also contains a union of {int64_t hw_counter, double derived_counter} to specify the value of the record at rocprofiler_record_id_t. int64_t denotes a physical hardware counter that has integer types while the double is used for derived counters (which type this counters values are needs to be queried separately). * Integration of new id type + other fixes --------- Co-authored-by: sauverma93 <sauverma93@users.noreply.github.com> Co-authored-by: Benjamin Welton <bewelton@amd.com> * Fixed sissues with reduce() implementation and added a test for reduce() * Updated parser syntax for reduce() and updated the parser test. Disabled the test for select() * Build warning fixes * Modifications to support fetching xcc/etc info from agent * Initial plumbing working for single counters, cleanup+tests still needed * Remove string comparison from reduce ops * source formatting (clang-format v11) (#163) Co-authored-by: bwelton <bwelton@users.noreply.github.com> * cmake formatting (cmake-format) (#164) Co-authored-by: bwelton <bwelton@users.noreply.github.com> * source formatting (clang-format v11) (#171) Co-authored-by: bwelton <bwelton@users.noreply.github.com> * Merged with master * source formatting (clang-format v11) (#172) Co-authored-by: bwelton <bwelton@users.noreply.github.com> * source formatting (clang-format v11) (#173) Co-authored-by: bwelton <bwelton@users.noreply.github.com> * Test fix --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: bwelton <bwelton@users.noreply.github.com> Co-authored-by: sauverma93 <sauverma93@users.noreply.github.com> Co-authored-by: Benjamin Welton <bewelton@amd.com>
147 lines
3.7 KiB
C++
147 lines
3.7 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <vector>
|
|
|
|
#include <hsa/hsa_ven_amd_aqlprofile.h>
|
|
|
|
#include "fmt/core.h"
|
|
#include "fmt/ranges.h"
|
|
|
|
namespace rocprofiler
|
|
{
|
|
namespace counters
|
|
{
|
|
// Base metrics (w/o instance information) defined in gfx_metrics/derrived.xml
|
|
class Metric
|
|
{
|
|
public:
|
|
Metric() = default;
|
|
Metric(const std::string&, // Get rid of this...
|
|
std::string name,
|
|
std::string block,
|
|
std::string event,
|
|
std::string dsc,
|
|
std::string expr,
|
|
std::string special,
|
|
uint64_t id)
|
|
: name_(std::move(name))
|
|
, block_(std::move(block))
|
|
, event_(std::move(event))
|
|
, description_(std::move(dsc))
|
|
, expression_(std::move(expr))
|
|
, special_(std::move(special))
|
|
, id_(id)
|
|
{}
|
|
|
|
const std::string& name() const { return name_; }
|
|
const std::string& block() const { return block_; }
|
|
const std::string& event() const { return event_; }
|
|
const std::string& description() const { return description_; }
|
|
const std::string& expression() const { return expression_; }
|
|
const std::string& special() const { return special_; }
|
|
uint64_t id() const { return id_; }
|
|
bool empty() const { return empty_; }
|
|
|
|
friend bool operator<(Metric const& lhs, Metric const& rhs);
|
|
|
|
private:
|
|
std::string name_ = {};
|
|
std::string block_ = {};
|
|
std::string event_ = {};
|
|
std::string description_ = {};
|
|
std::string expression_ = {};
|
|
std::string special_ = {};
|
|
int64_t id_ = -1;
|
|
bool empty_ = false;
|
|
};
|
|
|
|
using MetricMap = std::unordered_map<std::string, std::vector<Metric>>;
|
|
using MetricIdMap = std::unordered_map<uint64_t, Metric>;
|
|
|
|
/**
|
|
* Get base hardware counters for all GFXs Map<GFX Name, Counters>
|
|
*/
|
|
MetricMap
|
|
getBaseHardwareMetrics();
|
|
|
|
/**
|
|
* Get derived hardware metrics for all GFXs Map<GFX Name, Counters>
|
|
*/
|
|
MetricMap
|
|
getDerivedHardwareMetrics();
|
|
|
|
/**
|
|
* Combined map containing both base and derived counters
|
|
*/
|
|
const MetricMap&
|
|
getMetricMap();
|
|
|
|
/**
|
|
* Get the metrics that apply to a specific agent. Supplied parameter
|
|
* is the GFXIP of the agent.
|
|
*/
|
|
const std::vector<Metric>&
|
|
getMetricsForAgent(const std::string&);
|
|
|
|
/**
|
|
* Get a map of metric::id() -> metric
|
|
*/
|
|
const MetricIdMap&
|
|
getMetricIdMap();
|
|
} // namespace counters
|
|
} // namespace rocprofiler
|
|
|
|
namespace fmt
|
|
{
|
|
// fmt::format support for metric
|
|
template <>
|
|
struct formatter<rocprofiler::counters::Metric>
|
|
{
|
|
template <typename ParseContext>
|
|
constexpr auto parse(ParseContext& ctx)
|
|
{
|
|
return ctx.begin();
|
|
}
|
|
|
|
template <typename Ctx>
|
|
auto format(rocprofiler::counters::Metric const& metric, Ctx& ctx) const
|
|
{
|
|
return fmt::format_to(
|
|
ctx.out(),
|
|
"Metric: {} [Block: {}, Event: {}, Expression: {}, Description: {}, id: {}]",
|
|
metric.name(),
|
|
metric.block(),
|
|
metric.event(),
|
|
metric.expression().empty() ? "<None>" : metric.expression(),
|
|
metric.description(),
|
|
metric.id());
|
|
}
|
|
};
|
|
|
|
// fmt::format support for MetricMap
|
|
template <>
|
|
struct formatter<rocprofiler::counters::MetricMap>
|
|
{
|
|
template <typename ParseContext>
|
|
constexpr auto parse(ParseContext& ctx)
|
|
{
|
|
return ctx.begin();
|
|
}
|
|
|
|
template <typename Ctx>
|
|
auto format(rocprofiler::counters::MetricMap const& map, Ctx& ctx) const
|
|
{
|
|
std::string out;
|
|
for(const auto& [gfxName, counters] : map)
|
|
{
|
|
out += fmt::format("Counters for {}\n\t{}\n", gfxName, fmt::join(counters, "\n\t"));
|
|
}
|
|
return fmt::format_to(ctx.out(), "{}", out);
|
|
}
|
|
};
|
|
} // namespace fmt
|