diff --git a/hbt/src/perf_event/AmdEvents.cpp b/hbt/src/perf_event/AmdEvents.cpp index bd6104e8..306ceb8f 100644 --- a/hbt/src/perf_event/AmdEvents.cpp +++ b/hbt/src/perf_event/AmdEvents.cpp @@ -182,6 +182,7 @@ void addAmdEvents(const CpuInfo& cpu_info, PmuDeviceManager& pmu_manager) { case CpuArch::MILAN: case CpuArch::BERGAMO: case CpuArch::GENOA: + case CpuArch::TURIN: milan::addEvents(pmu_manager); #ifdef FACEBOOK milan::addEventsFb(pmu_manager); diff --git a/hbt/src/perf_event/BuiltinMetrics.cpp b/hbt/src/perf_event/BuiltinMetrics.cpp index 10cba567..5e8f2870 100644 --- a/hbt/src/perf_event/BuiltinMetrics.cpp +++ b/hbt/src/perf_event/BuiltinMetrics.cpp @@ -476,7 +476,8 @@ std::shared_ptr makePmuDeviceManager() { populateGenericEventsTracepoint(pmu_manager); } - if (cpu_info.cpu_family == CpuFamily::AMD) { + if (cpu_info.cpu_family == CpuFamily::AMDZEN3 || + cpu_info.cpu_family == CpuFamily::AMDZEN5) { addAmdEvents(cpu_info, *pmu_manager); } else if (cpu_info.cpu_family == CpuFamily::INTEL) { // @@ -607,7 +608,9 @@ std::shared_ptr makeAvailableMetrics() { 100'000'000, System::Permissions{}, std::vector{})); - } else if (cpu_info.cpu_family == CpuFamily::AMD) { + } else if ( + cpu_info.cpu_family == CpuFamily::AMDZEN3 || + cpu_info.cpu_family == CpuFamily::AMDZEN5) { metrics->add(std::make_shared( "l2_cache_misses", "Core-originated cacheable demand requests missed L2", @@ -865,6 +868,20 @@ std::shared_ptr makeAvailableMetrics() { "zen4::fp_ret_sse_avx_ops.all", EventExtraAttr{}, {}}}}, + {CpuArch::TURIN, + EventRefs{ + EventRef{ + "flops_scalar", + PmuType::cpu, + "zen3/4::fp_ret_x87_fp_ops.all", + EventExtraAttr{}, + {}}, + EventRef{ + "flops_vector", + PmuType::cpu, + "zen4::fp_ret_sse_avx_ops.all", + EventExtraAttr{}, + {}}}}, // Intel by default {std::nullopt, EventRefs{ diff --git a/hbt/src/perf_event/CpuArch.h b/hbt/src/perf_event/CpuArch.h index 3d214eba..50dbade3 100644 --- a/hbt/src/perf_event/CpuArch.h +++ b/hbt/src/perf_event/CpuArch.h @@ -12,12 +12,14 @@ namespace facebook::hbt::perf_event { -enum class CpuFamily { AMD, INTEL, ARM, UNKNOWN }; +enum class CpuFamily { AMDZEN3, AMDZEN5, INTEL, ARM, UNKNOWN }; inline std::ostream& operator<<(std::ostream& os, CpuFamily f) { switch (f) { - case CpuFamily::AMD: - return os << "AMD"; + case CpuFamily::AMDZEN3: + return os << "AMD Zen 3 / Zen 3+ / Zen 4"; + case CpuFamily::AMDZEN5: + return os << "AMD Zen 5"; case CpuFamily::INTEL: return os << "INTEL"; case CpuFamily::ARM: @@ -40,8 +42,9 @@ inline CpuFamily makeCpuFamily( case 6: return CpuFamily::INTEL; case 25: + return CpuFamily::AMDZEN3; case 26: - return CpuFamily::AMD; + return CpuFamily::AMDZEN5; // Not recognized CPU model. default: return CpuFamily::UNKNOWN; diff --git a/hbt/src/perf_event/json_events/generated/CpuArch.h b/hbt/src/perf_event/json_events/generated/CpuArch.h index 1662b7e0..e404bcdf 100644 --- a/hbt/src/perf_event/json_events/generated/CpuArch.h +++ b/hbt/src/perf_event/json_events/generated/CpuArch.h @@ -20,6 +20,7 @@ enum class CpuArch { MILAN, GENOA, BERGAMO, + TURIN, // Intel Architectures Sorted by model id. BDW, BDW_DE, @@ -58,6 +59,8 @@ inline std::ostream& operator<<(std::ostream& os, CpuArch ev) { return os << "GENOA"; case CpuArch::BERGAMO: return os << "BERGAMO"; + case CpuArch::TURIN: + return os << "TURIN"; case CpuArch::BDW: return os << "BDW"; case CpuArch::BDW_DE: @@ -104,7 +107,7 @@ inline CpuArch makeCpuArchX86( uint32_t cpu_model_num, uint32_t cpu_step_num) { auto cpu_family = makeCpuFamily(cpu_family_num); - if (cpu_family == CpuFamily::AMD) { + if (cpu_family == CpuFamily::AMDZEN3) { switch (cpu_model_num) { case 1: return CpuArch::MILAN; @@ -113,6 +116,11 @@ inline CpuArch makeCpuArchX86( case 160: return CpuArch::BERGAMO; } + } else if (cpu_family == CpuFamily::AMDZEN5) { + switch (cpu_model_num) { + case 17: + return CpuArch::TURIN; + } } else if (cpu_family == CpuFamily::INTEL) { switch (cpu_model_num) { case 42: