From 0d9e71a63aa8fb2686b22b6931b8efce14df5dde Mon Sep 17 00:00:00 2001 From: Chris Freehill Date: Sat, 7 Apr 2018 19:59:13 -0400 Subject: [PATCH] Revert "Re-enable rocm-smi with new c api" This reverts commit 2e81d33395869e7c058b9f293d31675c44ece102. Change-Id: I9866610597a6de97a3c06ef9646f0afc85f149f4 --- rocrtst/suites/test_common/main.cc | 44 ++++++- rocrtst/suites/test_common/test_base.cc | 4 +- rocrtst/suites/test_common/test_base.h | 18 ++- rocrtst/suites/test_common/test_common.cc | 142 ++++++++-------------- rocrtst/suites/test_common/test_common.h | 11 +- 5 files changed, 116 insertions(+), 103 deletions(-) diff --git a/rocrtst/suites/test_common/main.cc b/rocrtst/suites/test_common/main.cc index 83fa32e733..27aa7313d0 100755 --- a/rocrtst/suites/test_common/main.cc +++ b/rocrtst/suites/test_common/main.cc @@ -58,9 +58,28 @@ #include "suites/test_common/test_case_template.h" #include "suites/test_common/main.h" #include "suites/test_common/test_common.h" + +#if ENABLE_SMI #include "rocm_smi/rocm_smi.h" +#endif static RocrTstGlobals *sRocrtstGlvalues = nullptr; +#if ENABLE_SMI +static bool GetMonitorDevices(const std::shared_ptr &d, + void *p) { + std::string val_str; + + assert(p != nullptr); + + std::vector> *device_list = + reinterpret_cast> *>(p); + + if (d->monitor() != nullptr) { + device_list->push_back(d); + } + return false; +} +#endif static void SetFlags(TestBase *test) { assert(sRocrtstGlvalues != nullptr); @@ -68,6 +87,9 @@ static void SetFlags(TestBase *test) { test->set_num_iteration(sRocrtstGlvalues->num_iterations); test->set_verbosity(sRocrtstGlvalues->verbosity); test->set_monitor_verbosity(sRocrtstGlvalues->monitor_verbosity); +#if ENABLE_SMI + test->set_monitor_devices(&sRocrtstGlvalues->monitor_devices); +#endif } @@ -192,12 +214,22 @@ int main(int argc, char** argv) { return 1; } sRocrtstGlvalues = &settings; - rsmi_status_t rsmi_ret = rsmi_init(0); - if (rsmi_ret != RSMI_STATUS_SUCCESS) { - std::cout << "Failed to initialize ROCm smi" << std::endl; - return 1; - } - DumpMonitorInfo(); +#if ENABLE_SMI + amd::smi::RocmSMI hw; + hw.DiscoverDevices(); + hw.IterateSMIDevices( + GetMonitorDevices, reinterpret_cast(&settings.monitor_devices)); + sRocrtstGlvalues = &settings; + + // Use this dummy test to get one output of monitors at the beginning + { + TestExample dummy; + dummy.set_monitor_devices(&sRocrtstGlvalues->monitor_devices); + + std::cout << "*** Initial Hardware Monitor Values:" << std::endl; + DumpMonitorInfo(&dummy); + } +#endif return RUN_ALL_TESTS(); } diff --git a/rocrtst/suites/test_common/test_base.cc b/rocrtst/suites/test_common/test_base.cc index ef3b5f6b18..0b2380caf1 100755 --- a/rocrtst/suites/test_common/test_base.cc +++ b/rocrtst/suites/test_common/test_base.cc @@ -103,7 +103,9 @@ void TestBase::Close(void) { if (monitor_verbosity() > 0) { - DumpMonitorInfo(); +#if ENABLE_SMI + DumpMonitorInfo(this); +#endif } err = rocrtst::CommonCleanUp(this); diff --git a/rocrtst/suites/test_common/test_base.h b/rocrtst/suites/test_common/test_base.h index dcb6677be9..05594128d6 100755 --- a/rocrtst/suites/test_common/test_base.h +++ b/rocrtst/suites/test_common/test_base.h @@ -50,7 +50,9 @@ #include #include "common/base_rocr.h" - +#if ENABLE_SMI +#include "rocm_smi/rocm_smi.h" +#endif class TestBase : public rocrtst::BaseRocR { public: TestBase(void); @@ -78,9 +80,21 @@ class TestBase : public rocrtst::BaseRocR { const std::string & description(void) const {return description_;} void set_description(std::string d); - +#if ENABLE_SMI + void set_monitor_devices( + std::vector> *m) { + monitor_devices_ = m; + } + std::vector> * + monitor_devices(void) const { + return monitor_devices_; + } +#endif private: std::string description_; +#if ENABLE_SMI + std::vector> *monitor_devices_; +#endif }; #endif // ROCRTST_SUITES_TEST_COMMON_TEST_BASE_H_ diff --git a/rocrtst/suites/test_common/test_common.cc b/rocrtst/suites/test_common/test_common.cc index e0af86263e..3f769abc80 100755 --- a/rocrtst/suites/test_common/test_common.cc +++ b/rocrtst/suites/test_common/test_common.cc @@ -49,11 +49,9 @@ #include #include -#include #include "suites/test_common/test_base.h" #include "suites/test_common/test_common.h" -#include "rocm_smi/rocm_smi.h" static const struct option long_options[] = { {"iterations", required_argument, nullptr, 'i'}, @@ -122,28 +120,17 @@ uint32_t ProcessCmdline(RocrTstGlobals* test, int arg_cnt, char** arg_list) { } return 0; } - -template -static std::string IntegerToString(T intVal, bool hex = true) { - std::stringstream stream; - - if (hex) { - stream << "0x" << std::hex << intVal; - } else { - stream << std::dec << intVal; - } - return stream.str(); -} - -int DumpMonitorInfo() { +#if ENABLE_SMI +void DumpMonitorInfo(const TestBase *test) { int ret = 0; - uint64_t value_u64; - int64_t value_i64; + uint32_t value; + uint32_t value2; std::string val_str; std::vector val_vec; - rsmi_status_t rsmi_ret; - int dump_ret = 0; + assert(test != nullptr); + assert(test->monitor_devices() != nullptr && + "Make sure to call test->set_monitor_devices()"); auto print_attr_label = [&](std::string attrib) -> bool { std::cout << "\t** " << attrib; @@ -159,91 +146,62 @@ int DumpMonitorInfo() { std::cout << "\t***** Hardware monitor values *****" << std::endl; std::cout << delim << std::endl; std::cout.setf(std::ios::dec, std::ios::basefield); - - uint32_t num_mon_devices; - rsmi_ret = rsmi_num_monitor_devices(&num_mon_devices); - if (rsmi_ret != RSMI_STATUS_SUCCESS) { - std::cout << "rsmi_num_monitor_device() returned" << rsmi_ret << std::endl; - return 1; - } - - for (uint32_t dindx = 0; dindx < num_mon_devices; ++dindx) { - auto print_frequencies = [&](rsmi_frequencies *freqs, std::string label) { + for (auto dev : *test->monitor_devices()) { + auto print_vector = + [&](amd::smi::DevInfoTypes type, std::string label) { + ret = dev->readDevInfo(type, &val_vec); if (print_attr_label(label)) { - for (uint32_t i = 0; i < freqs->num_supported; ++i) { - std::cout << "\t** " << i << ": " << - freqs->frequency[i]/1000000 << "Mhz"; - if (i == freqs->current) { - std::cout << " *"; - } - - std::cout << std::endl; + for (auto vs : val_vec) { + std::cout << "\t** " << vs << std::endl; } + val_vec.clear(); } }; - auto print_val_str = [&](std::string val, std::string label) { + auto print_val_str = + [&](amd::smi::DevInfoTypes type, std::string label) { + ret = dev->readDevInfo(type, &val_str); + std::cout << "\t** " << label; - if (ret != RSMI_STATUS_SUCCESS) { - std::cout << "not available; rsmi call returned" << rsmi_ret; - dump_ret = 1; + if (ret == -1) { + std::cout << "not available"; } else { - std::cout << val; + std::cout << val_str; } std::cout << std:: endl; }; - rsmi_ret = rsmi_dev_get_id(dindx, &value_u64); - print_val_str(IntegerToString(value_u64), "Device ID: "); + print_val_str(amd::smi::kDevDevID, "Device ID: "); + print_val_str(amd::smi::kDevPerfLevel, "Performance Level: "); + print_val_str(amd::smi::kDevOverDriveLevel, "OverDrive Level: "); + print_vector(amd::smi::kDevGPUMClk, + "Supported GPU Memory clock frequencies:\n"); + print_vector(amd::smi::kDevGPUSClk, + "Supported GPU clock frequencies:\n"); - rsmi_dev_perf_level perf; - std::string perf_str; - rsmi_ret = rsmi_dev_get_perf_level(dindx, &perf); - switch (perf) { - case RSMI_DEV_PERF_LEVEL_AUTO: - perf_str = "auto"; - break; - default: - perf_str = "unknown"; + if (dev->monitor() != nullptr) { + ret = dev->monitor()->readMonitor(amd::smi::kMonName, &val_str); + if (print_attr_label("Monitor name: ")) { + std::cout << val_str << std::endl; + } + + ret = dev->monitor()->readMonitor(amd::smi::kMonTemp, &value); + if (print_attr_label("Temperature: ")) { + std::cout << static_cast(value)/1000.0 << "C" << std::endl; + } + + std::cout.setf(std::ios::dec, std::ios::basefield); + + ret = dev->monitor()->readMonitor(amd::smi::kMonMaxFanSpeed, &value); + if (ret == 0) { + ret = dev->monitor()->readMonitor(amd::smi::kMonFanSpeed, &value2); + } + if (print_attr_label("Current Fan Speed: ")) { + std::cout << value2/static_cast(value) * 100 << "% (" << + value2 << "/" << value << ")" << std::endl; + } } - print_val_str(perf_str, "Performance Level: "); - - rsmi_ret = rsmi_dev_get_overdrive_level(dindx, &value_u64); - - print_val_str(IntegerToString(value_u64, false) + "%", "OverDrive Level: "); - - rsmi_frequencies freqs; - rsmi_ret = rsmi_dev_get_gpu_sys_freq(dindx, &freqs); - print_frequencies(&freqs, "Supported GPU clock frequencies:\n"); - - rsmi_ret = rsmi_dev_get_gpu_mem_freq(dindx, &freqs); - print_frequencies(&freqs, "Supported GPU Memory clock frequencies:\n"); - - - char mon_name[32]; - rsmi_ret = rsmi_dev_mon_get_name(dindx, mon_name, 32); - print_val_str(mon_name, "Monitor name: "); - - rsmi_ret = rsmi_dev_mon_get_temp(dindx, &value_i64); - print_val_str(IntegerToString(value_i64/1000, false) + "C", - "Temperature: "); - - rsmi_ret = rsmi_dev_mon_get_fan_speed(dindx, &value_i64); - if (ret != RSMI_STATUS_SUCCESS) { - std::cout << "not available; rsmi call returned" << rsmi_ret; - dump_ret = 1; - } - rsmi_ret = rsmi_dev_mon_get_max_fan_speed(dindx, &value_u64); - if (ret != RSMI_STATUS_SUCCESS) { - std::cout << "not available; rsmi call returned" << rsmi_ret; - dump_ret = 1; - } - if (print_attr_label("Current Fan Speed: ")) { - std::cout << static_cast(value_i64)/value_u64 * 100 << "% (" << - value_i64 << "/" << value_u64 << ")" << std::endl; - } - std::cout << "\t=======" << std::endl; } std::cout << delim << std::endl; - return dump_ret; } +#endif \ No newline at end of file diff --git a/rocrtst/suites/test_common/test_common.h b/rocrtst/suites/test_common/test_common.h index 3ceff89488..7edc02024b 100755 --- a/rocrtst/suites/test_common/test_common.h +++ b/rocrtst/suites/test_common/test_common.h @@ -48,15 +48,22 @@ #include #include - +#if ENABLE_SMI +#include "rocm_smi/rocm_smi.h" +#endif struct RocrTstGlobals { uint32_t verbosity; uint32_t monitor_verbosity; uint32_t num_iterations; +#if ENABLE_SMI + std::vector> monitor_devices; +#endif }; uint32_t ProcessCmdline(RocrTstGlobals* test, int arg_cnt, char** arg_list); -int DumpMonitorInfo(void); +#if ENABLE_SMI +void DumpMonitorInfo(const TestBase *test); +#endif #endif // ROCRTST_SUITES_TEST_COMMON_TEST_COMMON_H_