Add support for new performance levels

Also added tests for new performance levels and clean up some
formatting/style issues.


[ROCm/rocm_smi_lib commit: 767fa53d8c]
Tento commit je obsažen v:
Chris Freehill
2018-10-25 14:13:55 -05:00
rodič 71d80e88c2
revize cf2b565985
13 změnil soubory, kde provedl 122 přidání a 69 odebrání
+17 -10
Zobrazit soubor
@@ -42,8 +42,8 @@
* DEALINGS WITH THE SOFTWARE.
*
*/
#ifndef ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_H_
#define ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_H_
#ifndef INCLUDE_ROCM_SMI_ROCM_SMI_H_
#define INCLUDE_ROCM_SMI_ROCM_SMI_H_
#ifdef __cplusplus
extern "C" {
@@ -94,14 +94,21 @@ typedef enum {
RSMI_DEV_PERF_LEVEL_AUTO = 0, //!< Performance level is "auto"
RSMI_DEV_PERF_LEVEL_FIRST = RSMI_DEV_PERF_LEVEL_AUTO,
RSMI_DEV_PERF_LEVEL_LOW, //!< Keep PowerPlay levels "low",
//!< regardless of workload
RSMI_DEV_PERF_LEVEL_HIGH, //!< Keep PowerPlay levels "high",
//!< regardless of workload
RSMI_DEV_PERF_LEVEL_MANUAL, //!< Only use values defined by manually
//!< setting the RSMI_CLK_TYPE_SYS speed
RSMI_DEV_PERF_LEVEL_LOW, //!< Keep PowerPlay levels "low",
//!< regardless of workload
RSMI_DEV_PERF_LEVEL_HIGH, //!< Keep PowerPlay levels "high",
//!< regardless of workload
RSMI_DEV_PERF_LEVEL_MANUAL, //!< Only use values defined by manually
//!< setting the RSMI_CLK_TYPE_SYS speed
RSMI_DEV_PERF_LEVEL_STABLE_STD, //!< Stable power state with profiling
//!< clocks
RSMI_DEV_PERF_LEVEL_STABLE_PEAK, //!< Stable power state with peak clocks
RSMI_DEV_PERF_LEVEL_STABLE_MIN_MCLK, //!< Stable power state with minimum
//!< memory clock
RSMI_DEV_PERF_LEVEL_STABLE_MIN_SCLK, //!< Stable power state with minimum
//!< system clock
RSMI_DEV_PERF_LEVEL_LAST = RSMI_DEV_PERF_LEVEL_MANUAL,
RSMI_DEV_PERF_LEVEL_LAST = RSMI_DEV_PERF_LEVEL_STABLE_MIN_SCLK,
RSMI_DEV_PERF_LEVEL_UNKNOWN = 0x100 //!< Unknown performance level
} rsmi_dev_perf_level;
@@ -762,4 +769,4 @@ rsmi_status_string(rsmi_status_t status, const char **status_string);
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_H_
#endif // INCLUDE_ROCM_SMI_ROCM_SMI_H_
+3 -3
Zobrazit soubor
@@ -42,8 +42,8 @@
* DEALINGS WITH THE SOFTWARE.
*
*/
#ifndef ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_COMMON_H_
#define ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_COMMON_H_
#ifndef INCLUDE_ROCM_SMI_ROCM_SMI_COMMON_H_
#define INCLUDE_ROCM_SMI_ROCM_SMI_COMMON_H_
#define DBG_FILE_ERROR(STR) \
if (env_->debug_output_bitfield & RSMI_DEBUG_SYSFS_FILE_PATHS) { \
@@ -60,4 +60,4 @@ struct RocmSMI_env_vars {
uint32_t debug_output_bitfield;
};
#endif // ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_COMMON_H_
#endif // INCLUDE_ROCM_SMI_ROCM_SMI_COMMON_H_
+5 -3
Zobrazit soubor
@@ -42,8 +42,8 @@
* DEALINGS WITH THE SOFTWARE.
*
*/
#ifndef ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_DEVICE_H_
#define ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_DEVICE_H_
#ifndef INCLUDE_ROCM_SMI_ROCM_SMI_DEVICE_H_
#define INCLUDE_ROCM_SMI_ROCM_SMI_DEVICE_H_
#include <string>
#include <memory>
#include <utility>
@@ -53,6 +53,7 @@
#include "rocm_smi/rocm_smi_monitor.h"
#include "rocm_smi/rocm_smi_power_mon.h"
#include "rocm_smi/rocm_smi_common.h"
#include "rocm_smi/rocm_smi.h"
namespace amd {
namespace smi {
@@ -84,6 +85,7 @@ class Device {
int writeDevInfo(DevInfoTypes type, std::string val);
uint32_t index(void) const {return index_;}
void set_index(uint32_t index) {index_ = index;}
static rsmi_dev_perf_level perfLvlStrToEnum(std::string s);
private:
std::shared_ptr<Monitor> monitor_;
@@ -100,4 +102,4 @@ class Device {
} // namespace smi
} // namespace amd
#endif // ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_DEVICE_H_
#endif // INCLUDE_ROCM_SMI_ROCM_SMI_DEVICE_H_
+3 -3
Zobrazit soubor
@@ -42,8 +42,8 @@
* DEALINGS WITH THE SOFTWARE.
*
*/
#ifndef ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_MAIN_H_
#define ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_MAIN_H_
#ifndef INCLUDE_ROCM_SMI_ROCM_SMI_MAIN_H_
#define INCLUDE_ROCM_SMI_ROCM_SMI_MAIN_H_
#include <vector>
#include <memory>
@@ -95,4 +95,4 @@ class RocmSMI {
} // namespace smi
} // namespace amd
#endif // ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_MAIN_H_
#endif // INCLUDE_ROCM_SMI_ROCM_SMI_MAIN_H_
+3 -3
Zobrazit soubor
@@ -42,8 +42,8 @@
* DEALINGS WITH THE SOFTWARE.
*
*/
#ifndef ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_MONITOR_H_
#define ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_MONITOR_H_
#ifndef INCLUDE_ROCM_SMI_ROCM_SMI_MONITOR_H_
#define INCLUDE_ROCM_SMI_ROCM_SMI_MONITOR_H_
#include <string>
#include <cstdint>
@@ -97,4 +97,4 @@ class Monitor {
} // namespace smi
} // namespace amd
#endif // ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_MONITOR_H_
#endif // INCLUDE_ROCM_SMI_ROCM_SMI_MONITOR_H_
+3 -3
Zobrazit soubor
@@ -42,8 +42,8 @@
* DEALINGS WITH THE SOFTWARE.
*
*/
#ifndef ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_POWER_MON_H_
#define ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_POWER_MON_H_
#ifndef INCLUDE_ROCM_SMI_ROCM_SMI_POWER_MON_H_
#define INCLUDE_ROCM_SMI_ROCM_SMI_POWER_MON_H_
#include <string>
#include <cstdint>
@@ -78,4 +78,4 @@ class PowerMon {
} // namespace smi
} // namespace amd
#endif // ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_POWER_MON_H_
#endif // INCLUDE_ROCM_SMI_ROCM_SMI_POWER_MON_H_
+3 -3
Zobrazit soubor
@@ -42,8 +42,8 @@
* DEALINGS WITH THE SOFTWARE.
*
*/
#ifndef ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_UTILS_H_
#define ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_UTILS_H_
#ifndef INCLUDE_ROCM_SMI_ROCM_SMI_UTILS_H_
#define INCLUDE_ROCM_SMI_ROCM_SMI_UTILS_H_
#include <string>
#include <cstdint>
@@ -68,4 +68,4 @@ int WriteSysfsStr(std::string path, std::string val);
} // namespace smi
} // namespace amd
#endif // ROCM_SMI_LIB_INCLUDE_ROCM_SMI_ROCM_SMI_UTILS_H_
#endif // INCLUDE_ROCM_SMI_ROCM_SMI_UTILS_H_
+2 -11
Zobrazit soubor
@@ -364,17 +364,8 @@ rsmi_dev_perf_level_get(uint32_t dv_ind, rsmi_dev_perf_level *perf) {
return ret;
}
if (val_str == "auto") {
*perf = RSMI_DEV_PERF_LEVEL_AUTO;
} else if (val_str == "low") {
*perf = RSMI_DEV_PERF_LEVEL_LOW;
} else if (val_str == "high") {
*perf = RSMI_DEV_PERF_LEVEL_HIGH;
} else if (val_str == "manual") {
*perf = RSMI_DEV_PERF_LEVEL_MANUAL;
} else {
*perf = RSMI_DEV_PERF_LEVEL_UNKNOWN;
}
*perf = amd::smi::Device::perfLvlStrToEnum(val_str);
return ret;
CATCH
}
+22 -1
Zobrazit soubor
@@ -69,6 +69,10 @@ static const char *kDevPerfLevelAutoStr = "auto";
static const char *kDevPerfLevelLowStr = "low";
static const char *kDevPerfLevelHighStr = "high";
static const char *kDevPerfLevelManualStr = "manual";
static const char *kDevPerfLevelStandardStr = "profile_standard";
static const char *kDevPerfLevelMinMClkStr = "profile_min_mclk";
static const char *kDevPerfLevelMinSClkStr = "profile_min_sclk";
static const char *kDevPerfLevelPeakStr = "profile_peak";
static const char *kDevPerfLevelUnknownStr = "unknown";
static const std::map<DevInfoTypes, const char *> kDevAttribNameMap = {
@@ -85,6 +89,11 @@ static const std::map<rsmi_dev_perf_level, const char *> kDevPerfLvlMap = {
{RSMI_DEV_PERF_LEVEL_LOW, kDevPerfLevelLowStr},
{RSMI_DEV_PERF_LEVEL_HIGH, kDevPerfLevelHighStr},
{RSMI_DEV_PERF_LEVEL_MANUAL, kDevPerfLevelManualStr},
{RSMI_DEV_PERF_LEVEL_STABLE_STD, kDevPerfLevelStandardStr},
{RSMI_DEV_PERF_LEVEL_STABLE_MIN_MCLK, kDevPerfLevelMinMClkStr},
{RSMI_DEV_PERF_LEVEL_STABLE_MIN_SCLK, kDevPerfLevelMinSClkStr},
{RSMI_DEV_PERF_LEVEL_STABLE_PEAK, kDevPerfLevelPeakStr},
{RSMI_DEV_PERF_LEVEL_UNKNOWN, kDevPerfLevelUnknownStr},
};
@@ -157,6 +166,18 @@ int Device::writeDevInfoStr(DevInfoTypes type, std::string valStr) {
return 0;
}
rsmi_dev_perf_level Device::perfLvlStrToEnum(std::string s) {
rsmi_dev_perf_level pl;
for (pl = RSMI_DEV_PERF_LEVEL_FIRST; pl <= RSMI_DEV_PERF_LEVEL_LAST; ) {
if (s == kDevPerfLvlMap.at(pl)) {
return pl;
}
pl = static_cast<rsmi_dev_perf_level>(static_cast<uint32_t>(pl) + 1);
}
return RSMI_DEV_PERF_LEVEL_UNKNOWN;
}
int Device::writeDevInfo(DevInfoTypes type, uint64_t val) {
switch (type) {
// The caller is responsible for making sure "val" is within a valid range
@@ -165,7 +186,7 @@ int Device::writeDevInfo(DevInfoTypes type, uint64_t val) {
return writeDevInfoStr(type, std::to_string(val));
break;
case kDevPerfLevel: // string: "auto", "low", "high", "manual"
case kDevPerfLevel: // string: "auto", "low", "high", "manual", ...
return writeDevInfoStr(type,
kDevPerfLvlMap.at((rsmi_dev_perf_level)val));
break;
-1
Zobrazit soubor
@@ -198,7 +198,6 @@ aux_source_directory(${RSMITST_ROOT} rsmitstSources)
# Header file include path
include_directories(${RSMI_INC_DIR})
include_directories(${RSMITST_ROOT})
include_directories(${RSMITST_ROOT}/..)
include_directories(${RSMITST_ROOT}/gtest/include)
+55 -22
Zobrazit soubor
@@ -48,9 +48,10 @@
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include "rocm_smi/rocm_smi.h"
#include "functional/rsmi_sanity.h"
#include "rocm_smi_test/functional/rsmi_sanity.h"
#include "gtest/gtest.h"
static const uint32_t kNumBufferElements = 256;
@@ -86,7 +87,7 @@ static uint32_t gVerbosity = 3;
} \
}
#define ALT_ASSERT_EQ(A,B) { \
#define ALT_ASSERT_EQ(A, B) { \
if ((A) != (B)) { \
std::cout << "ASSERT failure: Expected " << #A << " == " << #B << \
", but got " << #A << " = " << (A) << ", and " << #B << " = " << \
@@ -334,6 +335,21 @@ static rsmi_status_t test_set_fan_speed(uint32_t dv_ind) {
return ret;
}
static const std::map<rsmi_dev_perf_level, const char *> kDevPerfLvlNameMap = {
{RSMI_DEV_PERF_LEVEL_AUTO, "RSMI_DEV_PERF_LEVEL_AUTO"},
{RSMI_DEV_PERF_LEVEL_LOW, "RSMI_DEV_PERF_LEVEL_LOW"},
{RSMI_DEV_PERF_LEVEL_HIGH, "RSMI_DEV_PERF_LEVEL_HIGH"},
{RSMI_DEV_PERF_LEVEL_MANUAL, "RSMI_DEV_PERF_LEVEL_MANUAL"},
{RSMI_DEV_PERF_LEVEL_STABLE_STD, "RSMI_DEV_PERF_LEVEL_STABLE_STD"},
{RSMI_DEV_PERF_LEVEL_STABLE_MIN_MCLK,
"RSMI_DEV_PERF_LEVEL_STABLE_MIN_MCLK"},
{RSMI_DEV_PERF_LEVEL_STABLE_MIN_SCLK,
"RSMI_DEV_PERF_LEVEL_STABLE_MIN_SCLK"},
{RSMI_DEV_PERF_LEVEL_STABLE_PEAK, "RSMI_DEV_PERF_LEVEL_STABLE_PEAK"},
{RSMI_DEV_PERF_LEVEL_UNKNOWN, "RSMI_DEV_PERF_LEVEL_UNKNOWN"},
};
static rsmi_status_t test_set_perf_level(uint32_t dv_ind) {
rsmi_status_t ret;
@@ -345,30 +361,41 @@ static rsmi_status_t test_set_perf_level(uint32_t dv_ind) {
CHK_ERR_RET(ret)
IF_VERB(STANDARD) {
std::cout << "\t**Original Perf Level:" << (uint32_t)orig_pfl << std::endl;
std::cout << "\t**Original Perf Level:" <<
kDevPerfLvlNameMap.at(orig_pfl) << std::endl;
}
pfl = (rsmi_dev_perf_level)((orig_pfl + 1) % (RSMI_DEV_PERF_LEVEL_LAST + 1));
uint32_t pfl_i = static_cast<uint32_t>(RSMI_DEV_PERF_LEVEL_FIRST);
for (; pfl_i <= static_cast<uint32_t>(RSMI_DEV_PERF_LEVEL_LAST); pfl_i++) {
if (pfl_i == static_cast<uint32_t>(orig_pfl)) {
continue;
}
IF_VERB(STANDARD) {
std::cout << "Set Performance Level to " << (uint32_t)pfl << " ..." <<
std::endl;
}
ret = rsmi_dev_perf_level_set(dv_ind, pfl);
CHK_ERR_RET(ret)
ret = rsmi_dev_perf_level_get(dv_ind, &pfl);
CHK_ERR_RET(ret)
IF_VERB(STANDARD) {
std::cout << "\t**New Perf Level:" << (uint32_t)pfl << std::endl;
std::cout << "Reset Perf level to " << orig_pfl << " ..." << std::endl;
IF_VERB(STANDARD) {
std::cout << "Set Performance Level to " <<
kDevPerfLvlNameMap.at(static_cast<rsmi_dev_perf_level>(pfl_i)) <<
" ..." << std::endl;
}
ret = rsmi_dev_perf_level_set(dv_ind,
static_cast<rsmi_dev_perf_level>(pfl_i));
CHK_ERR_RET(ret)
ret = rsmi_dev_perf_level_get(dv_ind, &pfl);
CHK_ERR_RET(ret)
IF_VERB(STANDARD) {
std::cout << "\t**New Perf Level:" << kDevPerfLvlNameMap.at(pfl) <<
std::endl;
}
}
std::cout << "Reset Perf level to " << kDevPerfLvlNameMap.at(orig_pfl) <<
" ..." << std::endl;
ret = rsmi_dev_perf_level_set(dv_ind, orig_pfl);
CHK_ERR_RET(ret)
ret = rsmi_dev_perf_level_get(dv_ind, &pfl);
CHK_ERR_RET(ret)
IF_VERB(STANDARD) {
std::cout << "\t**New Perf Level:" << (uint32_t)pfl << std::endl;
std::cout << "\t**New Perf Level:" << kDevPerfLvlNameMap.at(pfl) <<
std::endl;
}
return ret;
}
@@ -553,14 +580,20 @@ void TestSanity::Run(void) {
print_temp_metric(RSMI_TEMP_CURRENT, "Current Temp.");
print_temp_metric(RSMI_TEMP_MAX, "Temperature max value");
print_temp_metric(RSMI_TEMP_MIN, "Temperature min value");
print_temp_metric(RSMI_TEMP_MAX_HYST, "Temperature hysteresis value for max limit");
print_temp_metric(RSMI_TEMP_MIN_HYST, "Temperature hysteresis value for min limit");
print_temp_metric(RSMI_TEMP_MAX_HYST,
"Temperature hysteresis value for max limit");
print_temp_metric(RSMI_TEMP_MIN_HYST,
"Temperature hysteresis value for min limit");
print_temp_metric(RSMI_TEMP_CRITICAL, "Temperature critical max value");
print_temp_metric(RSMI_TEMP_CRITICAL_HYST, "Temperature hysteresis value for critical limit");
print_temp_metric(RSMI_TEMP_EMERGENCY, "Temperature emergency max value");
print_temp_metric(RSMI_TEMP_EMERGENCY_HYST, "Temperature hysteresis value for emergency limit");
print_temp_metric(RSMI_TEMP_CRITICAL_HYST,
"Temperature hysteresis value for critical limit");
print_temp_metric(RSMI_TEMP_EMERGENCY,
"Temperature emergency max value");
print_temp_metric(RSMI_TEMP_EMERGENCY_HYST,
"Temperature hysteresis value for emergency limit");
print_temp_metric(RSMI_TEMP_CRIT_MIN, "Temperature critical min value");
print_temp_metric(RSMI_TEMP_CRIT_MIN_HYST, "Temperature hysteresis value for critical min value");
print_temp_metric(RSMI_TEMP_CRIT_MIN_HYST,
"Temperature hysteresis value for critical min value");
print_temp_metric(RSMI_TEMP_OFFSET, "Temperature offset");
print_temp_metric(RSMI_TEMP_LOWEST, "Historical minimum temperature");
print_temp_metric(RSMI_TEMP_HIGHEST, "Historical maximum temperature");
+3 -3
Zobrazit soubor
@@ -42,8 +42,8 @@
* DEALINGS WITH THE SOFTWARE.
*
*/
#ifndef ROCM_SMI_LIB_TESTS_ROCM_SMI_TEST_TEST_BASE_H_
#define ROCM_SMI_LIB_TESTS_ROCM_SMI_TEST_TEST_BASE_H_
#ifndef TESTS_ROCM_SMI_TEST_TEST_BASE_H_
#define TESTS_ROCM_SMI_TEST_TEST_BASE_H_
#include <string>
@@ -102,4 +102,4 @@ class TestBase {
uint32_t verbosity_; ///< How much additional output to produce
};
#endif // ROCM_SMI_LIB_TESTS_ROCM_SMI_TEST_TEST_BASE_H_
#endif // TESTS_ROCM_SMI_TEST_TEST_BASE_H_
+3 -3
Zobrazit soubor
@@ -43,8 +43,8 @@
*
*/
#ifndef ROCM_SMI_LIB_TESTS_ROCM_SMI_TEST_TEST_COMMON_H_
#define ROCM_SMI_LIB_TESTS_ROCM_SMI_TEST_TEST_COMMON_H_
#ifndef TESTS_ROCM_SMI_TEST_TEST_COMMON_H_
#define TESTS_ROCM_SMI_TEST_TEST_COMMON_H_
#include <memory>
#include <vector>
@@ -63,4 +63,4 @@ uint32_t ProcessCmdline(RSMITstGlobals* test, int arg_cnt, char** arg_list);
void DumpMonitorInfo(const TestBase *test);
#endif
#endif // ROCM_SMI_LIB_TESTS_ROCM_SMI_TEST_TEST_COMMON_H_
#endif // TESTS_ROCM_SMI_TEST_TEST_COMMON_H_