From ddb4135dea1fd8b8990e7ffe8d60e5382371f07e Mon Sep 17 00:00:00 2001 From: FearlessTobi Date: Sun, 9 Aug 2020 01:55:26 +0200 Subject: [PATCH] main/common: Log/append AVX/FMA to the Host CPU string if available and add AVX512 detection Co-Authored-By: Morph --- src/citra_qt/main.cpp | 15 ++++++++++++++- src/common/telemetry.cpp | 1 + src/common/telemetry.h | 4 ++-- src/common/x64/cpu_detect.cpp | 5 +++++ src/common/x64/cpu_detect.h | 1 + 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index e4a1832ee5..5c57dbeda4 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -190,7 +190,20 @@ GMainWindow::GMainWindow() LOG_INFO(Frontend, "Citra Version: {} | {}-{}", Common::g_build_fullname, Common::g_scm_branch, Common::g_scm_desc); #ifdef ARCHITECTURE_x86_64 - LOG_INFO(Frontend, "Host CPU: {}", Common::GetCPUCaps().cpu_string); + const auto& caps = Common::GetCPUCaps(); + std::string cpu_string = caps.cpu_string; + if (caps.avx || caps.avx2 || caps.avx512) { + cpu_string += " | AVX"; + if (caps.avx512) { + cpu_string += "512"; + } else if (caps.avx2) { + cpu_string += '2'; + } + if (caps.fma || caps.fma4) { + cpu_string += " | FMA"; + } + } + LOG_INFO(Frontend, "Host CPU: {}", cpu_string); #endif LOG_INFO(Frontend, "Host OS: {}", QSysInfo::prettyProductName().toStdString()); UpdateWindowTitle(); diff --git a/src/common/telemetry.cpp b/src/common/telemetry.cpp index 200c6489aa..16d42facde 100644 --- a/src/common/telemetry.cpp +++ b/src/common/telemetry.cpp @@ -60,6 +60,7 @@ void AppendCPUInfo(FieldCollection& fc) { fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AES", Common::GetCPUCaps().aes); fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX", Common::GetCPUCaps().avx); fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX2", Common::GetCPUCaps().avx2); + fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_AVX512", Common::GetCPUCaps().avx512); fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI1", Common::GetCPUCaps().bmi1); fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_BMI2", Common::GetCPUCaps().bmi2); fc.AddField(FieldType::UserSystem, "CPU_Extension_x64_FMA", Common::GetCPUCaps().fma); diff --git a/src/common/telemetry.h b/src/common/telemetry.h index 383b2309aa..a3ebed4a7b 100644 --- a/src/common/telemetry.h +++ b/src/common/telemetry.h @@ -55,8 +55,8 @@ public: Field(FieldType type, std::string name, T value) : name(std::move(name)), type(type), value(std::move(value)) {} - Field(const Field& other) = default; - Field& operator=(const Field& other) = default; + Field(const Field&) = default; + Field& operator=(const Field&) = default; Field(Field&&) = default; Field& operator=(Field&& other) = default; diff --git a/src/common/x64/cpu_detect.cpp b/src/common/x64/cpu_detect.cpp index 3a36c3f68a..f6677d5a01 100644 --- a/src/common/x64/cpu_detect.cpp +++ b/src/common/x64/cpu_detect.cpp @@ -110,6 +110,11 @@ static CPUCaps Detect() { caps.bmi1 = true; if ((cpu_id[1] >> 8) & 1) caps.bmi2 = true; + // Checks for AVX512F, AVX512CD, AVX512VL, AVX512DQ, AVX512BW (Intel Skylake-X/SP) + if ((cpu_id[1] >> 16) & 1 && (cpu_id[1] >> 28) & 1 && (cpu_id[1] >> 31) & 1 && + (cpu_id[1] >> 17) & 1 && (cpu_id[1] >> 30) & 1) { + caps.avx512 = caps.avx2; + } } } diff --git a/src/common/x64/cpu_detect.h b/src/common/x64/cpu_detect.h index c34f444747..92c85c2ece 100644 --- a/src/common/x64/cpu_detect.h +++ b/src/common/x64/cpu_detect.h @@ -18,6 +18,7 @@ struct CPUCaps { bool sse4_2; bool avx; bool avx2; + bool avx512; bool bmi1; bool bmi2; bool fma;