diff --git a/amdsmi_cli/amdsmi_commands.py b/amdsmi_cli/amdsmi_commands.py index 786fa1398c..9c5aa09f3e 100644 --- a/amdsmi_cli/amdsmi_commands.py +++ b/amdsmi_cli/amdsmi_commands.py @@ -451,6 +451,9 @@ class AMDSMICommands(): try: numa_affinity = amdsmi_interface.amdsmi_get_gpu_topo_numa_affinity(args.gpu) + # -1 means No numa node is assigned to the GPU, so there is no numa affinity + if self.logger.is_human_readable_format() and numa_affinity == -1: + numa_affinity = "NONE" except amdsmi_exception.AmdSmiLibraryException as e: numa_affinity = "N/A" logging.debug("Failed to get numa affinity for gpu %s | %s", gpu_id, e.get_error_info()) diff --git a/example/amd_smi_nodrm_example.cc b/example/amd_smi_nodrm_example.cc index eaf1b688dc..ec02ec53d8 100644 --- a/example/amd_smi_nodrm_example.cc +++ b/example/amd_smi_nodrm_example.cc @@ -140,7 +140,9 @@ int main() { printf("\tDeviceID: 0x%lx\n", asic_info.device_id); printf("\tVendorID: 0x%x\n", asic_info.vendor_id); printf("\tRevisionID: 0x%x\n", asic_info.rev_id); - printf("\tAsic serial: 0x%s\n\n", asic_info.asic_serial); + printf("\tAsic serial: 0x%s\n", asic_info.asic_serial); + printf("\tXGMI physical id: 0x%x\n\n", + asic_info.xgmi_physical_id); // Get VBIOS info amdsmi_vbios_info_t vbios_info = {}; diff --git a/example/amdsmi_esmi_intg_example.cc b/example/amdsmi_esmi_intg_example.cc index 363124bb01..28d4784121 100644 --- a/example/amdsmi_esmi_intg_example.cc +++ b/example/amdsmi_esmi_intg_example.cc @@ -43,13 +43,13 @@ #include #include #include - #include #include #include #include #include "amd_smi/amdsmi.h" #include +#include using namespace std; @@ -317,7 +317,7 @@ int main(int argc, char **argv) { if (ret != AMDSMI_STATUS_SUCCESS) { cout<<"Failed to set power efficiency mode for socket["<>boost_limit; + ret = amdsmi_set_cpu_core_boostlimit(processor_handles[i], i, boost_limit); + CHK_AMDSMI_RET(ret) + + if(ret != AMDSMI_STATUS_SUCCESS) + cout<<"Failed: to set core"<<"["<>min; + cout<<"\nEnter the XGMI max value to be set:\n"; + cin>>max; + + ret = amdsmi_set_cpu_xgmi_width(sockets[i], min, max); + CHK_AMDSMI_RET(ret) + + if(ret) + cout<<"Failed: to set xGMI link width, Err["<>min_link_width; + cout<<"\nEnter the GMI3 link width max value to be set:\n"; + cin>>max_link_width; + + ret = amdsmi_set_cpu_gmi3_link_width_range(sockets[i], i, min_link_width, max_link_width); + CHK_AMDSMI_RET(ret) + + if(ret) + cout<<"Failed to set gmi3 link width for socket["<>pstate; + ret = amdsmi_cpu_apb_disable(sockets[i], i, pstate); + CHK_AMDSMI_RET(ret) + + if(ret) + cout<<"Failed: to set socket["<>rate_ctrl; + + ret = amdsmi_set_cpu_pcie_link_rate(sockets[i], i, rate_ctrl, &prev_mode); + CHK_AMDSMI_RET(ret) + + if(ret != AMDSMI_STATUS_SUCCESS) + cout<<"Failed to set pcie link rate control for socket["<>max_pstate; + cout<<"\nEnter the min_pstate to be set:\n"; + cin>>min_pstate; + + ret = amdsmi_set_cpu_df_pstate_range(sockets[i], i, max_pstate, min_pstate); + CHK_AMDSMI_RET(ret) + + if(ret != AMDSMI_STATUS_SUCCESS) + cout<<"Failed to set df pstate range, Err["<(1) ; + ret = amdsmi_get_cpu_current_io_bandwidth(sockets[i], i, io_link, &bw); + CHK_AMDSMI_RET(ret) + + if(ret != AMDSMI_STATUS_SUCCESS) + cout<<"Failed to get io bandwidth width for socket ["<(1< kDevAttribNameMap = { {kDevDevProdName, kDevDevProdNameFName}, {kDevDevProdNum, kDevDevProdNumFName}, {kDevDevID, kDevDevIDFName}, + {kDevXGMIPhysicalID, kDevXGMIPhysicalIDFName}, {kDevDevRevID, kDevDevRevIDFName}, {kDevVendorID, kDevVendorIDFName}, {kDevPCieVendorID, kDevPCieVendorIDFName}, @@ -385,6 +387,7 @@ static const std::map kDevFuncDependsMap = { // Functions with only mandatory dependencies {"rsmi_dev_vram_vendor_get", {{kDevVramVendorFName}, {}}}, {"rsmi_dev_id_get", {{kDevDevIDFName}, {}}}, + {"rsmi_dev_xgmi_physical_id_get", {{kDevXGMIPhysicalIDFName}, {}}}, {"rsmi_dev_revision_get", {{kDevDevRevIDFName}, {}}}, {"rsmi_dev_vendor_id_get", {{kDevVendorIDFName}, {}}}, {"rsmi_dev_name_get", {{kDevVendorIDFName, @@ -929,6 +932,7 @@ int Device::readDevInfo(DevInfoTypes type, uint64_t *val) { case kDevVendorID: case kDevPCieVendorID: case kDevErrCntFeatures: + case kDevXGMIPhysicalID: ret = readDevInfoStr(type, &tempStr); RET_IF_NONZERO(ret); @@ -1104,6 +1108,7 @@ int Device::readDevInfo(DevInfoTypes type, std::string *val) { case kDevComputePartition: case kDevMemoryPartition: case kDevNumaNode: + case kDevXGMIPhysicalID: return readDevInfoStr(type, val); break; diff --git a/rocm_smi/src/rocm_smi_main.cc b/rocm_smi/src/rocm_smi_main.cc index 2e5b322f28..bed19c3f36 100755 --- a/rocm_smi/src/rocm_smi_main.cc +++ b/rocm_smi/src/rocm_smi_main.cc @@ -84,6 +84,7 @@ amd::smi::RocmSMI::devInfoTypesStrings = { {amd::smi::kDevOverDriveLevel, amdSMI + "kDevOverDriveLevel"}, {amd::smi::kDevMemOverDriveLevel, amdSMI + "kDevMemOverDriveLevel"}, {amd::smi::kDevDevID, amdSMI + "kDevDevID"}, + {amd::smi::kDevXGMIPhysicalID, amdSMI + "kDevXGMIPhysicalID"}, {amd::smi::kDevDevRevID, amdSMI + "kDevDevRevID"}, {amd::smi::kDevDevProdName, amdSMI + "kDevDevProdName"}, {amd::smi::kDevBoardInfo, amdSMI + "kDevBoardInfo"}, diff --git a/src/amd_smi/amd_smi.cc b/src/amd_smi/amd_smi.cc index b9e61efcd4..201881b462 100644 --- a/src/amd_smi/amd_smi.cc +++ b/src/amd_smi/amd_smi.cc @@ -721,6 +721,11 @@ amdsmi_get_gpu_asic_info(amdsmi_processor_handle processor_handle, amdsmi_asic_i status = rsmi_wrapper(rsmi_dev_pcie_vendor_name_get, processor_handle, info->vendor_name, AMDSMI_MAX_STRING_LENGTH); + // default to 0xffff as not supported + info->xgmi_physical_id = std::numeric_limits::max(); + status = rsmi_wrapper(rsmi_dev_xgmi_physical_id_get, processor_handle, + &(info->xgmi_physical_id)); + return AMDSMI_STATUS_SUCCESS; } @@ -2685,8 +2690,7 @@ amdsmi_status_t amdsmi_set_cpu_socket_lclk_dpm_level(amdsmi_cpusocket_handle soc if (r != AMDSMI_STATUS_SUCCESS) return r; - status = static_cast(esmi_socket_lclk_dpm_level_set(sock_ind, - nbio_id, min, max)); + status = static_cast(esmi_socket_lclk_dpm_level_set(sock_ind, nbio_id, min, max)); if (status != AMDSMI_STATUS_SUCCESS) return status; @@ -2813,6 +2817,52 @@ amdsmi_status_t amdsmi_get_cpu_current_xgmi_bw(amdsmi_cpusocket_handle socket_ha return AMDSMI_STATUS_SUCCESS; } +amdsmi_status_t amdsmi_get_metrics_table_version(amdsmi_cpusocket_handle socket_handle, + uint32_t *metrics_version) +{ + amdsmi_status_t status; + uint32_t metrics_tbl_ver; + + if (socket_handle == nullptr) + return AMDSMI_STATUS_INVAL; + + amd::smi::AMDSmiCpuSocket* socket = nullptr; + amdsmi_status_t r = get_cpu_socket_from_handle(socket_handle, &socket); + if (r != AMDSMI_STATUS_SUCCESS) + return r; + + status = static_cast(esmi_metrics_table_version_get(&metrics_tbl_ver)); + *metrics_version = metrics_tbl_ver; + + if (status != AMDSMI_STATUS_SUCCESS) + return status; + + return AMDSMI_STATUS_SUCCESS; +} + +amdsmi_status_t amdsmi_get_metrics_table(amdsmi_cpusocket_handle socket_handle, uint8_t sock_ind, + struct hsmp_metric_table *metrics_table) +{ + amdsmi_status_t status; + struct hsmp_metric_table metrics_tbl; + + if (socket_handle == nullptr) + return AMDSMI_STATUS_INVAL; + + amd::smi::AMDSmiCpuSocket* socket = nullptr; + amdsmi_status_t r = get_cpu_socket_from_handle(socket_handle, &socket); + if (r != AMDSMI_STATUS_SUCCESS) + return r; + + status = static_cast(esmi_metrics_table_get(sock_ind, &metrics_tbl)); + *metrics_table = metrics_tbl; + + if (status != AMDSMI_STATUS_SUCCESS) + return status; + + return AMDSMI_STATUS_SUCCESS; +} + amdsmi_status_t amdsmi_get_number_of_cpu_sockets(uint32_t sockets) { amdsmi_status_t status = amd::smi::AMDSmiSystem::getInstance().get_cpu_sockets(sockets);