Added rocm-smi-lib calls with updated interface

Change-Id: I62b59dca5135ec012f11b249c78b04e5e8e2dd9a
This commit is contained in:
Chris Freehill
2018-04-27 14:08:10 -05:00
parent b37027e347
commit 11e13704ea
5 changed files with 104 additions and 116 deletions
+6 -38
View File
@@ -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<amd::smi::Device> &d,
void *p) {
std::string val_str;
assert(p != nullptr);
std::vector<std::shared_ptr<amd::smi::Device>> *device_list =
reinterpret_cast<std::vector<std::shared_ptr<amd::smi::Device>> *>(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<void *>(&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();
}
+1 -3
View File
@@ -103,9 +103,7 @@ void TestBase::Close(void) {
if (monitor_verbosity() > 0) {
#if ENABLE_SMI
DumpMonitorInfo(this);
#endif
DumpMonitorInfo();
}
err = rocrtst::CommonCleanUp(this);
+2 -16
View File
@@ -50,9 +50,7 @@
#include <vector>
#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<std::shared_ptr<amd::smi::Device>> *m) {
monitor_devices_ = m;
}
std::vector<std::shared_ptr<amd::smi::Device>> *
monitor_devices(void) const {
return monitor_devices_;
}
#endif
private:
std::string description_;
#if ENABLE_SMI
std::vector<std::shared_ptr<amd::smi::Device>> *monitor_devices_;
#endif
};
#endif // ROCRTST_SUITES_TEST_COMMON_TEST_BASE_H_
+93 -50
View File
@@ -49,9 +49,11 @@
#include <iostream>
#include <string>
#include <sstream>
#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<typename T>
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<std::string> 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<float>(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<float>(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<float>(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
+2 -9
View File
@@ -48,22 +48,15 @@
#include <memory>
#include <vector>
#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<std::shared_ptr<amd::smi::Device>> 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_