[SWDEV-530035] Fix tests ran with partitioned configurations (CPX, DPX, QPX, etc.)

Changes: - Updates to APIs to handle null pointers or RSMI_STATUS_NOT_SUPPORTED
  - Fixes to tests to handle partitioned configurations correctly
  - Synced with latest AMD SMI API changes
Change-Id: I7a932f9336ef29ccb01d3b15e2101f6136b45720
This commit is contained in:
Charis Poag
2025-06-03 21:22:43 -05:00
committed by Poag, Charis
parent a156bfa4ae
commit 12b78439d2
17 changed files with 486 additions and 170 deletions
@@ -101,11 +101,12 @@ void TestGPUBusyRead::Run(void) {
err = rsmi_dev_busy_percent_get(i, &val_ui32);
if (err != RSMI_STATUS_SUCCESS) {
if (err == RSMI_STATUS_FILE_ERROR) {
if (err == RSMI_STATUS_FILE_ERROR || err == RSMI_STATUS_NOT_SUPPORTED) {
IF_VERB(STANDARD) {
std::cout << "\t**GPU Busy Percent: Not supported on this machine"
<< std::endl;
}
ASSERT_TRUE(err == RSMI_STATUS_FILE_ERROR || err == RSMI_STATUS_NOT_SUPPORTED);
} else {
CHK_ERR_ASRT(err)
}
@@ -127,7 +127,7 @@ void TestGpuMetricsRead::Run(void) {
IF_VERB(STANDARD) {
std::cout << "\t**" <<
"Not supported on this machine" << std::endl;
return;
continue;
}
}
} else {
+22 -10
View File
@@ -52,6 +52,7 @@
#include "rocm_smi/rocm_smi.h"
#include "rocm_smi_test/functional/mem_util_read.h"
#include "rocm_smi_test/test_common.h"
#include "rocm_smi/rocm_smi_utils.h"
TestMemUtilRead::TestMemUtilRead() : TestBase() {
set_title("Memory Utilization Read Test");
@@ -102,12 +103,14 @@ void TestMemUtilRead::Run(void) {
}
auto err_chk = [&](const char *str) {
IF_VERB(STANDARD) {
std::cout << "\t** " << str << std::endl;
}
if (err != RSMI_STATUS_SUCCESS) {
if (err == RSMI_STATUS_FILE_ERROR) {
IF_VERB(STANDARD) {
std::cout << "\t** " << str << ": Not supported on this machine"
<< std::endl;
}
if (err == RSMI_STATUS_FILE_ERROR ||
err == RSMI_STATUS_NOT_SUPPORTED) {
ASSERT_TRUE(err == RSMI_STATUS_NOT_SUPPORTED
|| err == RSMI_STATUS_FILE_ERROR);
} else {
CHK_ERR_ASRT(err)
}
@@ -133,23 +136,32 @@ void TestMemUtilRead::Run(void) {
mem_type <= RSMI_MEM_TYPE_LAST; ++mem_type) {
err = rsmi_dev_memory_total_get(i,
static_cast<rsmi_memory_type_t>(mem_type), &total);
err_chk("rsmi_dev_memory_total_get()");
amd::smi::getRSMIStatusString(err, false);
std::string mem_type_str =
kDevMemoryTypeNameMap.at(static_cast<rsmi_memory_type_t>(mem_type));
std::string input_str =
"rsmi_dev_memory_total_get(" + mem_type_str + "): "
+ amd::smi::getRSMIStatusString(err, false);
err_chk(input_str.c_str());
if (err != RSMI_STATUS_SUCCESS) {
return;
continue;
}
err = rsmi_dev_memory_usage_get(i,
static_cast<rsmi_memory_type_t>(mem_type), &usage);
err_chk("rsmi_dev_memory_usage_get()");
input_str =
"rsmi_dev_memory_usage_get(" + mem_type_str + "): "
+ amd::smi::getRSMIStatusString(err, false);
err_chk(input_str.c_str());
if (err != RSMI_STATUS_SUCCESS) {
return;
continue;
}
IF_VERB(STANDARD) {
std::cout << "\t**" <<
kDevMemoryTypeNameMap.at(static_cast<rsmi_memory_type_t>(mem_type))
<< " Calculated Utilization: " <<
(static_cast<float>(usage)*100)/total << "% ("<< usage <<
(static_cast<float>(usage)*100)/static_cast<float>(total) << "% (" << usage <<
"/" << total << ")" << std::endl;
}
}
@@ -111,6 +111,14 @@ void TestPerfDeterminism::Run(void) {
<< amd::smi::getRSMIStatusString(err, false)
<< "\n";
}
if (err == RSMI_STATUS_NOT_SUPPORTED) {
IF_VERB(STANDARD) {
std::cout << "\t**rsmi_dev_perf_level_set(i, RSMI_DEV_PERF_LEVEL_AUTO): "
<< "Not supported on this machine" << std::endl;
}
ASSERT_EQ(err, RSMI_STATUS_NOT_SUPPORTED);
continue;
}
CHK_ERR_ASRT(err)
ret = rsmi_dev_perf_level_get(i, &pfl);
IF_VERB(STANDARD) {
@@ -99,10 +99,15 @@ void TestPerfLevelRead::Run(void) {
PrintDeviceHeader(i);
err = rsmi_dev_perf_level_get(i, &pfl);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Performance Level:" << std::dec << (uint32_t)pfl <<
std::endl;
if (err == RSMI_STATUS_NOT_SUPPORTED) {
std::cout << "\t**Performance Level: Not Supported" << std::endl;
ASSERT_EQ(err, RSMI_STATUS_NOT_SUPPORTED);
} else {
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Performance Level:" << std::dec << (uint32_t)pfl
<< std::endl;
}
}
// Verify api support checking functionality is working
err = rsmi_dev_perf_level_get(i, nullptr);
@@ -102,11 +102,17 @@ void TestPerfLevelReadWrite::Run(void) {
PrintDeviceHeader(dv_ind);
ret = rsmi_dev_perf_level_get(dv_ind, &orig_pfl);
CHK_ERR_ASRT(ret)
if (ret == RSMI_STATUS_NOT_SUPPORTED) {
IF_VERB(STANDARD) {
std::cout << "\t**rsmi_dev_perf_level_get(): Not supported on this machine" << std::endl;
}
ASSERT_EQ(ret, RSMI_STATUS_NOT_SUPPORTED);
continue;
}
IF_VERB(STANDARD) {
std::cout << "\t**Original Perf Level:" <<
GetPerfLevelStr(orig_pfl) << std::endl;
std::cout << "\t**Original Perf Level:"
<< GetPerfLevelStr(orig_pfl) << std::endl;
}
uint32_t pfl_i = static_cast<uint32_t>(RSMI_DEV_PERF_LEVEL_FIRST);
@@ -103,18 +103,24 @@ void TestPowerCapReadWrite::Run(void) {
for (uint32_t dv_ind = 0; dv_ind < num_monitor_devs(); ++dv_ind) {
PrintDeviceHeader(dv_ind);
ret = rsmi_dev_power_cap_range_get(dv_ind, 0, &max, &min);
CHK_ERR_ASRT(ret)
// Verify api support checking functionality is working
ret = rsmi_dev_power_cap_range_get(dv_ind, 0, nullptr, nullptr);
ASSERT_EQ(ret, RSMI_STATUS_INVALID_ARGS);
ret = rsmi_dev_power_cap_get(dv_ind, 0, &orig);
CHK_ERR_ASRT(ret)
// Verify api support checking functionality is working
ret = rsmi_dev_power_cap_get(dv_ind, 0, nullptr);
ASSERT_EQ(ret, RSMI_STATUS_INVALID_ARGS);
ret = rsmi_dev_power_cap_range_get(dv_ind, 0, &max, &min);
if (ret == RSMI_STATUS_NOT_SUPPORTED) {
std::cout << "\t**rsmi_dev_power_cap_range_get(): Not supported on this machine" << std::endl;
ASSERT_EQ(ret, RSMI_STATUS_NOT_SUPPORTED);
continue;
}
ret = rsmi_dev_power_cap_get(dv_ind, 0, &orig);
CHK_ERR_ASRT(ret)
// Check if power cap is within the range
// skip the test otherwise
if (orig < min || orig > max) {
@@ -123,7 +129,8 @@ void TestPowerCapReadWrite::Run(void) {
}
if (amd::smi::is_vm_guest()) {
std::cout << "VM guest is not supported for power cap test. Skipping test for " << dv_ind << std::endl;
std::cout << "VM guest is not supported for power cap test. Skipping test for "
<< dv_ind << std::endl;
continue;
}
@@ -138,7 +145,7 @@ void TestPowerCapReadWrite::Run(void) {
start = clock();
ret = rsmi_dev_power_cap_set(dv_ind, 0, new_cap);
end = clock();
cpu_time_used = ((double) (end - start)) * 1000000UL / CLOCKS_PER_SEC;
cpu_time_used = (static_cast<double>(end - start)) * 1000000UL / CLOCKS_PER_SEC;
CHK_ERR_ASRT(ret)
+25 -10
View File
@@ -102,20 +102,35 @@ void TestPowerRead::Run(void) {
PrintDeviceHeader(i);
err = rsmi_dev_power_cap_get(i, 0, &val_ui64);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Current Power Cap: " << val_ui64 << "uW" <<std::endl;
if (err == RSMI_STATUS_NOT_SUPPORTED) {
std::cout << "\t**Power Cap not supported on this device." << std::endl;
ASSERT_EQ(err, RSMI_STATUS_NOT_SUPPORTED);
} else {
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Current Power Cap: " << val_ui64 << "uW" <<std::endl;
}
}
err = rsmi_dev_power_cap_default_get(i, &val_ui64);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Default Power Cap: " << val_ui64 << "uW" <<std::endl;
if (err == RSMI_STATUS_NOT_SUPPORTED) {
std::cout << "\t**Default Power Cap not supported on this device." << std::endl;
ASSERT_EQ(err, RSMI_STATUS_NOT_SUPPORTED);
} else {
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Default Power Cap: " << val_ui64 << "uW" <<std::endl;
}
}
err = rsmi_dev_power_cap_range_get(i, 0, &val_ui64, &val2_ui64);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Power Cap Range: " << val2_ui64 << " to " <<
val_ui64 << " uW" << std::endl;
if (err == RSMI_STATUS_NOT_SUPPORTED) {
std::cout << "\t**Power Cap Range not supported on this device." << std::endl;
ASSERT_EQ(err, RSMI_STATUS_NOT_SUPPORTED);
} else {
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Power Cap Range: " << val2_ui64 << " to " <<
val_ui64 << " uW" << std::endl;
}
}
/* Average Power */
@@ -139,10 +139,16 @@ void TestSysInfoRead::Run(void) {
ASSERT_EQ(err, RSMI_STATUS_INVALID_ARGS);
err = rsmi_topo_numa_affinity_get(i, &val_i32);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**NUMA NODE: 0x" << std::hex << val_i32;
std::cout << " (" << std::dec << val_i32 << ")" << std::endl;
if (err == RSMI_STATUS_NOT_SUPPORTED) {
std::cout << "\t**rsmi_topo_numa_affinity_get(): Not supported on this machine"
<< std::endl;
ASSERT_EQ(err, RSMI_STATUS_NOT_SUPPORTED);
} else {
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**NUMA NODE: 0x" << std::hex << val_i32;
std::cout << " (" << std::dec << val_i32 << ")" << std::endl;
}
}
// Verify api support checking functionality is working
err = rsmi_topo_numa_affinity_get(i, nullptr);
+21 -12
View File
@@ -131,9 +131,17 @@ void TestBase::PrintDeviceHeader(uint32_t dv_ind) {
std::cout << "\t**Device ID: 0x" << std::hex << val_ui16 << std::endl;
}
err = rsmi_dev_revision_get(dv_ind, &val_ui16);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Dev.Rev.ID: 0x" << std::hex << val_ui16 << std::endl;
if (err == RSMI_STATUS_NOT_SUPPORTED) {
IF_VERB(STANDARD) {
std::cout << "\t**Device Revision ID: N/A" << std::endl;
}
ASSERT_EQ(err, RSMI_STATUS_NOT_SUPPORTED);
} else {
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Device Revision ID: 0x" << std::hex << std::setfill('0') << std::setw(2)
<< val_ui16 << std::endl;
}
}
char name[128];
@@ -149,15 +157,16 @@ void TestBase::PrintDeviceHeader(uint32_t dv_ind) {
std::endl;
}
err = rsmi_dev_subsystem_id_get(dv_ind, &val_ui16);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Subsystem ID: 0x" << std::hex << val_ui16 << std::endl;
}
err = rsmi_dev_subsystem_vendor_id_get(dv_ind, &val_ui16);
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Subsystem Vendor ID: 0x" << std::hex << val_ui16 <<
std::endl;
if (err == RSMI_STATUS_NOT_SUPPORTED) {
IF_VERB(STANDARD) {
std::cout << "\t**Subsystem ID: N/A" << std::endl;
}
} else {
CHK_ERR_ASRT(err)
IF_VERB(STANDARD) {
std::cout << "\t**Subsystem ID: 0x" << std::hex << std::setfill('0') << std::setw(4)
<< val_ui16 << std::endl;
}
}
std::cout << std::setbase(10);
}
+9 -2
View File
@@ -136,9 +136,16 @@ class TestBase {
// Macros to be used within TestBase classes
#define CHK_ERR_ASRT(RET) { \
if (dont_fail() && ((RET) != RSMI_STATUS_SUCCESS)) { \
if ((RET) != RSMI_STATUS_SUCCESS) { \
std::cout << std::endl << "\t===> TEST FAILURE." << std::endl; \
DISPLAY_RSMI_ERR(RET); \
const char *err_str; \
std::cout << "\t===> ERROR: RSMI call returned " << (RET) << std::endl; \
rsmi_status_string((RET), &err_str); \
std::cout << "\t===> (" << err_str << ")" << std::endl; \
std::cout << "\t===> at " << __FILE__ << ":" << std::dec << __LINE__ << \
std::endl; \
} \
if (dont_fail() && ((RET) != RSMI_STATUS_SUCCESS)) { \
std::cout << \
"\t===> Abort is over-ridden due to dont_fail command line option." \
<< std::endl; \