From 4c66db6b034592b1013a2d6995a63d158ffc7c80 Mon Sep 17 00:00:00 2001 From: Maisam Arif Date: Mon, 9 Oct 2023 21:09:40 -0500 Subject: [PATCH 1/4] Updated human readable output for numa affinity Change-Id: Id9767100061bd6e0f3b42cd2af80da7b588276b6 Signed-off-by: Maisam Arif --- amdsmi_cli/amdsmi_commands.py | 3 +++ 1 file changed, 3 insertions(+) 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()) From 7a2f3c8d56bac2d6474b77426e1f50333b361e09 Mon Sep 17 00:00:00 2001 From: Deepak Mewar Date: Tue, 26 Sep 2023 11:41:55 -0400 Subject: [PATCH 2/4] Updated the sample test for esmi wrappers Change-Id: Ie382b84a0aed4ae40f4befa0e922c19ae8a316c8 --- example/amdsmi_esmi_intg_example.cc | 289 +++++++++++++++++++++++++++- 1 file changed, 287 insertions(+), 2 deletions(-) diff --git a/example/amdsmi_esmi_intg_example.cc b/example/amdsmi_esmi_intg_example.cc index 363124bb01..0bf65df0f7 100644 --- a/example/amdsmi_esmi_intg_example.cc +++ b/example/amdsmi_esmi_intg_example.cc @@ -43,7 +43,6 @@ #include #include #include - #include #include #include @@ -317,7 +316,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< Date: Fri, 6 Oct 2023 07:07:27 -0400 Subject: [PATCH 3/4] added metric table wrapper APIS & test code Change-Id: I24207b3c32d7294337140a1f5108b81f3bf33580 --- example/amdsmi_esmi_intg_example.cc | 34 ++++++++++++++++++++ include/amd_smi/amdsmi.h | 30 ++++++++++++++++++ src/amd_smi/amd_smi.cc | 49 +++++++++++++++++++++++++++-- 3 files changed, 111 insertions(+), 2 deletions(-) diff --git a/example/amdsmi_esmi_intg_example.cc b/example/amdsmi_esmi_intg_example.cc index 0bf65df0f7..28d4784121 100644 --- a/example/amdsmi_esmi_intg_example.cc +++ b/example/amdsmi_esmi_intg_example.cc @@ -49,6 +49,7 @@ #include #include "amd_smi/amdsmi.h" #include +#include using namespace std; @@ -624,6 +625,39 @@ int main(int argc, char **argv) { cout<<"| Current "<(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 +2812,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); From 6ca95c1a2dd0cb197909bc6189daadf66e239ce0 Mon Sep 17 00:00:00 2001 From: "Bill(Shuzhou) Liu" Date: Fri, 6 Oct 2023 12:39:40 -0500 Subject: [PATCH 4/4] Add support to XGMI physical id Get XGMI physical id from sysfs. Change-Id: Ifd9e431bc2fbfd759d888a71b99046a5eb07b6ed --- example/amd_smi_nodrm_example.cc | 4 +++- include/amd_smi/amdsmi.h | 3 ++- py-interface/amdsmi_wrapper.py | 25 +++++++++++---------- rocm_smi/include/rocm_smi/rocm_smi.h | 17 ++++++++++++++ rocm_smi/include/rocm_smi/rocm_smi_device.h | 1 + rocm_smi/src/rocm_smi.cc | 15 +++++++++++++ rocm_smi/src/rocm_smi_device.cc | 5 +++++ rocm_smi/src/rocm_smi_main.cc | 1 + src/amd_smi/amd_smi.cc | 5 +++++ 9 files changed, 62 insertions(+), 14 deletions(-) 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/include/amd_smi/amdsmi.h b/include/amd_smi/amdsmi.h index edb27bebc5..5b85077f4c 100644 --- a/include/amd_smi/amdsmi.h +++ b/include/amd_smi/amdsmi.h @@ -444,7 +444,8 @@ typedef struct { uint64_t device_id; //< The device id of a GPU uint32_t rev_id; char asic_serial[AMDSMI_NORMAL_STRING_LENGTH]; - uint32_t reserved[19]; + uint16_t xgmi_physical_id; //< 0xFFFF if not supported + uint16_t reserved[37]; } amdsmi_asic_info_t; typedef struct{ diff --git a/py-interface/amdsmi_wrapper.py b/py-interface/amdsmi_wrapper.py index 74240ad597..2d2e8bde27 100644 --- a/py-interface/amdsmi_wrapper.py +++ b/py-interface/amdsmi_wrapper.py @@ -23,7 +23,7 @@ import os # -*- coding: utf-8 -*- # -# TARGET arch is: ['-I/usr/lib64/clang/16/include'] +# TARGET arch is: ['-I/usr/lib64/clang/17/include'] # WORD_SIZE is: 8 # POINTER_SIZE is: 8 # LONGDOUBLE_SIZE is: 16 @@ -754,7 +754,8 @@ struct_amdsmi_asic_info_t._fields_ = [ ('device_id', ctypes.c_uint64), ('rev_id', ctypes.c_uint32), ('asic_serial', ctypes.c_char * 32), - ('reserved', ctypes.c_uint32 * 19), + ('xgmi_physical_id', ctypes.c_uint16), + ('reserved', ctypes.c_uint16 * 37), ] amdsmi_asic_info_t = struct_amdsmi_asic_info_t @@ -839,6 +840,16 @@ amdsmi_process_handle_t = ctypes.c_uint32 class struct_amdsmi_proc_info_t(Structure): pass +class struct_engine_usage_(Structure): + pass + +struct_engine_usage_._pack_ = 1 # source:False +struct_engine_usage_._fields_ = [ + ('gfx', ctypes.c_uint64), + ('enc', ctypes.c_uint64), + ('reserved', ctypes.c_uint32 * 12), +] + class struct_memory_usage_(Structure): pass @@ -850,16 +861,6 @@ struct_memory_usage_._fields_ = [ ('reserved', ctypes.c_uint32 * 10), ] -class struct_engine_usage_(Structure): - pass - -struct_engine_usage_._pack_ = 1 # source:False -struct_engine_usage_._fields_ = [ - ('gfx', ctypes.c_uint64), - ('enc', ctypes.c_uint64), - ('reserved', ctypes.c_uint32 * 12), -] - struct_amdsmi_proc_info_t._pack_ = 1 # source:False struct_amdsmi_proc_info_t._fields_ = [ ('name', ctypes.c_char * 32), diff --git a/rocm_smi/include/rocm_smi/rocm_smi.h b/rocm_smi/include/rocm_smi/rocm_smi.h index c041eb24a5..44179e07f0 100755 --- a/rocm_smi/include/rocm_smi/rocm_smi.h +++ b/rocm_smi/include/rocm_smi/rocm_smi.h @@ -1599,6 +1599,23 @@ rsmi_status_t rsmi_dev_subsystem_vendor_id_get(uint32_t dv_ind, uint16_t *id); */ rsmi_status_t rsmi_dev_unique_id_get(uint32_t dv_ind, uint64_t *id); + +/** + * @brief Get the XGMI physical id associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint32_t to + * which the XGMI physical id will be written + * + * @param[in] dv_ind a device index + * + * @param[inout] revision a pointer to uint32_t to which the XGMI physical id + * will be written + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * + */ +rsmi_status_t rsmi_dev_xgmi_physical_id_get(uint32_t dv_ind, uint16_t *id); + /** @} */ // end of IDQuer /*****************************************************************************/ diff --git a/rocm_smi/include/rocm_smi/rocm_smi_device.h b/rocm_smi/include/rocm_smi/rocm_smi_device.h index 8640bae9c1..d0743029f9 100755 --- a/rocm_smi/include/rocm_smi/rocm_smi_device.h +++ b/rocm_smi/include/rocm_smi/rocm_smi_device.h @@ -102,6 +102,7 @@ enum DevInfoTypes { kDevOverDriveLevel, kDevMemOverDriveLevel, kDevDevID, + kDevXGMIPhysicalID, kDevDevRevID, kDevDevProdName, kDevDevProdNum, diff --git a/rocm_smi/src/rocm_smi.cc b/rocm_smi/src/rocm_smi.cc index 1d9da410d1..cbaf9af45d 100755 --- a/rocm_smi/src/rocm_smi.cc +++ b/rocm_smi/src/rocm_smi.cc @@ -861,6 +861,21 @@ rsmi_dev_id_get(uint32_t dv_ind, uint16_t *id) { return ret; } +rsmi_status_t +rsmi_dev_xgmi_physical_id_get(uint32_t dv_ind, uint16_t *id) { + std::ostringstream ss; + rsmi_status_t ret; + ss << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ss); + CHK_SUPPORT_NAME_ONLY(id) + + ret = get_id(dv_ind, amd::smi::kDevXGMIPhysicalID, id); + ss << __PRETTY_FUNCTION__ << " | ======= end =======" + << ", reporting " << amd::smi::getRSMIStatusString(ret); + LOG_TRACE(ss); + return ret; +} + rsmi_status_t rsmi_dev_revision_get(uint32_t dv_ind, uint16_t *revision) { std::ostringstream outss; diff --git a/rocm_smi/src/rocm_smi_device.cc b/rocm_smi/src/rocm_smi_device.cc index a1a45795e2..572ade8f35 100755 --- a/rocm_smi/src/rocm_smi_device.cc +++ b/rocm_smi/src/rocm_smi_device.cc @@ -85,6 +85,7 @@ static const char *kDevPerfLevelFName = "power_dpm_force_performance_level"; static const char *kDevDevProdNameFName = "product_name"; static const char *kDevDevProdNumFName = "product_number"; static const char *kDevDevIDFName = "device"; +static const char* kDevXGMIPhysicalIDFName = "xgmi_physical_id"; static const char *kDevDevRevIDFName = "revision"; static const char *kDevVendorIDFName = "vendor"; static const char *kDevBoardInfoFName = "board_info"; @@ -243,6 +244,7 @@ static const std::map 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 1db02250c6..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; }