diff --git a/power_overwhelming/include/power_overwhelming/adl_sensor_source.h b/power_overwhelming/include/power_overwhelming/adl_sensor_source.h index c8a64c14..03548f64 100644 --- a/power_overwhelming/include/power_overwhelming/adl_sensor_source.h +++ b/power_overwhelming/include/power_overwhelming/adl_sensor_source.h @@ -20,25 +20,30 @@ namespace power_overwhelming { enum class adl_sensor_source : std::uint32_t { /// - /// + /// ADL_PMLOG_SOC_POWER. /// soc = 0x0001, /// - /// + /// ADL_PMLOG_GFX_POWER. /// graphics = 0x0002, /// - /// + /// ADL_PMLOG_ASIC_POWER or ADL_PMLOG_SSPAIRED_ASICPOWER. /// asic = 0x0004, /// - /// + /// ADL_PMLOG_CPU_POWER. /// cpu = 0x0008, + /// + /// Total board power (ADL_PMLOG_BOARD_POWER). + /// + board = 0x0010, + /// /// Represents all possible sensor sources. /// diff --git a/power_overwhelming/src/adl_sensor.cpp b/power_overwhelming/src/adl_sensor.cpp index 10c3d24e..3ca56442 100644 --- a/power_overwhelming/src/adl_sensor.cpp +++ b/power_overwhelming/src/adl_sensor.cpp @@ -1,5 +1,5 @@ // -// Copyright © 2021 Visualisierungsinstitut der Universität Stuttgart. Alle Rechte vorbehalten. +// Copyright © 2021 - 2023 Visualisierungsinstitut der Universität Stuttgart. Alle Rechte vorbehalten. // // Christoph Müller @@ -35,6 +35,8 @@ namespace detail { template std::size_t for_adapter(TIterator oit, adl_scope& scope, const AdapterInfo& adapter, const adl_sensor_source source) { +#define _PWROWG_ENABLED(haystack, needle) ((haystack & needle) == needle) + int isActive = 0; std::size_t retval = 0; ADLPMLogSupportInfo supportInfo; @@ -60,7 +62,7 @@ namespace detail { } // Now, check all of the supported sensor sources. - if ((source & adl_sensor_source::asic) == adl_sensor_source::asic) { + if (_PWROWG_ENABLED(source, adl_sensor_source::asic)) { auto source = adl_sensor_source::asic; auto ids = detail::adl_sensor_impl::get_sensor_ids(source, supportInfo); @@ -73,7 +75,7 @@ namespace detail { } } - if ((source & adl_sensor_source::cpu) == adl_sensor_source::cpu) { + if (_PWROWG_ENABLED(source, adl_sensor_source::cpu)) { auto source = adl_sensor_source::cpu; auto ids = detail::adl_sensor_impl::get_sensor_ids(source, supportInfo); @@ -86,8 +88,7 @@ namespace detail { } } - if ((source & adl_sensor_source::graphics) - == adl_sensor_source::graphics) { + if (_PWROWG_ENABLED(source, adl_sensor_source::graphics)) { auto source = adl_sensor_source::graphics; auto ids = detail::adl_sensor_impl::get_sensor_ids(source, supportInfo); @@ -100,7 +101,7 @@ namespace detail { } } - if ((source & adl_sensor_source::soc) == adl_sensor_source::soc) { + if (_PWROWG_ENABLED(source, adl_sensor_source::soc)) { auto source = adl_sensor_source::soc; auto ids = detail::adl_sensor_impl::get_sensor_ids(source, supportInfo); @@ -113,7 +114,21 @@ namespace detail { } } + if (_PWROWG_ENABLED(source, adl_sensor_source::board)) { + auto source = adl_sensor_source::board; + auto ids = detail::adl_sensor_impl::get_sensor_ids(source, + supportInfo); + + if (!ids.empty()) { + auto impl = new detail::adl_sensor_impl(adapter); + impl->configure_source(source, std::move(ids)); + *oit++ = adl_sensor(std::move(impl)); + ++retval; + } + } + return retval; +#undef _PWROWG_ENABLED } /// @@ -236,7 +251,7 @@ visus::power_overwhelming::adl_sensor::from_index(_In_ const int index, throw adl_exception(status); } - throw "TODO"; + throw "TODO: Implement retrieval from index."; return retval; } diff --git a/power_overwhelming/src/adl_sensor_impl.cpp b/power_overwhelming/src/adl_sensor_impl.cpp index 99fb14f3..94479395 100644 --- a/power_overwhelming/src/adl_sensor_impl.cpp +++ b/power_overwhelming/src/adl_sensor_impl.cpp @@ -96,11 +96,17 @@ visus::power_overwhelming::detail::adl_sensor_impl::get_sensor_ids( const adl_sensor_source source) { switch (source) { case adl_sensor_source::asic: - return std::vector { ADL_PMLOG_ASIC_POWER }; + // HAZARD: We assume that only one of these can be set at the + // same time, but we cannot prove this from the docs. + return std::vector { ADL_PMLOG_ASIC_POWER, + ADL_PMLOG_SSPAIRED_ASICPOWER }; case adl_sensor_source::cpu: return std::vector { ADL_PMLOG_CPU_POWER }; + case adl_sensor_source::board: + return std::vector { ADL_PMLOG_BOARD_POWER }; + case adl_sensor_source::graphics: return std::vector { ADL_PMLOG_GFX_VOLTAGE, ADL_PMLOG_GFX_CURRENT, ADL_PMLOG_GFX_POWER }; @@ -180,9 +186,11 @@ bool visus::power_overwhelming::detail::adl_sensor_impl::is_power( const ADL_PMLOG_SENSORS id) { switch (id) { case ADL_PMLOG_ASIC_POWER: + case ADL_PMLOG_BOARD_POWER: case ADL_PMLOG_CPU_POWER: case ADL_PMLOG_GFX_POWER: case ADL_PMLOG_SOC_POWER: + case ADL_PMLOG_SSPAIRED_ASICPOWER: return true; default: @@ -285,6 +293,11 @@ void visus::power_overwhelming::detail::adl_sensor_impl::configure_source( + L"/" + std::to_wstring(this->adapter_index); break; + case adl_sensor_source::board: + this->sensor_name = L"ADL/BOARD/" + this->device_name + + L"/" + std::to_wstring(this->adapter_index); + break; + case adl_sensor_source::cpu: this->sensor_name = L"ADL/CPU/" + this->device_name + L"/" + std::to_wstring(this->adapter_index); diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index 20b9f170..496deeb6 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -12,7 +12,7 @@ mark_as_advanced(FORCE # AMD Display Library (this is a bit hacky ...) FetchContent_Declare(adl - URL "https://github.com/GPUOpen-LibrariesAndSDKs/display-library/archive/17.0.tar.gz" + URL "https://github.com/GPUOpen-LibrariesAndSDKs/display-library/archive/17.1.tar.gz" ) FetchContent_MakeAvailable(adl) add_library(adl INTERFACE IMPORTED GLOBAL)