SWDEV-463405: Add amdsmi_get_link_topology_nearest support
amdsmi_get_link_topology_nearest() is used to retrieve
the set of GPUs that are nearest to a given device
at a specific interconnectivity level.
Code changes related to the following:
* API
* CLI
* Unit tests
* Examples
Header Unification Change: "/amdsmi/+/1122408"
Change-Id: Id0317797c652c267742513936d321677793ec634
Signed-off-by: Lang Yu <lang.yu@amd.com>
This commit is contained in:
@@ -3906,6 +3906,54 @@ except AmdSmiException as e:
|
||||
print(e)
|
||||
```
|
||||
|
||||
### amdsmi_get_link_topology_nearest
|
||||
|
||||
Description: Retrieve the set of GPUs that are nearest to a given device
|
||||
at a specific interconnectivity level.
|
||||
|
||||
Input parameters:
|
||||
* `processor_handle` The identifier of the given device.
|
||||
* `link_type` The AmdSmiLinkType level to search for nearest devices
|
||||
|
||||
Output: Dictionary holding the following fields.
|
||||
* `count` number of nearest devices found based on given topology level
|
||||
* `processor_list` list of all nearest device handlers found
|
||||
|
||||
|
||||
Exceptions that can be thrown by `amdsmi_get_link_topology_nearest` function:
|
||||
|
||||
* `AmdSmiLibraryException`
|
||||
|
||||
Example:
|
||||
|
||||
```python
|
||||
try:
|
||||
amdsmi_init()
|
||||
|
||||
devices = amdsmi_get_processor_handles()
|
||||
if len(devices) == 0:
|
||||
print("No GPUs found on machine")
|
||||
exit()
|
||||
else:
|
||||
print(amdsmi_get_gpu_device_uuid(devices[0]))
|
||||
|
||||
nearest_gpus = amdsmi_get_link_topology_nearest(devices[0], AmdSmiLinkType.AMDSMI_LINK_TYPE_PCIE)
|
||||
if (nearest_gpus['count']) == 0:
|
||||
print("No nearest GPUs found on machine")
|
||||
else:
|
||||
print("Nearest GPUs")
|
||||
for gpu in nearest_gpus['processor_list']:
|
||||
print(amdsmi_get_gpu_device_uuid(gpu))
|
||||
|
||||
except AmdSmiException as e:
|
||||
print(e)
|
||||
finally:
|
||||
try:
|
||||
amdsmi_shut_down()
|
||||
except AmdSmiException as e:
|
||||
print(e)
|
||||
```
|
||||
|
||||
## CPU APIs
|
||||
|
||||
### amdsmi_get_processor_info
|
||||
|
||||
@@ -216,6 +216,7 @@ from .amdsmi_interface import amdsmi_topo_get_link_type
|
||||
from .amdsmi_interface import amdsmi_topo_get_p2p_status
|
||||
from .amdsmi_interface import amdsmi_is_P2P_accessible
|
||||
from .amdsmi_interface import amdsmi_get_xgmi_info
|
||||
from .amdsmi_interface import amdsmi_get_link_topology_nearest
|
||||
|
||||
# # Partition Functions
|
||||
from .amdsmi_interface import amdsmi_get_gpu_compute_partition
|
||||
@@ -255,6 +256,7 @@ from .amdsmi_interface import AmdSmiFreqInd
|
||||
from .amdsmi_interface import AmdSmiXgmiStatus
|
||||
from .amdsmi_interface import AmdSmiMemoryPageStatus
|
||||
from .amdsmi_interface import AmdSmiIoLinkType
|
||||
from .amdsmi_interface import AmdSmiLinkType
|
||||
from .amdsmi_interface import AmdSmiUtilizationCounterType
|
||||
from .amdsmi_interface import AmdSmiProcessorType
|
||||
|
||||
|
||||
@@ -383,6 +383,14 @@ class AmdSmiIoLinkType(IntEnum):
|
||||
SIZE = amdsmi_wrapper.AMDSMI_IOLINK_TYPE_SIZE
|
||||
|
||||
|
||||
class AmdSmiLinkType(IntEnum):
|
||||
AMDSMI_LINK_TYPE_INTERNAL = amdsmi_wrapper.AMDSMI_LINK_TYPE_INTERNAL
|
||||
AMDSMI_LINK_TYPE_XGMI = amdsmi_wrapper.AMDSMI_LINK_TYPE_XGMI
|
||||
AMDSMI_LINK_TYPE_PCIE = amdsmi_wrapper.AMDSMI_LINK_TYPE_PCIE
|
||||
AMDSMI_LINK_TYPE_NOT_APPLICABLE = amdsmi_wrapper.AMDSMI_LINK_TYPE_NOT_APPLICABLE
|
||||
AMDSMI_LINK_TYPE_UNKNOWN = amdsmi_wrapper.AMDSMI_LINK_TYPE_UNKNOWN
|
||||
|
||||
|
||||
class AmdSmiUtilizationCounterType(IntEnum):
|
||||
COARSE_GRAIN_GFX_ACTIVITY = amdsmi_wrapper.AMDSMI_COARSE_GRAIN_GFX_ACTIVITY
|
||||
COARSE_GRAIN_MEM_ACTIVITY = amdsmi_wrapper.AMDSMI_COARSE_GRAIN_MEM_ACTIVITY
|
||||
@@ -4174,3 +4182,26 @@ def amdsmi_get_gpu_metrics_header_info(
|
||||
"format_revision": header_info.format_revision,
|
||||
"content_revision": header_info.content_revision
|
||||
}
|
||||
|
||||
def amdsmi_get_link_topology_nearest(
|
||||
processor_handle: amdsmi_wrapper.amdsmi_processor_handle,
|
||||
link_type: AmdSmiLinkType,
|
||||
)-> Dict[str, Any]:
|
||||
|
||||
topology_nearest_list = amdsmi_wrapper.amdsmi_topology_nearest_t()
|
||||
_check_res(
|
||||
amdsmi_wrapper.amdsmi_get_link_topology_nearest(
|
||||
processor_handle,
|
||||
link_type,
|
||||
ctypes.byref(topology_nearest_list)
|
||||
)
|
||||
)
|
||||
|
||||
device_list = []
|
||||
for index in range(topology_nearest_list.count):
|
||||
device_list.append(topology_nearest_list.processor_list[index])
|
||||
|
||||
return {
|
||||
'count': topology_nearest_list.count,
|
||||
'processor_list': device_list
|
||||
}
|
||||
|
||||
@@ -978,15 +978,17 @@ amdsmi_accelerator_partition_profile_t = struct_amdsmi_accelerator_partition_pro
|
||||
|
||||
# values for enumeration 'amdsmi_link_type_t'
|
||||
amdsmi_link_type_t__enumvalues = {
|
||||
0: 'AMDSMI_LINK_TYPE_PCIE',
|
||||
0: 'AMDSMI_LINK_TYPE_INTERNAL',
|
||||
1: 'AMDSMI_LINK_TYPE_XGMI',
|
||||
2: 'AMDSMI_LINK_TYPE_NOT_APPLICABLE',
|
||||
3: 'AMDSMI_LINK_TYPE_UNKNOWN',
|
||||
2: 'AMDSMI_LINK_TYPE_PCIE',
|
||||
3: 'AMDSMI_LINK_TYPE_NOT_APPLICABLE',
|
||||
4: 'AMDSMI_LINK_TYPE_UNKNOWN',
|
||||
}
|
||||
AMDSMI_LINK_TYPE_PCIE = 0
|
||||
AMDSMI_LINK_TYPE_INTERNAL = 0
|
||||
AMDSMI_LINK_TYPE_XGMI = 1
|
||||
AMDSMI_LINK_TYPE_NOT_APPLICABLE = 2
|
||||
AMDSMI_LINK_TYPE_UNKNOWN = 3
|
||||
AMDSMI_LINK_TYPE_PCIE = 2
|
||||
AMDSMI_LINK_TYPE_NOT_APPLICABLE = 3
|
||||
AMDSMI_LINK_TYPE_UNKNOWN = 4
|
||||
amdsmi_link_type_t = ctypes.c_uint32 # enum
|
||||
class struct_amdsmi_link_metrics_t(Structure):
|
||||
pass
|
||||
@@ -1842,6 +1844,19 @@ struct_amdsmi_process_info_t._fields_ = [
|
||||
]
|
||||
|
||||
amdsmi_process_info_t = struct_amdsmi_process_info_t
|
||||
class struct_amdsmi_topology_nearest_t(Structure):
|
||||
pass
|
||||
|
||||
struct_amdsmi_topology_nearest_t._pack_ = 1 # source:False
|
||||
struct_amdsmi_topology_nearest_t._fields_ = [
|
||||
('count', ctypes.c_uint32),
|
||||
('PADDING_0', ctypes.c_ubyte * 4),
|
||||
('processor_list', ctypes.POINTER(None) * 32),
|
||||
('reserved', ctypes.c_uint32 * 15),
|
||||
('PADDING_1', ctypes.c_ubyte * 4),
|
||||
]
|
||||
|
||||
amdsmi_topology_nearest_t = struct_amdsmi_topology_nearest_t
|
||||
class struct_amdsmi_smu_fw_version_t(Structure):
|
||||
pass
|
||||
|
||||
@@ -2376,6 +2391,9 @@ amdsmi_get_gpu_process_list.argtypes = [amdsmi_processor_handle, ctypes.POINTER(
|
||||
amdsmi_get_gpu_total_ecc_count = _libraries['libamd_smi.so'].amdsmi_get_gpu_total_ecc_count
|
||||
amdsmi_get_gpu_total_ecc_count.restype = amdsmi_status_t
|
||||
amdsmi_get_gpu_total_ecc_count.argtypes = [amdsmi_processor_handle, ctypes.POINTER(struct_amdsmi_error_count_t)]
|
||||
amdsmi_get_link_topology_nearest = _libraries['libamd_smi.so'].amdsmi_get_link_topology_nearest
|
||||
amdsmi_get_link_topology_nearest.restype = amdsmi_status_t
|
||||
amdsmi_get_link_topology_nearest.argtypes = [amdsmi_processor_handle, amdsmi_link_type_t, ctypes.POINTER(struct_amdsmi_topology_nearest_t)]
|
||||
amdsmi_get_cpu_core_energy = _libraries['libamd_smi.so'].amdsmi_get_cpu_core_energy
|
||||
amdsmi_get_cpu_core_energy.restype = amdsmi_status_t
|
||||
amdsmi_get_cpu_core_energy.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)]
|
||||
@@ -2616,11 +2634,11 @@ __all__ = \
|
||||
'AMDSMI_IOLINK_TYPE_NUMIOLINKTYPES',
|
||||
'AMDSMI_IOLINK_TYPE_PCIEXPRESS', 'AMDSMI_IOLINK_TYPE_SIZE',
|
||||
'AMDSMI_IOLINK_TYPE_UNDEFINED', 'AMDSMI_IOLINK_TYPE_XGMI',
|
||||
'AMDSMI_LINK_TYPE_NOT_APPLICABLE', 'AMDSMI_LINK_TYPE_PCIE',
|
||||
'AMDSMI_LINK_TYPE_UNKNOWN', 'AMDSMI_LINK_TYPE_XGMI',
|
||||
'AMDSMI_MEMORY_PARTITION_NPS1', 'AMDSMI_MEMORY_PARTITION_NPS2',
|
||||
'AMDSMI_MEMORY_PARTITION_NPS4', 'AMDSMI_MEMORY_PARTITION_NPS8',
|
||||
'AMDSMI_MEMORY_PARTITION_UNKNOWN',
|
||||
'AMDSMI_LINK_TYPE_INTERNAL', 'AMDSMI_LINK_TYPE_NOT_APPLICABLE',
|
||||
'AMDSMI_LINK_TYPE_PCIE', 'AMDSMI_LINK_TYPE_UNKNOWN',
|
||||
'AMDSMI_LINK_TYPE_XGMI', 'AMDSMI_MEMORY_PARTITION_NPS1',
|
||||
'AMDSMI_MEMORY_PARTITION_NPS2', 'AMDSMI_MEMORY_PARTITION_NPS4',
|
||||
'AMDSMI_MEMORY_PARTITION_NPS8', 'AMDSMI_MEMORY_PARTITION_UNKNOWN',
|
||||
'AMDSMI_MEM_PAGE_STATUS_PENDING',
|
||||
'AMDSMI_MEM_PAGE_STATUS_RESERVED',
|
||||
'AMDSMI_MEM_PAGE_STATUS_UNRESERVABLE', 'AMDSMI_MEM_TYPE_FIRST',
|
||||
@@ -2798,7 +2816,7 @@ __all__ = \
|
||||
'amdsmi_get_gpu_vram_info', 'amdsmi_get_gpu_vram_usage',
|
||||
'amdsmi_get_gpu_vram_vendor', 'amdsmi_get_hsmp_metrics_table',
|
||||
'amdsmi_get_hsmp_metrics_table_version', 'amdsmi_get_lib_version',
|
||||
'amdsmi_get_link_metrics',
|
||||
'amdsmi_get_link_metrics', 'amdsmi_get_link_topology_nearest',
|
||||
'amdsmi_get_minmax_bandwidth_between_processors',
|
||||
'amdsmi_get_pcie_info', 'amdsmi_get_power_cap_info',
|
||||
'amdsmi_get_power_info',
|
||||
@@ -2862,7 +2880,8 @@ __all__ = \
|
||||
'amdsmi_temp_range_refresh_rate_t', 'amdsmi_temperature_metric_t',
|
||||
'amdsmi_temperature_type_t', 'amdsmi_topo_get_link_type',
|
||||
'amdsmi_topo_get_link_weight', 'amdsmi_topo_get_numa_node_number',
|
||||
'amdsmi_topo_get_p2p_status', 'amdsmi_utilization_counter_t',
|
||||
'amdsmi_topo_get_p2p_status', 'amdsmi_topology_nearest_t',
|
||||
'amdsmi_utilization_counter_t',
|
||||
'amdsmi_utilization_counter_type_t', 'amdsmi_vbios_info_t',
|
||||
'amdsmi_version_t', 'amdsmi_voltage_metric_t',
|
||||
'amdsmi_voltage_type_t', 'amdsmi_vram_info_t',
|
||||
@@ -2896,6 +2915,7 @@ __all__ = \
|
||||
'struct_amdsmi_retired_page_record_t',
|
||||
'struct_amdsmi_smu_fw_version_t',
|
||||
'struct_amdsmi_temp_range_refresh_rate_t',
|
||||
'struct_amdsmi_topology_nearest_t',
|
||||
'struct_amdsmi_utilization_counter_t',
|
||||
'struct_amdsmi_vbios_info_t', 'struct_amdsmi_version_t',
|
||||
'struct_amdsmi_vram_info_t', 'struct_amdsmi_vram_usage_t',
|
||||
|
||||
مرجع در شماره جدید
Block a user