diff --git a/rocrtst/suites/test_common/main.cc b/rocrtst/suites/test_common/main.cc index 5034e4fdc9..8ee79e585f 100755 --- a/rocrtst/suites/test_common/main.cc +++ b/rocrtst/suites/test_common/main.cc @@ -61,28 +61,9 @@ #include "suites/test_common/test_common.h" #include "suites/functional/concurrent_init.h" #include "suites/functional/concurrent_init_shutdown.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); @@ -90,9 +71,6 @@ 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 } @@ -239,22 +217,12 @@ int main(int argc, char** argv) { return 1; } sRocrtstGlvalues = &settings; -#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); + 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; } -#endif + DumpMonitorInfo(); + return RUN_ALL_TESTS(); } diff --git a/rocrtst/suites/test_common/test_base.cc b/rocrtst/suites/test_common/test_base.cc index 0b2380caf1..ef3b5f6b18 100755 --- a/rocrtst/suites/test_common/test_base.cc +++ b/rocrtst/suites/test_common/test_base.cc @@ -103,9 +103,7 @@ void TestBase::Close(void) { if (monitor_verbosity() > 0) { -#if ENABLE_SMI - DumpMonitorInfo(this); -#endif + DumpMonitorInfo(); } err = rocrtst::CommonCleanUp(this); diff --git a/rocrtst/suites/test_common/test_base.h b/rocrtst/suites/test_common/test_base.h index 05594128d6..dcb6677be9 100755 --- a/rocrtst/suites/test_common/test_base.h +++ b/rocrtst/suites/test_common/test_base.h @@ -50,9 +50,7 @@ #include #include "common/base_rocr.h" -#if ENABLE_SMI -#include "rocm_smi/rocm_smi.h" -#endif + class TestBase : public rocrtst::BaseRocR { public: TestBase(void); @@ -80,21 +78,9 @@ 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 3f769abc80..02e2c8ac27 100755 --- a/rocrtst/suites/test_common/test_common.cc +++ b/rocrtst/suites/test_common/test_common.cc @@ -49,9 +49,11 @@ #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'}, @@ -120,17 +122,29 @@ uint32_t ProcessCmdline(RocrTstGlobals* test, int arg_cnt, char** arg_list) { } return 0; } -#if ENABLE_SMI -void DumpMonitorInfo(const TestBase *test) { + +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() { int ret = 0; - uint32_t value; - uint32_t value2; + uint64_t value_u64; + uint32_t value_u32; + int64_t value_i64; 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; @@ -146,62 +160,91 @@ void DumpMonitorInfo(const TestBase *test) { std::cout << "\t***** Hardware monitor values *****" << std::endl; std::cout << delim << std::endl; std::cout.setf(std::ios::dec, std::ios::basefield); - for (auto dev : *test->monitor_devices()) { - auto print_vector = - [&](amd::smi::DevInfoTypes type, std::string label) { - ret = dev->readDevInfo(type, &val_vec); + + 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) { if (print_attr_label(label)) { - for (auto vs : val_vec) { - std::cout << "\t** " << vs << std::endl; + 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; } - val_vec.clear(); } }; - auto print_val_str = - [&](amd::smi::DevInfoTypes type, std::string label) { - ret = dev->readDevInfo(type, &val_str); - + auto print_val_str = [&](std::string val, std::string label) { std::cout << "\t** " << label; - if (ret == -1) { - std::cout << "not available"; + if (ret != RSMI_STATUS_SUCCESS) { + std::cout << "not available; rsmi call returned" << rsmi_ret; + dump_ret = 1; } else { - std::cout << val_str; + std::cout << val; } std::cout << std:: endl; }; - 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_ret = rsmi_dev_id_get(dindx, &value_u64); + print_val_str(IntegerToString(value_u64), "Device ID: "); - 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; - } + rsmi_dev_perf_level perf; + std::string perf_str; + rsmi_ret = rsmi_dev_perf_level_get(dindx, &perf); + switch (perf) { + case RSMI_DEV_PERF_LEVEL_AUTO: + perf_str = "auto"; + break; + default: + perf_str = "unknown"; } + print_val_str(perf_str, "Performance Level: "); + + rsmi_ret = rsmi_dev_overdrive_level_get(dindx, &value_u32); + + print_val_str(IntegerToString(value_u32, false) + "%", "OverDrive Level: "); + + rsmi_frequencies freqs; + rsmi_ret = rsmi_dev_gpu_clk_freq_get(dindx, RSMI_CLK_TYPE_SYS, &freqs); + print_frequencies(&freqs, "Supported GPU clock frequencies:\n"); + + rsmi_ret = rsmi_dev_gpu_clk_freq_get(dindx, RSMI_CLK_TYPE_MEM, &freqs); + print_frequencies(&freqs, "Supported GPU Memory clock frequencies:\n"); + + + char mon_name[32]; + rsmi_ret = rsmi_dev_name_get(dindx, mon_name, 32); + print_val_str(mon_name, "Monitor name: "); + + rsmi_ret = rsmi_dev_temp_get(dindx, &value_i64); + print_val_str(IntegerToString(value_i64/1000, false) + "C", + "Temperature: "); + + rsmi_ret = rsmi_dev_fan_speed_get(dindx, &value_i64); + if (ret != RSMI_STATUS_SUCCESS) { + std::cout << "not available; rsmi call returned" << rsmi_ret; + dump_ret = 1; + } + rsmi_ret = rsmi_dev_fan_speed_max_get(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 7edc02024b..3ceff89488 100755 --- a/rocrtst/suites/test_common/test_common.h +++ b/rocrtst/suites/test_common/test_common.h @@ -48,22 +48,15 @@ #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); -#if ENABLE_SMI -void DumpMonitorInfo(const TestBase *test); -#endif +int DumpMonitorInfo(void); #endif // ROCRTST_SUITES_TEST_COMMON_TEST_COMMON_H_