diff --git a/CMakeLists.txt b/CMakeLists.txt index 3501c721f9..3fb9733f03 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,6 +141,7 @@ set(CMN_SRC_LIST "${ROCM_SRC_DIR}/rocm_smi_counters.cc" "${ROCM_SRC_DIR}/rocm_smi_device.cc" "${ROCM_SRC_DIR}/rocm_smi_gpu_metrics.cc" + "${ROCM_SRC_DIR}/rocm_smi_binary_parser.cc" "${ROCM_SRC_DIR}/rocm_smi_io_link.cc" "${ROCM_SRC_DIR}/rocm_smi_kfd.cc" "${ROCM_SRC_DIR}/rocm_smi_main.cc" @@ -163,6 +164,7 @@ set(CMN_INC_LIST "${ROCM_INC_DIR}/rocm_smi_counters.h" "${ROCM_INC_DIR}/rocm_smi_device.h" "${ROCM_INC_DIR}/rocm_smi_gpu_metrics.h" + "${ROCM_INC_DIR}/rocm_smi_binary_parser.h" "${ROCM_INC_DIR}/rocm_smi_exception.h" "${ROCM_INC_DIR}/rocm_smi_io_link.h" "${ROCM_INC_DIR}/rocm_smi_kfd.h" @@ -245,12 +247,12 @@ install( #Debian package specific variables set(CPACK_DEBIAN_PACKAGE_PROVIDES "amd-smi") -set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "sudo, python3-argcomplete, libdrm-dev, python3-yaml") +set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "python3-argcomplete, libdrm-dev, python3-yaml") set(CPACK_DEBIAN_ASAN_PACKAGE_RECOMMENDS ${CPACK_DEBIAN_PACKAGE_RECOMMENDS}) set(CPACK_DEBIAN_DEV_PACKAGE_RECOMMENDS ${CPACK_DEBIAN_PACKAGE_RECOMMENDS}) set(CPACK_DEBIAN_ASAN_PACKAGE_PROVIDES "${AMD_SMI_PACKAGE}-asan") set(CPACK_DEBIAN_DEV_PACKAGE_PROVIDES "${AMD_SMI_PACKAGE}") -set(CPACK_DEBIAN_PACKAGE_DEPENDS "python3 (>= 3.6.8), python3-pip") +set(CPACK_DEBIAN_PACKAGE_DEPENDS "sudo, python3 (>= 3.6.8), python3-pip") set(CPACK_DEBIAN_ASAN_PACKAGE_DEPENDS ${CPACK_DEBIAN_PACKAGE_DEPENDS}) set(CPACK_DEBIAN_DEV_PACKAGE_DEPENDS ${CPACK_DEBIAN_PACKAGE_DEPENDS}) @@ -269,11 +271,12 @@ endif() set(CPACK_RPM_PACKAGE_PROVIDES "amd-smi") set(CPACK_RPM_DEV_PACKAGE_PROVIDES "${AMD_SMI_PACKAGE}") set(CPACK_RPM_ASAN_PACKAGE_PROVIDES "${AMD_SMI_PACKAGE}-asan") +# NOTE: RPM SUGGESTS DO NOT WORK! https://bugzilla.redhat.com/show_bug.cgi?id=1811358 set(CPACK_RPM_PACKAGE_SUGGESTS "python3-argcomplete") set(CPACK_RPM_DEV_PACKAGE_SUGGESTS ${CPACK_RPM_PACKAGE_SUGGESTS}) set(CPACK_RPM_ASAN_PACKAGE_SUGGESTS ${CPACK_RPM_PACKAGE_SUGGESTS}) # python version gated by rhel8 :( -set(CPACK_RPM_PACKAGE_REQUIRES "python3 >= 3.6.8, python3-pip, python3-PyYAML") +set(CPACK_RPM_PACKAGE_REQUIRES "sudo, python3 >= 3.6.8, python3-pip, python3-PyYAML") set(CPACK_RPM_DEV_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES}) set(CPACK_RPM_ASAN_PACKAGE_REQUIRES ${CPACK_RPM_PACKAGE_REQUIRES}) diff --git a/DEBIAN/postinst.in b/DEBIAN/postinst.in index 6b558b2dd4..5aad321de0 100755 --- a/DEBIAN/postinst.in +++ b/DEBIAN/postinst.in @@ -105,7 +105,6 @@ do_ldconfig() { } do_install_amdsmi_python_lib() { - echo "Installing AMD-SMI python library (amdsmi)..." # get python version local python3_minor_version python3_minor_version=$(python3 -c 'import sys;print(sys.version_info.minor)') @@ -123,8 +122,11 @@ do_install_amdsmi_python_lib() { return fi - local PREVIOUS_PIP_ROOT_ACTION="$PIP_ROOT_USER_ACTION" + local PREVIOUS_PIP_ROOT_USER_ACTION="$PIP_ROOT_USER_ACTION" export PIP_ROOT_USER_ACTION=ignore + # python3.11 requires --break-system-packages + local PREVIOUS_PIP_BREAK_SYSTEM_PACKAGES="$PIP_BREAK_SYSTEM_PACKAGES" + export PIP_BREAK_SYSTEM_PACKAGES=1 # Remove old python library local pip_list_output @@ -140,21 +142,21 @@ do_install_amdsmi_python_lib() { local python_lib_path=@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@ python3 -m pip install "$python_lib_path" --quiet --disable-pip-version-check - unset PIP_ROOT_USER_ACTION - export PIP_ROOT_USER_ACTION="$PREVIOUS_PIP_ROOT_ACTION" + export PIP_ROOT_USER_ACTION="$PREVIOUS_PIP_ROOT_USER_ACTION" + export PIP_BREAK_SYSTEM_PACKAGES="$PREVIOUS_PIP_BREAK_SYSTEM_PACKAGES" - pip_list_output=$(python3 -m pip list --disable-pip-version-check) - # check pip list output for argcomplete - if [[ $pip_list_output == *"argcomplete"* ]]; then - activate-global-python-argcomplete3 - # Newer versions of argcomplete do not have the 3 at the end - if [ $? -ne 0 ]; then - echo "[WARNING] Could not find activate-global-python-argcomplete3. "\ - "Trying newer activate-global-python-argcomplete..." - activate-global-python-argcomplete + # only try to activate argcomplete if such command exists + if command -v activate-global-python-argcomplete &>/dev/null; then + activate-global-python-argcomplete + else + # try older argcomplete3 version + if command -v activate-global-python-argcomplete3 &>/dev/null; then + activate-global-python-argcomplete3 + else + echo "[WARNING] Could not find argcomplete or argcomplete3. "\ + "Argument completion will not work..." fi fi - echo "Installed AMD-SMI python library (amdsmi)..." } case "$1" in diff --git a/DEBIAN/prerm.in b/DEBIAN/prerm.in index 7295b3a0ce..d5b7cfb08a 100755 --- a/DEBIAN/prerm.in +++ b/DEBIAN/prerm.in @@ -10,15 +10,17 @@ rm_ldconfig() { rm_leftovers() { # remove pyc files generated by python - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/amdsmi_cli/__pycache__ - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/amdsmi/__pycache__ + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/amdsmi_cli/__pycache__" + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/amdsmi/__pycache__" + + # remove build and egg files + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/amdsmi.egg-info" + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/build" # remove leftover doc files - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/../doc/amd_smi* - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/ - - # remove leftover libs - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/libamd_smi.so* + if test -e "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/../doc/amd_smi*"; then + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/../doc/amd_smi*" + fi } rm_logFolder() { @@ -41,7 +43,6 @@ return_logrotateToOrigConfig() { } rm_python_lib() { - echo "Removing AMD-SMI python library (amdsmi)..." # get python version local python3_minor_version python3_minor_version=$(python3 -c 'import sys;print(sys.version_info.minor)') @@ -63,26 +64,17 @@ rm_python_lib() { pip_list_output=$(python3 -m pip list --disable-pip-version-check) # check pip list output for amdsmi if [[ $pip_list_output == *"amdsmi"* ]]; then - local PREVIOUS_PIP_ROOT_ACTION="$PIP_ROOT_USER_ACTION" - export PIP_ROOT_USER_ACTION=ignore - - echo "Detected AMD-SMI python library (amdsmi)..." - python3 -m pip uninstall amdsmi --yes --quiet --disable-pip-version-check - echo "Removed AMD-SMI python library (amdsmi)..." - - unset PIP_ROOT_USER_ACTION - export PIP_ROOT_USER_ACTION="$PREVIOUS_PIP_ROOT_ACTION" + PIP_ROOT_USER_ACTION=ignore PIP_BREAK_SYSTEM_PACKAGES=1 python3 -m pip uninstall amdsmi --yes --quiet --disable-pip-version-check fi - local pip_list_output pip_list_output=$(python3 -m pip list --disable-pip-version-check) # check pip list output for amdsmi if [[ $pip_list_output == *"amdsmi"* ]]; then echo "[WARNING] AMD-SMI python library (amdsmi) is still installed in pip. "\ "Check post install to ensure version is correct" - return + else + echo "Removed AMD-SMI python library (amdsmi)..." fi - echo "Removed AMD-SMI python library (amdsmi)..." } diff --git a/RPM/post.in b/RPM/post.in index 1f3d0ced42..cca34aa9ee 100755 --- a/RPM/post.in +++ b/RPM/post.in @@ -12,8 +12,7 @@ do_configureLogrotate() { chmod -R a+rw "${logPath}" chmod a+rw "${logFile}" - command -v logrotate &>/dev/null - if [ $? -ne 0 ]; then + if ! command -v logrotate &>/dev/null; then echo "[WARNING] Detected logrotate is not installed."\ "$packageName logs (when turned on) will not rotate properly." return @@ -105,7 +104,6 @@ do_ldconfig() { } do_install_amdsmi_python_lib() { - echo "Installing AMD-SMI python library (amdsmi)..." # get python version local python3_minor_version python3_minor_version=$(python3 -c 'import sys;print(sys.version_info.minor)') @@ -123,8 +121,11 @@ do_install_amdsmi_python_lib() { return fi - local PREVIOUS_PIP_ROOT_ACTION="$PIP_ROOT_USER_ACTION" + local PREVIOUS_PIP_ROOT_USER_ACTION="$PIP_ROOT_USER_ACTION" export PIP_ROOT_USER_ACTION=ignore + # python3.11 requires --break-system-packages + local PREVIOUS_PIP_BREAK_SYSTEM_PACKAGES="$PIP_BREAK_SYSTEM_PACKAGES" + export PIP_BREAK_SYSTEM_PACKAGES=1 # Remove old python library local pip_list_output @@ -140,21 +141,21 @@ do_install_amdsmi_python_lib() { local python_lib_path=@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@ python3 -m pip install "$python_lib_path" --quiet --disable-pip-version-check - unset PIP_ROOT_USER_ACTION - export PIP_ROOT_USER_ACTION="$PREVIOUS_PIP_ROOT_ACTION" + export PIP_ROOT_USER_ACTION="$PREVIOUS_PIP_ROOT_USER_ACTION" + export PIP_BREAK_SYSTEM_PACKAGES="$PREVIOUS_PIP_BREAK_SYSTEM_PACKAGES" - pip_list_output=$(python3 -m pip list --disable-pip-version-check) - # check pip list output for argcomplete - if [[ $pip_list_output == *"argcomplete"* ]]; then - activate-global-python-argcomplete3 - # Newer versions of argcomplete do not have the 3 at the end - if [ $? -ne 0 ]; then - echo "[WARNING] Could not find activate-global-python-argcomplete3. "\ - "Trying newer activate-global-python-argcomplete..." - activate-global-python-argcomplete + # only try to activate argcomplete if such command exists + if command -v activate-global-python-argcomplete &>/dev/null; then + activate-global-python-argcomplete + else + # try older argcomplete3 version + if command -v activate-global-python-argcomplete3 &>/dev/null; then + activate-global-python-argcomplete3 + else + echo "[WARNING] Could not find argcomplete or argcomplete3. "\ + "Argument completion will not work..." fi fi - echo "Installed AMD-SMI python library (amdsmi)..." } # post install or upgrade, $i is 1 or 2 -> do these actions diff --git a/RPM/preun.in b/RPM/preun.in index f3ec8ed5d6..1e1a896c95 100755 --- a/RPM/preun.in +++ b/RPM/preun.in @@ -2,15 +2,17 @@ rm_leftovers() { # remove pyc files generated by python - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/amdsmi_cli/__pycache__ - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/amdsmi/__pycache__ + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBEXECDIR@/amdsmi_cli/__pycache__" + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/amdsmi/__pycache__" + + # remove build and egg files + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/amdsmi.egg-info" + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/build" # remove leftover doc files - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/../doc/amd_smi* - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/ - - # remove leftover libs - rm -rf @CPACK_PACKAGING_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@/libamd_smi.so* + if test -e "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/../doc/amd_smi*"; then + rm -rf "@CPACK_PACKAGING_INSTALL_PREFIX@/@SHARE_INSTALL_PREFIX@/../doc/amd_smi*" + fi } rm_logFolder() { @@ -33,7 +35,6 @@ return_logrotateToOrigConfig() { } rm_python_lib() { - echo "Removing AMD-SMI python library (amdsmi)..." # get python version local python3_minor_version python3_minor_version=$(python3 -c 'import sys;print(sys.version_info.minor)') @@ -55,26 +56,17 @@ rm_python_lib() { pip_list_output=$(python3 -m pip list --disable-pip-version-check) # check pip list output for amdsmi if [[ $pip_list_output == *"amdsmi"* ]]; then - local PREVIOUS_PIP_ROOT_ACTION="$PIP_ROOT_USER_ACTION" - export PIP_ROOT_USER_ACTION=ignore - - echo "Detected AMD-SMI python library (amdsmi)..." - python3 -m pip uninstall amdsmi --yes --quiet --disable-pip-version-check - echo "Removed AMD-SMI python library (amdsmi)..." - - unset PIP_ROOT_USER_ACTION - export PIP_ROOT_USER_ACTION="$PREVIOUS_PIP_ROOT_ACTION" + PIP_ROOT_USER_ACTION=ignore PIP_BREAK_SYSTEM_PACKAGES=1 python3 -m pip uninstall amdsmi --yes --quiet --disable-pip-version-check fi - local pip_list_output pip_list_output=$(python3 -m pip list --disable-pip-version-check) # check pip list output for amdsmi if [[ $pip_list_output == *"amdsmi"* ]]; then echo "[WARNING] AMD-SMI python library (amdsmi) is still installed in pip. "\ "Check post install to ensure version is correct" - return + else + echo "Removed AMD-SMI python library (amdsmi)..." fi - echo "Removed AMD-SMI python library (amdsmi)..." } diff --git a/amdsmi_cli/amdsmi_commands.py b/amdsmi_cli/amdsmi_commands.py index 35e1bcde23..35ba4f4ea5 100644 --- a/amdsmi_cli/amdsmi_commands.py +++ b/amdsmi_cli/amdsmi_commands.py @@ -505,12 +505,16 @@ class AMDSMICommands(): ras_info = amdsmi_interface.amdsmi_get_gpu_ras_feature_info(args.gpu) for key, value in ras_info.items(): if isinstance(value, int): - if value == 65535 or value == 0: + if value == 65535: logging.debug(f"Failed to get ras {key} for gpu {gpu_id}") ras_info[key] = "N/A" continue - if self.logger.is_human_readable_format(): - ras_info[key] = f"{value}" + if key != "eeprom_version": + if value: + ras_info[key] = "ENABLED" + else: + ras_info[key] = "DISABLED" + ras_dict.update(ras_info) except amdsmi_exception.AmdSmiLibraryException as e: logging.debug("Failed to get ras info for gpu %s | %s", gpu_id, e.get_error_info()) @@ -524,13 +528,13 @@ class AMDSMICommands(): if 'partition' in current_platform_args: if args.partition: try: - compute_partition = amdsmi_interface.amdsmi_dev_compute_partition_get(args.gpu) + compute_partition = amdsmi_interface.amdsmi_get_gpu_compute_partition(args.gpu) except amdsmi_exception.AmdSmiLibraryException as e: compute_partition = "N/A" logging.debug("Failed to get compute partition info for gpu %s | %s", gpu_id, e.get_error_info()) try: - memory_partition = amdsmi_interface.amdsmi_dev_memory_partition_get(args.gpu) + memory_partition = amdsmi_interface.amdsmi_get_gpu_memory_partition(args.gpu) except amdsmi_exception.AmdSmiLibraryException as e: memory_partition = "N/A" logging.debug("Failed to get memory partition info for gpu %s | %s", gpu_id, e.get_error_info()) @@ -981,12 +985,13 @@ class AMDSMICommands(): 'current_soc_voltage': "N/A", 'current_mem_voltage': "N/A", 'power_limit': "N/A", - 'power_management': "N/A"} + 'power_management': "N/A", + 'throttle_status': "N/A"} try: power_info = amdsmi_interface.amdsmi_get_power_info(args.gpu) for key, value in power_info.items(): - if value == 0xFFFFFFFF: + if value == 0xFFFF: power_info[key] = "N/A" elif self.logger.is_human_readable_format(): if "voltage" in key: @@ -994,7 +999,11 @@ class AMDSMICommands(): elif "power" in key: power_info[key] = f"{value} W" - power_dict['current_power'] = power_info['average_socket_power'] + power_dict['current_power'] = power_info['current_socket_power'] + + if power_dict['current_power'] == "N/A": + power_dict['current_power'] = power_info['average_socket_power'] + power_dict['current_gfx_voltage'] = power_info['gfx_voltage'] power_dict['current_soc_voltage'] = power_info['soc_voltage'] power_dict['current_mem_voltage'] = power_info['mem_voltage'] @@ -1012,6 +1021,16 @@ class AMDSMICommands(): except amdsmi_exception.AmdSmiLibraryException as e: logging.debug("Failed to get power management status for gpu %s | %s", gpu_id, e.get_error_info()) + try: + throttle_status = amdsmi_interface.amdsmi_get_gpu_metrics_throttle_status(args.gpu) + if throttle_status: + power_dict['throttle_status'] = "THROTTLED" + else: + power_dict['throttle_status'] = "UNTHROTTLED" + except amdsmi_exception.AmdSmiLibraryException as e: + logging.debug("Failed to get throttle status for gpu %s | %s", gpu_id, e.get_error_info()) + + values_dict['power'] = power_dict if "clock" in current_platform_args: if args.clock: @@ -1060,8 +1079,12 @@ class AMDSMICommands(): logging.debug("Failed to get %s clock info for gpu %s | %s", clock_name, gpu_id, e.get_error_info()) try: - # is_clk_locked = amdsmi_interface.amdsmi_is_clk_locked(args.gpu, amdsmi_interface.AmdSmiClkType.GFX) - is_clk_locked = "N/A" + is_clk_locked = amdsmi_interface.amdsmi_get_gpu_metrics_gfxclk_lock_status(args.gpu) + if self.logger.is_human_readable_format(): + if is_clk_locked: + is_clk_locked = "LOCKED" + else: + is_clk_locked = "UNLOCKED" except amdsmi_exception.AmdSmiLibraryException as e: is_clk_locked = "N/A" logging.debug("Failed to get gfx clock lock status info for gpu %s | %s", gpu_id, e.get_error_info()) @@ -1114,7 +1137,7 @@ class AMDSMICommands(): if self.logger.is_human_readable_format(): unit = '\N{DEGREE SIGN}C' for temperature_key, temperature_value in temperatures.items(): - if 'AMD_SMI_STATUS' not in str(temperature_value): + if 'N/A' not in str(temperature_value): temperatures[temperature_key] = f"{temperature_value} {unit}" values_dict['temperature'] = temperatures @@ -1123,12 +1146,26 @@ class AMDSMICommands(): ecc_count = {} try: ecc_count = amdsmi_interface.amdsmi_get_gpu_total_ecc_count(args.gpu) - ecc_count['correctable'] = ecc_count.pop('correctable_count') - ecc_count['uncorrectable'] = ecc_count.pop('uncorrectable_count') + ecc_count['total_correctable'] = ecc_count.pop('correctable_count') + ecc_count['total_uncorrectable'] = ecc_count.pop('uncorrectable_count') except amdsmi_exception.AmdSmiLibraryException as e: - ecc_count['correctable'] = "N/A" - ecc_count['uncorrectable'] = "N/A" - logging.debug("Failed to get ecc count for gpu %s | %s", gpu_id, e.get_error_info()) + ecc_count['total_correctable'] = "N/A" + ecc_count['total_uncorrectable'] = "N/A" + ecc_count['cache_correctable'] = "N/A" + ecc_count['cache_uncorrectable'] = "N/A" + logging.debug("Failed to get total ecc count for gpu %s | %s", gpu_id, e.get_error_info()) + + if ecc_count['total_correctable'] != "N/A": + # Get the UMC error count for getting total cache correctable errors + umc_block = amdsmi_interface.AmdSmiGpuBlock['UMC'] + try: + umc_count = amdsmi_interface.amdsmi_get_gpu_ecc_count(args.gpu, umc_block) + ecc_count['cache_correctable'] = ecc_count['total_correctable'] - umc_count['correctable_count'] + ecc_count['cache_uncorrectable'] = ecc_count['total_uncorrectable'] - umc_count['uncorrectable_count'] + except amdsmi_exception.AmdSmiLibraryException as e: + ecc_count['cache_correctable'] = "N/A" + ecc_count['cache_uncorrectable'] = "N/A" + logging.debug("Failed to get cache ecc count for gpu %s at block %s | %s", gpu_id, umc_block, e.get_error_info()) values_dict['ecc'] = ecc_count if "pcie" in current_platform_args: @@ -1162,23 +1199,28 @@ class AMDSMICommands(): logging.debug("Failed to get pcie link status for gpu %s | %s", gpu_id, e.get_error_info()) try: - pci_replay_counter = amdsmi_interface.amdsmi_get_gpu_pci_replay_counter(args.gpu) + pci_replay_counter = amdsmi_interface.amdsmi_get_gpu_metrics_pcie_replay_count_acc(args.gpu) pcie_dict['replay_count'] = pci_replay_counter except amdsmi_exception.AmdSmiLibraryException as e: logging.debug("Failed to get pci replay counter for gpu %s | %s", gpu_id, e.get_error_info()) + logging.debug("Falling back to sysfs pci replay counter for gpu %s | %s", gpu_id, e.get_error_info()) + try: + pci_replay_counter = amdsmi_interface.amdsmi_get_gpu_pci_replay_counter(args.gpu) + pcie_dict['replay_count'] = pci_replay_counter + except amdsmi_exception.AmdSmiLibraryException as err: + pcie_dict['replay_count'] = "N/A" + logging.debug("Failed to get sysfs fallback pci replay counter for gpu %s | %s", gpu_id, err.get_error_info()) try: - # l0_to_recovery_counter = amdsmi_interface.amdsmi_get_gpu_pci_l0_to_recovery_counter(args.gpu) - # pcie_dict['l0_to_recovery_count'] = l0_to_recovery_counter - pcie_dict['l0_to_recovery_count'] = "N/A" + l0_to_recovery_counter = amdsmi_interface.amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc(args.gpu) + pcie_dict['l0_to_recovery_count'] = l0_to_recovery_counter except amdsmi_exception.AmdSmiLibraryException as e: pcie_dict['l0_to_recovery_count'] = "N/A" logging.debug("Failed to get pcie l0 to recovery counter for gpu %s | %s", gpu_id, e.get_error_info()) try: - # pci_replay_rollover_counter = amdsmi_interface.amdsmi_get_gpu_pci_replay_rollover_counter(args.gpu) - # pcie_dict['replay_roll_over_count'] = pci_replay_rollover_counter - pcie_dict['replay_roll_over_count'] = "N/A" + pci_replay_rollover_counter = amdsmi_interface.amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc(args.gpu) + pcie_dict['replay_rollover_count'] = pci_replay_rollover_counter except amdsmi_exception.AmdSmiLibraryException as e: pcie_dict['replay_roll_over_count'] = "N/A" logging.debug("Failed to get pcie replay rollover counter for gpu %s | %s", gpu_id, e.get_error_info()) @@ -1702,7 +1744,10 @@ class AMDSMICommands(): try: dest_gpu_link_status = amdsmi_interface.amdsmi_is_P2P_accessible(src_gpu, dest_gpu) - src_gpu_links[dest_gpu_key] = bool(dest_gpu_link_status) + if dest_gpu_link_status: + src_gpu_links[dest_gpu_key] = "ENABLED" + else: + src_gpu_links[dest_gpu_key] = "DISABLED" except amdsmi_exception.AmdSmiLibraryException as e: src_gpu_links[dest_gpu_key] = "N/A" logging.debug("Failed to get link status for %s to %s | %s", @@ -1943,7 +1988,7 @@ class AMDSMICommands(): if args.compute_partition: compute_partition = amdsmi_interface.AmdSmiComputePartitionType[args.compute_partition] try: - amdsmi_interface.amdsmi_dev_compute_partition_set(args.gpu, compute_partition) + amdsmi_interface.amdsmi_set_gpu_compute_partition(args.gpu, compute_partition) except amdsmi_exception.AmdSmiLibraryException as e: if e.get_error_code() == amdsmi_interface.amdsmi_wrapper.AMDSMI_STATUS_NO_PERM: raise PermissionError('Command requires elevation') from e @@ -1952,7 +1997,7 @@ class AMDSMICommands(): if args.memory_partition: memory_partition = amdsmi_interface.AmdSmiMemoryPartitionType[args.memory_partition] try: - amdsmi_interface.amdsmi_dev_memory_partition_set(args.gpu, memory_partition) + amdsmi_interface.amdsmi_set_gpu_memory_partition(args.gpu, memory_partition) except amdsmi_exception.AmdSmiLibraryException as e: if e.get_error_code() == amdsmi_interface.amdsmi_wrapper.AMDSMI_STATUS_NO_PERM: raise PermissionError('Command requires elevation') from e @@ -2165,7 +2210,7 @@ class AMDSMICommands(): self.logger.store_output(args.gpu, 'reset_perf_determinism', result) if args.compute_partition: try: - amdsmi_interface.amdsmi_dev_compute_partition_reset(args.gpu) + amdsmi_interface.amdsmi_reset_gpu_compute_partition(args.gpu) result = 'Successfully reset compute partition' except amdsmi_exception.AmdSmiLibraryException as e: if e.get_error_code() == amdsmi_interface.amdsmi_wrapper.AMDSMI_STATUS_NO_PERM: @@ -2175,7 +2220,7 @@ class AMDSMICommands(): self.logger.store_output(args.gpu, 'reset_compute_partition', result) if args.memory_partition: try: - amdsmi_interface.amdsmi_dev_memory_partition_reset(args.gpu) + amdsmi_interface.amdsmi_reset_gpu_memory_partition(args.gpu) result = 'Successfully reset memory partition' except amdsmi_exception.AmdSmiLibraryException as e: if e.get_error_code() == amdsmi_interface.amdsmi_wrapper.AMDSMI_STATUS_NO_PERM: diff --git a/amdsmi_cli/amdsmi_parser.py b/amdsmi_cli/amdsmi_parser.py index d37eb80872..262b2358bc 100644 --- a/amdsmi_cli/amdsmi_parser.py +++ b/amdsmi_cli/amdsmi_parser.py @@ -248,7 +248,7 @@ class AMDSMIParser(argparse.ArgumentParser): command_modifier_group.add_argument('--file', action=self._check_output_file_path(), type=str, required=False, help=file_help) # Placing loglevel outside the subcommands so it can be used with any subcommand - command_modifier_group.add_argument('--loglevel', action='store', required=False, help=loglevel_help, default='ERROR', metavar='LEVEL', + command_modifier_group.add_argument('--loglevel', action='store', type=str.upper, required=False, help=loglevel_help, default='ERROR', metavar='LEVEL', choices=loglevel_choices) diff --git a/include/amd_smi/amdsmi.h b/include/amd_smi/amdsmi.h index 7856d8cf47..66c2a3d6be 100644 --- a/include/amd_smi/amdsmi.h +++ b/include/amd_smi/amdsmi.h @@ -196,6 +196,9 @@ typedef enum { AMDSMI_NO_DRV = 51, //!< No Energy and HSMP driver present AMDSMI_FILE_NOT_FOUND = 52, //!< file or directory not found AMDSMI_ARG_PTR_NULL = 53, //!< Parsed argument is invalid + AMDSMI_STATUS_AMDGPU_RESTART_ERR = 54, //!< AMDGPU restart failed + AMDSMI_STATUS_SETTING_UNAVAILABLE = 55, //!< Setting is not available + // General errors AMDSMI_STATUS_MAP_ERROR = 0xFFFFFFFE, //!< The internal library error did not map to a status code AMDSMI_STATUS_UNKNOWN_ERROR = 0xFFFFFFFF, //!< An unknown error occurred @@ -522,6 +525,7 @@ typedef struct { } amdsmi_board_info_t; typedef struct { + uint32_t current_socket_power; uint32_t average_socket_power; uint32_t gfx_voltage; // GFX voltage measurement in mV uint32_t soc_voltage; // SOC voltage measurement in mV @@ -1123,96 +1127,209 @@ typedef struct { */ typedef struct { // TODO(amd) Doxygen documents - /// @cond Ignore in docs. + // Note: This should match: AMDGpuMetricsHeader_v1_t + /// \cond Ignore in docs. uint16_t structure_size; uint8_t format_revision; uint8_t content_revision; - /// @endcond + /// \endcond } amd_metrics_table_header_t; /** * @brief The following structure holds the gpu metrics values for a device. */ -// Below is the assumed version of gpu_metric data on the device. If the device -// is using this version, we can read data directly into amdsmi_gpu_metrics_t. -// If the device is using an older format, a conversion of formats will be -// required. -// DGPU targets have a format version of 1. APU targets have a format version of -// 2. Currently, only version 1 (DGPU) gpu_metrics is supported. -#define AMDSMI_GPU_METRICS_API_FORMAT_VER 1 -// The content version increments when gpu_metrics is extended with new and/or -// existing field sizes are changed. -#define AMDSMI_GPU_METRICS_API_CONTENT_VER_1 1 -#define AMDSMI_GPU_METRICS_API_CONTENT_VER_2 2 -#define AMDSMI_GPU_METRICS_API_CONTENT_VER_3 3 -// This should match NUM_HBM_INSTANCES -#define AMDSMI_NUM_HBM_INSTANCES 4 - -// Unit conversion factor for HBM temperatures +/** + * @brief Unit conversion factor for HBM temperatures + */ #define CENTRIGRADE_TO_MILLI_CENTIGRADE 1000 +/** + * @brief This should match NUM_HBM_INSTANCES + */ +#define AMDSMI_NUM_HBM_INSTANCES 4 + +/** + * @brief This should match MAX_NUM_VCN + */ +#define AMDSMI_MAX_NUM_VCN 4 + +/** + * @brief This should match MAX_NUM_CLKS + */ +#define AMDSMI_MAX_NUM_CLKS 4 + +/** + * @brief This should match MAX_NUM_XGMI_LINKS + */ +#define AMDSMI_MAX_NUM_XGMI_LINKS 8 + +/** + * @brief This should match MAX_NUM_GFX_CLKS + */ +#define AMDSMI_MAX_NUM_GFX_CLKS 8 + + typedef struct { -// TODO(amd) Doxygen documents - /// @cond Ignore in docs. + // TODO(amd) Doxygen documents + // Note: This structure is extended to fit the needs of different GPU metric + // versions when exposing data through the structure. + // Depending on the version, some data members will hold data, and + // some will not. A good example is the set of 'current clocks': + // - current_gfxclk, current_socclk, current_vclk0, current_dclk0 + // These are single-valued data members, up to version 1.3. + // For version 1.4 and up these are multi-valued data members (arrays) + // and their counterparts; + // - current_gfxclks[], current_socclks[], current_vclk0s[], + // current_dclk0s[] + // will hold the data + /// \cond Ignore in docs. amd_metrics_table_header_t common_header; -/* Temperature */ - uint16_t temperature_edge; - uint16_t temperature_hotspot; - uint16_t temperature_mem; - uint16_t temperature_vrgfx; - uint16_t temperature_vrsoc; - uint16_t temperature_vrmem; + /* + * v1.0 Base + */ + // Temperature + uint16_t temperature_edge; + uint16_t temperature_hotspot; + uint16_t temperature_mem; + uint16_t temperature_vrgfx; + uint16_t temperature_vrsoc; + uint16_t temperature_vrmem; -/* Utilization */ - uint16_t average_gfx_activity; - uint16_t average_umc_activity; // memory controller - uint16_t average_mm_activity; // UVD or VCN + // Utilization + uint16_t average_gfx_activity; + uint16_t average_umc_activity; // memory controller + uint16_t average_mm_activity; // UVD or VCN -/* Power/Energy */ - uint16_t average_socket_power; - uint64_t energy_accumulator; // v1 mod. (32->64) + // Power/Energy + uint16_t average_socket_power; + uint64_t energy_accumulator; // v1 mod. (32->64) -/* Driver attached timestamp (in ns) */ - uint64_t system_clock_counter; // v1 mod. (moved from top of struct) + // Driver attached timestamp (in ns) + uint64_t system_clock_counter; // v1 mod. (moved from top of struct) -/* Average clocks */ - uint16_t average_gfxclk_frequency; - uint16_t average_socclk_frequency; - uint16_t average_uclk_frequency; - uint16_t average_vclk0_frequency; - uint16_t average_dclk0_frequency; - uint16_t average_vclk1_frequency; - uint16_t average_dclk1_frequency; + // Average clocks + uint16_t average_gfxclk_frequency; + uint16_t average_socclk_frequency; + uint16_t average_uclk_frequency; + uint16_t average_vclk0_frequency; + uint16_t average_dclk0_frequency; + uint16_t average_vclk1_frequency; + uint16_t average_dclk1_frequency; -/* Current clocks */ - uint16_t current_gfxclk; - uint16_t current_socclk; - uint16_t current_uclk; - uint16_t current_vclk0; - uint16_t current_dclk0; - uint16_t current_vclk1; - uint16_t current_dclk1; + // Current clocks + uint16_t current_gfxclk; + uint16_t current_socclk; + uint16_t current_uclk; + uint16_t current_vclk0; + uint16_t current_dclk0; + uint16_t current_vclk1; + uint16_t current_dclk1; -/* Throttle status */ - uint32_t throttle_status; + // Throttle status + uint32_t throttle_status; -/* Fans */ - uint16_t current_fan_speed; + // Fans + uint16_t current_fan_speed; -/* Link width/speed */ - uint16_t pcie_link_width; // v1 mod.(8->16) - uint16_t pcie_link_speed; // in 0.1 GT/s; v1 mod. (8->16) + // Link width/speed + uint16_t pcie_link_width; // v1 mod.(8->16) + uint16_t pcie_link_speed; // in 0.1 GT/s; v1 mod. (8->16) - uint16_t padding; // new in v1 - uint32_t gfx_activity_acc; // new in v1 - uint32_t mem_activity_acc; // new in v1 - uint16_t temperature_hbm[AMDSMI_NUM_HBM_INSTANCES]; // new in v1 - /// @endcond + /* + * v1.1 additions + */ + uint32_t gfx_activity_acc; // new in v1 + uint32_t mem_activity_acc; // new in v1 + uint16_t temperature_hbm[AMDSMI_NUM_HBM_INSTANCES]; // new in v1 + + + /* + * v1.2 additions + */ + // PMFW attached timestamp (10ns resolution) + uint64_t firmware_timestamp; + + + /* + * v1.3 additions + */ + // Voltage (mV) + uint16_t voltage_soc; + uint16_t voltage_gfx; + uint16_t voltage_mem; + + // Throttle status + uint64_t indep_throttle_status; + + + /* + * v1.4 additions + */ + // Power (Watts) + uint16_t current_socket_power; + + // Utilization (%) + uint16_t vcn_activity[AMDSMI_MAX_NUM_VCN]; // VCN instances activity percent (encode/decode) + + // Clock Lock Status. Each bit corresponds to clock instance + uint32_t gfxclk_lock_status; + + // XGMI bus width and bitrate (in Gbps) + uint16_t xgmi_link_width; + uint16_t xgmi_link_speed; + + // PCIE accumulated bandwidth (GB/sec) + uint64_t pcie_bandwidth_acc; + + // PCIE instantaneous bandwidth (GB/sec) + uint64_t pcie_bandwidth_inst; + + // PCIE L0 to recovery state transition accumulated count + uint64_t pcie_l0_to_recov_count_acc; + + // PCIE replay accumulated count + uint64_t pcie_replay_count_acc; + + // PCIE replay rollover accumulated count + uint64_t pcie_replay_rover_count_acc; + + // XGMI accumulated data transfer size(KiloBytes) + uint64_t xgmi_read_data_acc[AMDSMI_MAX_NUM_XGMI_LINKS]; + uint64_t xgmi_write_data_acc[AMDSMI_MAX_NUM_XGMI_LINKS]; + + // Current clock frequencies + uint16_t current_gfxclks[AMDSMI_MAX_NUM_GFX_CLKS]; + uint16_t current_socclks[AMDSMI_MAX_NUM_CLKS]; + uint16_t current_vclk0s[AMDSMI_MAX_NUM_CLKS]; + uint16_t current_dclk0s[AMDSMI_MAX_NUM_CLKS]; + /// \endcond } amdsmi_gpu_metrics_t; + +#define MAX_AMDSMI_NAME_LENGTH 64 + +/** + * @brief This structure holds the name value pairs + */ +typedef struct { + char name[MAX_AMDSMI_NAME_LENGTH]; //!< Name + uint64_t value; //!< Use uint64_t to make it universal +} amdsmi_name_value_t; + +/** + * @brief This register type for register table + */ +typedef enum { + AMDSMI_REG_XGMI, + AMDSMI_REG_WAFL, + AMDSMI_REG_PCIE, + AMDSMI_REG_USR, + AMDSMI_REG_USR1, +} amdsmi_reg_type_t; + /** * @brief This structure holds ras feature */ @@ -2585,6 +2702,77 @@ amdsmi_status_t amdsmi_get_gpu_od_volt_info(amdsmi_processor_handle processor_ha amdsmi_status_t amdsmi_get_gpu_metrics_info(amdsmi_processor_handle processor_handle, amdsmi_gpu_metrics_t *pgpu_metrics); +/** + * @brief Get the pm metrics table with provided device index. + * + * @details Given a device handle @p processor_handle, @p pm_metrics pointer, + * and @p num_of_metrics pointer, + * this function will write the pm metrics name value pair + * to the array at @p pm_metrics and the number of metrics retreived to @p num_of_metrics + * Note: the library allocated memory for pm_metrics, and user must call + * free(pm_metrics) to free it after use. + * + * @param[in] processor_handle a processor handle + * + * @param[inout] pm_metrics A pointerto an array to hold multiple PM metrics. On successs, + * the library will allocate memory of pm_metrics and write metrics to this array. + * The caller must free this memory after usage to avoid memory leak. + * + * @param[inout] num_of_metrics a pointer to uint32_t to which the number of + * metrics is allocated for pm_metrics array as input, and the number of metrics retreived + * as output. If this parameter is NULL, this function will return + * ::AMDSMI_STATUS_INVALID_ARGS if the function is supported with the provided, + * arguments and ::AMDSMI_STATUS_NOT_SUPPORTED if it is not supported with the + * provided arguments. + * + * @retval ::AMDSMI_STATUS_SUCCESS call was successful + * @retval ::AMDSMI_STATUS_NOT_SUPPORTED installed software or hardware does not + * support this function with the given arguments + * @retval ::AMDSMI_STATUS_INVALID_ARGS the provided arguments are not valid + * + */ +amdsmi_status_t amdsmi_get_gpu_pm_metrics_info( + amdsmi_processor_handle processor_handle, + amdsmi_name_value_t** pm_metrics, + uint32_t *num_of_metrics); + +/** + * @brief Get the register metrics table with provided device index and register type. + * + * @details Given a device handle @p processor_handle, @p reg_type, @p reg_metrics pointer, + * and @p num_of_metrics pointer, + * this function will write the register metrics name value pair + * to the array at @p reg_metrics and the number of metrics retreived to @p num_of_metrics + * Note: the library allocated memory for reg_metrics, and user must call + * free(reg_metrics) to free it after use. + * + * @param[in] processor_handle a processor handle + * + * @param[in] reg_type The register type + * + * @param[inout] reg_metrics A pointerto an array to hold multiple register metrics. On successs, + * the library will allocate memory of reg_metrics and write metrics to this array. + * The caller must free this memory after usage to avoid memory leak. + * + * @param[inout] num_of_metrics a pointer to uint32_t to which the number of + * metrics is allocated for reg_metrics array as input, and the number of metrics retreived + * as output. If this parameter is NULL, this function will return + * ::AMDSMI_STATUS_INVALID_ARGS if the function is supported with the provided, + * arguments and ::AMDSMI_STATUS_NOT_SUPPORTED if it is not supported with the + * provided arguments. + * + * @retval ::AMDSMI_STATUS_SUCCESS call was successful + * @retval ::AMDSMI_STATUS_NOT_SUPPORTED installed software or hardware does not + * support this function with the given arguments + * @retval ::AMDSMI_STATUS_INVALID_ARGS the provided arguments are not valid + * + */ +amdsmi_status_t amdsmi_get_gpu_reg_table_info( + amdsmi_processor_handle processor_handle, + amdsmi_reg_type_t reg_type, + amdsmi_name_value_t** reg_metrics, + uint32_t *num_of_metrics); + /** * @brief This function sets the clock range information. It is not supported on virtual * machine guest @@ -3464,13 +3652,13 @@ amdsmi_is_P2P_accessible(amdsmi_processor_handle processor_handle_src, * @brief Retrieves the current compute partitioning for a desired device * * @details - * Given a device index @p dv_ind and a string @p compute_partition , + * Given a processor handle @p processor_handle and a string @p compute_partition , * and uint32 @p len , this function will attempt to obtain the device's * current compute partition setting string. Upon successful retreival, * the obtained device's compute partition settings string shall be stored in * the passed @p compute_partition char string variable. * - * @param[in] dv_ind a device index + * @param[in] processor_handle Device which to query * * @param[inout] compute_partition a pointer to a char string variable, * which the device's current compute partition will be written to. @@ -3489,17 +3677,17 @@ amdsmi_is_P2P_accessible(amdsmi_processor_handle processor_handle_src, * */ amdsmi_status_t -amdsmi_dev_compute_partition_get(amdsmi_processor_handle processor_handle, +amdsmi_get_gpu_compute_partition(amdsmi_processor_handle processor_handle, char *compute_partition, uint32_t len); /** * @brief Modifies a selected device's compute partition setting. * - * @details Given a device index @p dv_ind, a type of compute partition + * @details Given a processor handle @p processor_handle, a type of compute partition * @p compute_partition, this function will attempt to update the selected * device's compute partition setting. * - * @param[in] dv_ind a device index + * @param[in] processor_handle Device which to query * * @param[in] compute_partition using enum ::amdsmi_compute_partition_type_t, * define what the selected device's compute partition setting should be @@ -3515,17 +3703,17 @@ amdsmi_dev_compute_partition_get(amdsmi_processor_handle processor_handle, * */ amdsmi_status_t -amdsmi_dev_compute_partition_set(amdsmi_processor_handle processor_handle, +amdsmi_set_gpu_compute_partition(amdsmi_processor_handle processor_handle, amdsmi_compute_partition_type_t compute_partition); /** * @brief Reverts a selected device's compute partition setting back to its * boot state. * - * @details Given a device index @p dv_ind , this function will attempt to + * @details Given a processor handle @p processor_handle, this function will attempt to * revert its compute partition setting back to its boot state. * - * @param[in] dv_ind a device index + * @param[in] processor_handle Device which to query * * @retval ::AMDSMI_STATUS_SUCCESS call was successful * @retval ::AMDSMI_STATUS_PERMISSION function requires root access @@ -3533,7 +3721,7 @@ amdsmi_dev_compute_partition_set(amdsmi_processor_handle processor_handle, * support this function * */ -amdsmi_status_t amdsmi_dev_compute_partition_reset(amdsmi_processor_handle processor_handle); +amdsmi_status_t amdsmi_reset_gpu_compute_partition(amdsmi_processor_handle processor_handle); /** @} */ // end of compute_partition @@ -3548,13 +3736,13 @@ amdsmi_status_t amdsmi_dev_compute_partition_reset(amdsmi_processor_handle proce * @brief Retrieves the current memory partition for a desired device * * @details - * Given a device index @p dv_ind and a string @p memory_partition , + * Given a processor handle @p processor_handle and a string @p memory_partition , * and uint32 @p len , this function will attempt to obtain the device's * memory partition string. Upon successful retreival, the obtained device's * memory partition string shall be stored in the passed @p memory_partition * char string variable. * - * @param[in] dv_ind a device index + * @param[in] processor_handle Device which to query * * @param[inout] memory_partition a pointer to a char string variable, * which the device's memory partition will be written to. @@ -3573,17 +3761,17 @@ amdsmi_status_t amdsmi_dev_compute_partition_reset(amdsmi_processor_handle proce * */ amdsmi_status_t -amdsmi_dev_memory_partition_get(amdsmi_processor_handle processor_handle, +amdsmi_get_gpu_memory_partition(amdsmi_processor_handle processor_handle, char *memory_partition, uint32_t len); /** * @brief Modifies a selected device's current memory partition setting. * - * @details Given a device index @p dv_ind and a type of memory partition + * @details Given a processor handle @p processor_handle and a type of memory partition * @p memory_partition, this function will attempt to update the selected * device's memory partition setting. * - * @param[in] dv_ind a device index + * @param[in] processor_handle Device which to query * * @param[in] memory_partition using enum ::amdsmi_memory_partition_type_t, * define what the selected device's current mode setting should be updated to. @@ -3598,17 +3786,17 @@ amdsmi_dev_memory_partition_get(amdsmi_processor_handle processor_handle, * */ amdsmi_status_t -amdsmi_dev_memory_partition_set(amdsmi_processor_handle processor_handle, +amdsmi_set_gpu_memory_partition(amdsmi_processor_handle processor_handle, amdsmi_memory_partition_type_t memory_partition); /** * @brief Reverts a selected device's memory partition setting back to its * boot state. * - * @details Given a device index @p dv_ind , this function will attempt to + * @details Given a processor handle @p processor_handle, this function will attempt to * revert its current memory partition setting back to its boot state. * - * @param[in] dv_ind a device index + * @param[in] processor_handle Device which to query * * @retval ::AMDSMI_STATUS_SUCCESS call was successful * @retval ::AMDSMI_STATUS_PERMISSION function requires root access @@ -3618,7 +3806,7 @@ amdsmi_dev_memory_partition_set(amdsmi_processor_handle processor_handle, * the amdgpu driver * */ -amdsmi_status_t amdsmi_dev_memory_partition_reset(amdsmi_processor_handle processor_handle); +amdsmi_status_t amdsmi_reset_gpu_memory_partition(amdsmi_processor_handle processor_handle); /** @} */ // end of memory_partition @@ -4051,6 +4239,1057 @@ amdsmi_get_gpu_total_ecc_count(amdsmi_processor_handle processor_handle, amdsmi_ /** @} End eccinfo */ + +/*****************************************************************************/ +/** @defgroup metricfunctions GPU Metric Functions + * These functions are used to get granular information about all counters + * available in GPU Metrics. + * @{ + */ + +/** + * Metric multi-valued counter types + */ +typedef uint16_t gpu_metric_temp_hbm_t[AMDSMI_NUM_HBM_INSTANCES]; +typedef uint16_t gpu_metric_vcn_activity_t[AMDSMI_MAX_NUM_VCN]; +typedef uint64_t gpu_metric_xgmi_read_data_acc_t[AMDSMI_MAX_NUM_XGMI_LINKS]; +typedef uint64_t gpu_metric_xgmi_write_data_acc_t[AMDSMI_MAX_NUM_XGMI_LINKS]; +typedef uint16_t gpu_metric_curr_gfxclk_t[AMDSMI_MAX_NUM_GFX_CLKS]; +typedef uint16_t gpu_metric_curr_socclk_t[AMDSMI_MAX_NUM_CLKS]; +typedef uint16_t gpu_metric_curr_vclk0_t[AMDSMI_MAX_NUM_CLKS]; +typedef uint16_t gpu_metric_curr_dclk0_t[AMDSMI_MAX_NUM_CLKS]; + + +/****** + * Metric single-valued counter types + */ + +/** + * @brief Get the 'temp_hotspot' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'temp_hotspot' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] hotspot_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_hotspot(amdsmi_processor_handle processor_handle, uint16_t* hotspot_value); + +/** + * @brief Get the 'temp_mem' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'temp_mem' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] mem_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_mem(amdsmi_processor_handle processor_handle, uint16_t* mem_value); + +/** + * @brief Get the 'temp_vrsoc' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'temp_vrsoc' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] vrsoc_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_vrsoc(amdsmi_processor_handle processor_handle, uint16_t* vrsoc_value); + +/** + * @brief Get the 'curr_socket_power' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'socket_power' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] socket_power_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_socket_power(amdsmi_processor_handle processor_handle, uint16_t* socket_power_value); + +/** + * @brief Get the 'avg_gfx_activity' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'gfx_activity' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] gfx_activity_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_gfx_activity(amdsmi_processor_handle processor_handle, uint16_t* gfx_activity_value); + +/** + * @brief Get the 'avg_umc_activity' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'umc_activity' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] umc_activity_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_umc_activity(amdsmi_processor_handle processor_handle, uint16_t* umc_activity_value); + +/** + * @brief Get the 'energy_acc' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'energy_acc' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] energy_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_energy_acc(amdsmi_processor_handle processor_handle, uint64_t* energy_acc_value); + +/** + * @brief Get the 'system_clock_counter' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'system_clock_counter' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] system_clock_counter_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_system_clock_counter(amdsmi_processor_handle processor_handle, uint64_t* system_clock_counter_value); + +/** + * @brief Get the 'firmware_timestamp' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'firmware_timestamp' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] firmware_timestamp_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_firmware_timestamp(amdsmi_processor_handle processor_handle, uint64_t* firmware_timestamp_value); + +/** + * @brief Get the 'throttle_status' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint32_t in which + * the 'throttle_status' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] throttle_status_value a pointer to uint32_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_throttle_status(amdsmi_processor_handle processor_handle, uint32_t* throttle_status_value); + +/** + * @brief Get the 'pcie_link_width' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'pcie_link_width' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] pcie_link_width_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_link_width(amdsmi_processor_handle processor_handle, uint16_t* pcie_link_width_value); + +/** + * @brief Get the 'pcie_link_speed' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'pcie_link_speed' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] pcie_link_speed_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_link_speed(amdsmi_processor_handle processor_handle, uint16_t* pcie_link_speed_value); + +/** + * @brief Get the 'xgmi_link_width' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'xgmi_link_width' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] xgmi_link_width_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_link_width(amdsmi_processor_handle processor_handle, uint16_t* xgmi_link_width_value); + +/** + * @brief Get the 'xgmi_link_speed' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'xgmi_link_speed' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] xgmi_link_speed_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_link_speed(amdsmi_processor_handle processor_handle, uint16_t* xgmi_link_speed_value); + +/** + * @brief Get the 'gfxclk_lock_status' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint32_t in which + * the 'gfxclk_lock_status' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] gfxclk_lock_status_value a pointer to uint32_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_gfxclk_lock_status(amdsmi_processor_handle processor_handle, uint32_t* gfxclk_lock_status_value); + +/** + * @brief Get the 'gfx_activity_acc' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint32_t in which + * the 'gfx_activity_acc' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] gfx_activity_acc_value a pointer to uint32_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_gfx_activity_acc(amdsmi_processor_handle processor_handle, uint32_t* gfx_activity_acc_value); + +/** + * @brief Get the 'mem_activity_acc' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint32_t in which + * the 'mem_activity_acc' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] mem_activity_acc_value a pointer to uint32_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_mem_activity_acc(amdsmi_processor_handle processor_handle, uint32_t* mem_activity_acc_value); + +/** + * @brief Get the 'pcie_bandwidth_acc' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'pcie_bandwidth_acc' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] pcie_bandwidth_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_bandwidth_acc(amdsmi_processor_handle processor_handle, uint64_t* pcie_bandwidth_acc_value); + +/** + * @brief Get the 'pcie_bandwidth_inst' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'pcie_bandwidth_inst' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] pcie_bandwidth_inst_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_bandwidth_inst(amdsmi_processor_handle processor_handle, uint64_t* pcie_bandwidth_inst_value); + +/** + * @brief Get the 'pcie_l0_recov_count_acc' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'pcie_l0_recov_count_acc' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] pcie_count_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc(amdsmi_processor_handle processor_handle, uint64_t* pcie_count_acc_value); + +/** + * @brief Get the 'pcie_replay_count_acc' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'pcie_replay_count_acc' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] pcie_count_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_replay_count_acc(amdsmi_processor_handle processor_handle, uint64_t* pcie_count_acc_value); + +/** + * @brief Get the 'pcie_replay_rover_count_acc' (Rollover count) from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'pcie_replay_rover_count_acc' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] pcie_count_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc(amdsmi_processor_handle processor_handle, uint64_t* pcie_count_acc_value); + +/** + * @brief Get the 'curr_uclk' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'curr_uclk' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] uclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_uclk(amdsmi_processor_handle processor_handle, uint16_t* uclk_value); + + +/****** + * Metric multi-valued counter types + */ + +/** + * @brief Get the 'temp_hbm' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'temp_hbm' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] temp_hbm_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (AMDSMI_NUM_HBM_INSTANCES) + * element array (gpu_metric_temp_hbm_t) + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_hbm(amdsmi_processor_handle processor_handle, gpu_metric_temp_hbm_t* temp_hbm_value); + +/** + * @brief Get the 'vcn_activity' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'vcn_activity' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] vcn_activity_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (AMDSMI_MAX_NUM_VCN) + * element array (gpu_metric_vcn_activity_t) + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_vcn_activity(amdsmi_processor_handle processor_handle, gpu_metric_vcn_activity_t* vcn_activity_value); + +/** + * @brief Get the 'xgmi_read_data' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'xgmi_read_data' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] xgmi_read_data_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding an 8 (AMDSMI_MAX_NUM_XGMI_LINKS) + * element array (gpu_metric_xgmi_read_data_acc_t) + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_read_data(amdsmi_processor_handle processor_handle, gpu_metric_xgmi_read_data_acc_t* xgmi_read_data_acc_value); + +/** + * @brief Get the 'xgmi_write_data' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'xgmi_write_data' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] xgmi_write_data_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding an 8 (AMDSMI_MAX_NUM_XGMI_LINKS) + * element array (gpu_metric_xgmi_write_data_acc_t) + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_write_data(amdsmi_processor_handle processor_handle, gpu_metric_xgmi_write_data_acc_t* xgmi_write_data_acc_value); + +/** + * @brief Get the 'curr_gfxclk' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'curr_gfxclk' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] current_gfxclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding an 8 (AMDSMI_MAX_NUM_GFX_CLKS) + * element array (gpu_metric_curr_gfxclk_t) + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_gfxclk(amdsmi_processor_handle processor_handle, gpu_metric_curr_gfxclk_t* current_gfxclk_value); + +/** + * @brief Get the 'curr_socclk' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'curr_socclk' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] current_socclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (AMDSMI_MAX_NUM_CLKS) + * element array (gpu_metric_curr_socclk_t) + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_socclk(amdsmi_processor_handle processor_handle, gpu_metric_curr_socclk_t* current_socclk_value); + +/** + * @brief Get the 'curr_vclk0' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'curr_vclk0' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] current_vclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (AMDSMI_MAX_NUM_CLKS) + * element array (gpu_metric_curr_vclk0_t) + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_vclk0(amdsmi_processor_handle processor_handle, gpu_metric_curr_vclk0_t* current_vclk_value); + +/** + * @brief Get the 'curr_dclk0' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'curr_dclk0' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] current_dclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (AMDSMI_MAX_NUM_CLKS) + * element array (gpu_metric_curr_dclk0_t) + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_dclk0(amdsmi_processor_handle processor_handle, gpu_metric_curr_dclk0_t* current_dclk_value); + +/** + * @brief Get the 'temp_edge' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'temp_edge' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] edge_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_edge(amdsmi_processor_handle processor_handle, uint16_t* edge_value); + +/** + * @brief Get the 'temp_vrgfx' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'temp_vrgfx' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] vrgfx_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_vrgfx(amdsmi_processor_handle processor_handle, uint16_t* vrgfx_value); + +/** + * @brief Get the 'temp_vrmem' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'temp_vrmem' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] vrmem_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_vrmem(amdsmi_processor_handle processor_handle, uint16_t* vrmem_value); + +/** + * @brief Get the 'avg_mm_activity' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'avg_mm_activity' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] mm_activity_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_mm_activity(amdsmi_processor_handle processor_handle, uint16_t* mm_activity_value); + +/** + * @brief Get the 'curr_vclk1' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'curr_vclk1' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] current_vclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_vclk1(amdsmi_processor_handle processor_handle, uint16_t* current_vclk_value); + +/** + * @brief Get the 'curr_dclk1' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'curr_dclk1' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] current_dclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_dclk1(amdsmi_processor_handle processor_handle, uint16_t* current_dclk_value); + +/** + * @brief Get the 'indep_throttle_status' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint64_t in which + * the 'indep_throttle_status' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] throttle_status_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_indep_throttle_status(amdsmi_processor_handle processor_handle, uint64_t* throttle_status_value); + +/** + * @brief Get the 'avg_socket_power' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'avg_socket_power' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] socket_power_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_socket_power(amdsmi_processor_handle processor_handle, uint16_t* socket_power_value); + +/** + * @brief Get the 'curr_fan_speed' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'curr_fan_speed' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] fan_speed_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_fan_speed(amdsmi_processor_handle processor_handle, uint16_t* fan_speed_value); + +/** + * @brief Get the 'avg_gfx_clock_frequency' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'avg_gfx_clock_frequency' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_gfx_clock_frequency(amdsmi_processor_handle processor_handle, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_soc_clock_frequency' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'avg_soc_clock_frequency' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_soc_clock_frequency(amdsmi_processor_handle processor_handle, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_uclock_frequency' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'avg_uclock_frequency' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_uclock_frequency(amdsmi_processor_handle processor_handle, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_vclock0_frequency' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'avg_vclock0_frequency' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_vclock0_frequency(amdsmi_processor_handle processor_handle, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_dclock0_frequency' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'avg_dclock0_frequency' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_dclock0_frequency(amdsmi_processor_handle processor_handle, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_vclock1_frequency' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'avg_vclock1_frequency' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_vclock1_frequency(amdsmi_processor_handle processor_handle, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_dclock1_frequency' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'avg_dclock1_frequency' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_dclock1_frequency(amdsmi_processor_handle processor_handle, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'volt_soc' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'volt_soc' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] voltage_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_volt_soc(amdsmi_processor_handle processor_handle, uint16_t* voltage_value); + +/** + * @brief Get the 'volt_gfx' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'volt_gfx' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] voltage_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_volt_gfx(amdsmi_processor_handle processor_handle, uint16_t* voltage_value); + +/** + * @brief Get the 'volt_mem' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'volt_mem' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] voltage_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_volt_mem(amdsmi_processor_handle processor_handle, uint16_t* voltage_value); + +/** + * @brief Get the 'metrics_header_info' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a amd_metrics_table_header_t in which + * the 'metrics_header_info' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] header_value a pointer to amd_metrics_table_header_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_header_info(amdsmi_processor_handle processor_handle, amd_metrics_table_header_t* header_value); + +/** + * @brief Get the 'xcd_counter' from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle and a pointer to a uint16_t in which + * the 'xcd_counter' will stored + * + * @param[in] processor_handle Device which to query + * + * @param[inout] xcd_counter_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * ::AMDSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_xcd_counter(amdsmi_processor_handle processor_handle, uint16_t* xcd_counter_value); + +/** + * @brief Get the log from the GPU metrics associated with the device + * + * @details Given a processor handle @p processor_handle it will log all the gpu metric info + * related to the device. The 'logging' feature must be on. + * + * @param[in] processor_handle Device which to query + * + * @retval ::AMDSMI_STATUS_SUCCESS is returned upon successful call. + * + */ +amdsmi_status_t +amdsmi_get_gpu_metrics_log(amdsmi_processor_handle processor_handle); + +/** @} End metricfunctions */ + + #ifdef ENABLE_ESMI_LIB /*---------------------------------------------------------------------------*/ /** @defgroup energyinfo Energy information (RAPL MSR) */ diff --git a/include/amd_smi/impl/amd_smi_common.h b/include/amd_smi/impl/amd_smi_common.h index 3a93823f7d..16362a157a 100644 --- a/include/amd_smi/impl/amd_smi_common.h +++ b/include/amd_smi/impl/amd_smi_common.h @@ -56,6 +56,7 @@ const std::map rsmi_status_map = { {RSMI_STATUS_SUCCESS, AMDSMI_STATUS_SUCCESS}, {RSMI_STATUS_INVALID_ARGS, AMDSMI_STATUS_INVAL}, {RSMI_STATUS_NOT_SUPPORTED, AMDSMI_STATUS_NOT_SUPPORTED}, + {RSMI_STATUS_FILE_ERROR, AMDSMI_STATUS_FILE_ERROR}, {RSMI_STATUS_PERMISSION, AMDSMI_STATUS_NO_PERM}, {RSMI_STATUS_OUT_OF_RESOURCES, AMDSMI_STATUS_OUT_OF_RESOURCES}, {RSMI_STATUS_INTERNAL_EXCEPTION, AMDSMI_STATUS_INTERNAL_EXCEPTION}, @@ -71,6 +72,8 @@ const std::map rsmi_status_map = { {RSMI_STATUS_UNEXPECTED_DATA, AMDSMI_STATUS_UNEXPECTED_DATA}, {RSMI_STATUS_BUSY, AMDSMI_STATUS_BUSY}, {RSMI_STATUS_REFCOUNT_OVERFLOW, AMDSMI_STATUS_REFCOUNT_OVERFLOW}, + {RSMI_STATUS_SETTING_UNAVAILABLE, AMDSMI_STATUS_SETTING_UNAVAILABLE}, + {RSMI_STATUS_AMDGPU_RESTART_ERR, AMDSMI_STATUS_AMDGPU_RESTART_ERR}, {RSMI_STATUS_UNKNOWN_ERROR, AMDSMI_STATUS_UNKNOWN_ERROR}, }; diff --git a/py-interface/README.md b/py-interface/README.md index 01a23e4bb8..dbe0e9fa0b 100644 --- a/py-interface/README.md +++ b/py-interface/README.md @@ -1783,7 +1783,7 @@ except AmdSmiException as e: print(e) ``` -## amdsmi_is_gpu_power_management_enabled +### amdsmi_is_gpu_power_management_enabled Description: Returns is power management enabled @@ -2152,7 +2152,28 @@ Field | Description `padding` | padding `gfx_activity_acc` | gfx activity acc `mem_activity_acc` | mem activity acc -`temperature_hbm` | hbm temperature +`temperature_hbm` | list of hbm temperatures +`firmware_timestamp` | timestamp from PMFW +`voltage_soc` | soc voltage +`voltage_gfx` | gfx voltage +`voltage_mem` | mem voltage +`indep_throttle_status` | asic independent throttle status +`current_socket_power` | current socket power +`vcn_activity` | list of encoding and decoding engine utilizations +`gfxclk_lock_status` | gfx clock lock status +`xgmi_link_width` | XGMI bus width +`xgmi_link_speed` | XGMI bitrate (in Gbps) +`pcie_bandwidth_acc` | PCIE accumulated bandwidth (GB/sec) +`pcie_bandwidth_inst` | PCIE instantaneous bandwidth (GB/sec) +`pcie_l0_to_recov_count_acc` | PCIE L0 to recovery state transition accumulated count +`pcie_replay_count_acc` | PCIE replay accumulated count +`pcie_replay_rover_count_acc` | PCIE replay rollover accumulated count +`xgmi_read_data_acc` | XGMI accumulated read data transfer size(KiloBytes) +`xgmi_write_data_acc` | XGMI accumulated write data transfer size(KiloBytes) +`current_gfxclks` | list of current gfx clock frequencies +`current_socclks` | list of current soc clock frequencies +`current_vclk0s` | list of current v0 clock frequencies +`current_dclk0s` | list of current d0 clock frequencies Exceptions that can be thrown by `amdsmi_get_gpu_metrics_info` function: @@ -3285,7 +3306,7 @@ except AmdSmiException as e: print(e) ``` -### amdsmi_dev_compute_partition_get +### amdsmi_get_gpu_compute_partition Description: Get the compute partition from the given GPU @@ -3295,7 +3316,7 @@ Input parameters: Output: String of the partition type -Exceptions that can be thrown by `amdsmi_dev_compute_partition_get` function: +Exceptions that can be thrown by `amdsmi_get_gpu_compute_partition` function: * `AmdSmiLibraryException` * `AmdSmiRetryException` @@ -3310,13 +3331,13 @@ try: print("No GPUs on machine") else: for device in devices: - compute_partition_type = amdsmi_dev_compute_partition_get(device) + compute_partition_type = amdsmi_get_gpu_compute_partition(device) print(compute_partition_type) except AmdSmiException as e: print(e) ``` -### amdsmi_dev_compute_partition_set +### amdsmi_set_gpu_compute_partition Description: Set the compute partition to the given GPU @@ -3327,7 +3348,7 @@ Input parameters: Output: String of the partition type -Exceptions that can be thrown by `amdsmi_dev_compute_partition_set` function: +Exceptions that can be thrown by `amdsmi_set_gpu_compute_partition` function: * `AmdSmiLibraryException` * `AmdSmiRetryException` @@ -3343,12 +3364,12 @@ try: print("No GPUs on machine") else: for device in devices: - amdsmi_dev_compute_partition_set(device, compute_partition) + amdsmi_set_gpu_compute_partition(device, compute_partition) except AmdSmiException as e: print(e) ``` -### amdsmi_dev_compute_partition_reset +### amdsmi_reset_gpu_compute_partition Description: Reset the compute partitioning on the given GPU @@ -3358,7 +3379,7 @@ Input parameters: Output: String of the partition type -Exceptions that can be thrown by `amdsmi_dev_compute_partition_reset` function: +Exceptions that can be thrown by `amdsmi_reset_gpu_compute_partition` function: * `AmdSmiLibraryException` * `AmdSmiRetryException` @@ -3373,12 +3394,12 @@ try: print("No GPUs on machine") else: for device in devices: - amdsmi_dev_compute_partition_reset(device) + amdsmi_reset_gpu_compute_partition(device) except AmdSmiException as e: print(e) ``` -### amdsmi_dev_memory_partition_get +### amdsmi_get_gpu_memory_partition Description: Get the memory partition from the given GPU @@ -3388,7 +3409,7 @@ Input parameters: Output: String of the partition type -Exceptions that can be thrown by `amdsmi_dev_memory_partition_get` function: +Exceptions that can be thrown by `amdsmi_get_gpu_memory_partition` function: * `AmdSmiLibraryException` * `AmdSmiRetryException` @@ -3403,13 +3424,13 @@ try: print("No GPUs on machine") else: for device in devices: - memory_partition_type = amdsmi_dev_memory_partition_get(device) + memory_partition_type = amdsmi_get_gpu_memory_partition(device) print(memory_partition_type) except AmdSmiException as e: print(e) ``` -### amdsmi_dev_memory_partition_set +### amdsmi_set_gpu_memory_partition Description: Set the memory partition to the given GPU @@ -3420,7 +3441,7 @@ Input parameters: Output: String of the partition type -Exceptions that can be thrown by `amdsmi_dev_memory_partition_set` function: +Exceptions that can be thrown by `amdsmi_set_gpu_memory_partition` function: * `AmdSmiLibraryException` * `AmdSmiRetryException` @@ -3436,12 +3457,12 @@ try: print("No GPUs on machine") else: for device in devices: - amdsmi_dev_memory_partition_set(device, memory_partition) + amdsmi_set_gpu_memory_partition(device, memory_partition) except AmdSmiException as e: print(e) ``` -### amdsmi_dev_memory_partition_reset +### amdsmi_reset_gpu_memory_partition Description: Reset the memory partitioning on the given GPU @@ -3451,7 +3472,7 @@ Input parameters: Output: String of the partition type -Exceptions that can be thrown by `amdsmi_dev_memory_partition_reset` function: +Exceptions that can be thrown by `amdsmi_reset_gpu_memory_partition` function: * `AmdSmiLibraryException` * `AmdSmiRetryException` @@ -3466,7 +3487,7 @@ try: print("No GPUs on machine") else: for device in devices: - amdsmi_dev_memory_partition_reset(device) + amdsmi_reset_gpu_memory_partition(device) except AmdSmiException as e: print(e) ``` @@ -3512,6 +3533,1592 @@ except AmdSmiException as e: print(e) ``` +## GPU Metrics APIs + +### amdsmi_get_gpu_metrics_temp_hotspot + +Description: Get the hotspot temperature in degrees Celsius + +Input parameters: + +* `processor_handle` device which to query + +Output: hotspot temperature in degrees Celsius + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_temp_hotspot` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + hotspot_temp = amdsmi_get_gpu_metrics_temp_hotspot(device) + print(hotspot_temp) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_temp_mem + +Description: Get the memory temperature in degrees Celsius + +Input parameters: + +* `processor_handle` device which to query + +Output: memory temperature in degrees Celsius + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_temp_mem` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + mem_temp = amdsmi_get_gpu_metrics_temp_mem(device) + print(mem_temp) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_temp_vrsoc + +Description: Get the VRSOC temperature in degrees Celsius + +Input parameters: + +* `processor_handle` device which to query + +Output: VRSOC temperature in degrees Celsius + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_temp_vrsoc` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + vrsoc_temp = amdsmi_get_gpu_metrics_temp_vrsoc(device) + print(vrsoc_temp) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_curr_socket_power + +Description: Get the current socket power in Watts + +Input parameters: + +* `processor_handle` device which to query + +Output: current socket power in Watts + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_curr_socket_power` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + curr_socket_power = amdsmi_get_gpu_metrics_curr_socket_power(device) + print(curr_socket_power) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_gfx_activity + +Description: Get the average GFX activity in percent + +Input parameters: + +* `processor_handle` device which to query + +Output: average GFX activity in percent + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_gfx_activity` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_gfx_activity = amdsmi_get_gpu_metrics_avg_gfx_activity(device) + print(avg_gfx_activity) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_umc_activity + +Description: Get the average UMC activity in percent + +Input parameters: + +* `processor_handle` device which to query + +Output: average UMC activity in percent + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_umc_activity` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_umc_activity = amdsmi_get_gpu_metrics_avg_umc_activity(device) + print(avg_umc_activity) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_energy_acc + +Description: Get the average energy accumulator in millijoules (check unit) + +Input parameters: + +* `processor_handle` device which to query + +Output: average energy accumulator in millijoules (check unit) + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_energy_acc` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_energy_acc = amdsmi_get_gpu_metrics_avg_energy_acc(device) + print(avg_energy_acc) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_system_clock_counter + +Description: Get the system clock counter + +Input parameters: + +* `processor_handle` device which to query + +Output: system clock counter + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_system_clock_counter` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + system_clock_counter = amdsmi_get_gpu_metrics_system_clock_counter(device) + print(system_clock_counter) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_firmware_timestamp + +Description: Get the firmware timestamp + +Input parameters: + +* `processor_handle` device which to query + +Output: firmware timestamp + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_firmware_timestamp` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + + firmware_timestamp = amdsmi_get_gpu_metrics_firmware_timestamp(device) + print(firmware_timestamp) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_throttle_status + +Description: Get the throttle status + +Input parameters: + +* `processor_handle` device which to query + +Output: True if throttled, False if it's not throttled + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_throttle_status` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + throttle_status = amdsmi_get_gpu_metrics_throttle_status(device) + print(throttle_status) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_pcie_link_width + +Description: Get the pcie link width + +Input parameters: + +* `processor_handle` device which to query + +Output: pcie link width + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_pcie_link_width` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + pcie_link_width = amdsmi_get_gpu_metrics_pcie_link_width(device) + print(pcie_link_width) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_pcie_link_speed + +Description: Get the pcie link speed + +Input parameters: + +* `processor_handle` device which to query + +Output: pcie link speed + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_pcie_link_speed` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + pcie_link_speed = amdsmi_get_gpu_metrics_pcie_link_speed(device) + print(pcie_link_speed) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_xgmi_link_width + +Description: Get the xgmi link width + +Input parameters: + +* `processor_handle` device which to query + +Output: xgmi link width + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_xgmi_link_width` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + xgmi_link_width = amdsmi_get_gpu_metrics_xgmi_link_width(device) + print(xgmi_link_width) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_xgmi_link_speed + +Description: Get the xgmi link speed + +Input parameters: + +* `processor_handle` device which to query + +Output: xgmi link speed + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_xgmi_link_speed` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + xgmi_link_speed = amdsmi_get_gpu_metrics_xgmi_link_speed(device) + print(xgmi_link_speed) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_gfxclk_lock_status + +Description: Get the lock status of the gfx clock + +Input parameters: + +* `processor_handle` device which to query + +Output: True if gfx clock is locked, False if it's not locked, raise if not supported + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_gfxclk_lock_status` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + lock_status = amdsmi_get_gpu_metrics_gfxclk_lock_status(device) + print(lock_status) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_gfx_activity_acc + +Description: Get accumulated gfx activity + +Input parameters: + +* `processor_handle` device which to query + +Output: accumulated gfx activity + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_gfx_activity_acc` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + gfx_activity_acc = amdsmi_get_gpu_metrics_gfx_activity_acc(device) + print(gfx_activity_acc) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_mem_activity_acc + +Description: Get accumulated memory activity + +Input parameters: + +* `processor_handle` device which to query + +Output: accumulated mem activity + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_mem_activity_acc` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + mem_activity_acc = amdsmi_get_gpu_metrics_mem_activity_acc(device) + print(mem_activity_acc) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_pcie_bandwidth_acc + +Description: Get accumulated pcie bandwidth activity + +Input parameters: + +* `processor_handle` device which to query + +Output: accumulated pcie bandwidth activity + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_pcie_bandwidth_acc` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + pcie_bandwidth_acc = amdsmi_get_gpu_metrics_pcie_bandwidth_acc(device) + print(pcie_bandwidth_acc) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_pcie_bandwidth_inst + +Description: Get instantaneous pcie bandwidth activity + +Input parameters: + +* `processor_handle` device which to query + +Output: instantaneous pcie bandwidth activity + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_pcie_bandwidth_inst` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + pcie_bandwidth_inst = amdsmi_get_gpu_metrics_pcie_bandwidth_inst(device) + print(pcie_bandwidth_inst) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_pcie_l0_recov_count + +Description: Get count of pcie l0 recovery count errors + +Input parameters: + +* `processor_handle` device which to query + +Output: number of l0 recovery count errors + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_pcie_l0_recov_count` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + pcie_l0_recov_count = amdsmi_get_gpu_metrics_pcie_l0_recov_count(device) + print(pcie_l0_recov_count) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_pcie_replay_count_acc + +Description: Get accumulated pcie replay counts + +Input parameters: + +* `processor_handle` device which to query + +Output: accumulated pcie replay counts + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_pcie_replay_count_acc` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + pcie_replay_count_acc = amdsmi_get_gpu_metrics_pcie_replay_count_acc(device) + print(pcie_replay_count_acc) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc + +Description: Get accumulated pcie replay rollover counts + +Input parameters: + +* `processor_handle` device which to query + +Output: accumulated pcie replay rollover counts + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + pcie_replay_rover_count_acc = amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc(device) + print(pcie_replay_rover_count_acc) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_curr_uclk + +Description: Get the current u clock frequency + +Input parameters: + +* `processor_handle` device which to query + +Output: Current u clock frequency + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_curr_uclk` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + curr_uclk = amdsmi_get_gpu_metrics_curr_uclk(device) + print(curr_uclk) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_temp_hbm + +Description: Get the HBM temperatures in degrees Celsius + +Input parameters: + +* `processor_handle` device which to query + +Output: list of HBM temperatures in degrees Celsius + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_temp_hbm` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + hbm_temp = amdsmi_get_gpu_metrics_temp_hbm(device) + print(hbm_temp) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_vcn_activity + +Description: Get the activity for each vcn encoding engine + +Input parameters: + +* `processor_handle` device which to query + +Output: list of vcn activities + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_vcn_activity` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + vcn_activity = amdsmi_get_gpu_metrics_vcn_activity(device) + print(vcn_activity) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_xgmi_read_data + +Description: Get the accumulated read xgmi data for each xgmi link + +Input parameters: + +* `processor_handle` device which to query + +Output: list of accumulated read xgmi data + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_xgmi_read_data` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + xgmi_read_data = amdsmi_get_gpu_metrics_xgmi_read_data(device) + print(xgmi_read_data) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_xgmi_write_data + +Description: Get the accumulated written xgmi data for each xgmi link + +Input parameters: + +* `processor_handle` device which to query + +Output: list of accumulated written xgmi data + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_xgmi_write_data` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + xgmi_write_data = amdsmi_get_gpu_metrics_xgmi_write_data(device) + print(xgmi_write_data) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_curr_gfxclk + +Description: Get the current gfx clock frequency + +Input parameters: + +* `processor_handle` device which to query + +Output: Current gfx clock frequency + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_curr_gfxclk` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + curr_gfxclk = amdsmi_get_gpu_metrics_curr_gfxclk(device) + print(curr_gfxclk) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_curr_socclk + +Description: Get the current soc clock frequency + +Input parameters: + +* `processor_handle` device which to query + +Output: Current soc clock frequency + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_curr_socclk` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + curr_socclk = amdsmi_get_gpu_metrics_curr_socclk(device) + print(curr_socclk) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_curr_vclk0 + +Description: Get the current v0 clock frequency + +Input parameters: + +* `processor_handle` device which to query + +Output: Current v0 clock frequency + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_curr_vclk0` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + curr_vclk0 = amdsmi_get_gpu_metrics_curr_vclk0(device) + print(curr_vclk0) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_curr_dclk0 + +Description: Get the current d0 clock frequency + +Input parameters: + +* `processor_handle` device which to query + +Output: Current d0 clock frequency + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_curr_dclk0` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + curr_dclk0 = amdsmi_get_gpu_metrics_curr_dclk0(device) + print(curr_dclk0) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_temp_edge + +Description: Get the edge temperature in degrees Celsius + +Input parameters: + +* `processor_handle` device which to query + +Output: edge temperature in degrees Celsius + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_temp_edge` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + edge_temp = amdsmi_get_gpu_metrics_temp_edge(device) + print(edge_temp) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_temp_vr_gfx + +Description: Get the VR GFX temperature in degrees Celsius + +Input parameters: + +* `processor_handle` device which to query + +Output: VR GFX temperature in degrees Celsius + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_temp_vr_gfx` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + vr_gfx_temp = amdsmi_get_gpu_metrics_temp_vr_gfx(device) + print(vr_gfx_temp) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_temp_vr_mem + +Description: Get the VR MEM temperature in degrees Celsius + +Input parameters: + +* `processor_handle` device which to query + +Output: VR MEM temperature in degrees Celsius + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_temp_vr_mem` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + vr_mem_temp = amdsmi_get_gpu_metrics_temp_vr_mem(device) + print(vr_mem_temp) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_mm_activity + +Description: Get the average MM activity in percent + +Input parameters: + +* `processor_handle` device which to query + +Output: average MM activity in percent + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_mm_activity` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_mm_activity = amdsmi_get_gpu_metrics_avg_mm_activity(device) + print(avg_mm_activity) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_curr_vclk1 + +Description: Get the current v1 clock frequency + +Input parameters: + +* `processor_handle` device which to query + +Output: Current v1 clock frequency + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_curr_vclk1` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + curr_vclk1 = amdsmi_get_gpu_metrics_curr_vclk1(device) + print(curr_vclk1) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_curr_dclk1 + +Description: Get the current d1 clock frequency + +Input parameters: + +* `processor_handle` device which to query + +Output: Current d1 clock frequency + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_curr_dclk1` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + curr_dclk1 = amdsmi_get_gpu_metrics_curr_dclk1(device) + print(curr_dclk1) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_indep_throttle_status + +Description: Get the independent throttle status + +Input parameters: + +* `processor_handle` device which to query + +Output: True if throttled, False if it's not throttled + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_indep_throttle_status` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + throttle_status = amdsmi_get_gpu_metrics_indep_throttle_status(device) + print(throttle_status) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_socket_power + +Description: Get the average socket power in Watts + +Input parameters: + +* `processor_handle` device which to query + +Output: average socket power in Watts + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_socket_power` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_socket_power = amdsmi_get_gpu_metrics_avg_socket_power(device) + print(avg_socket_power) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_curr_fan_speed + +Description: Get the current fan speed in percent + +Input parameters: + +* `processor_handle` device which to query + +Output: current fan speed in percent + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_curr_fan_speed` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + curr_fan_speed = amdsmi_get_gpu_metrics_curr_fan_speed(device) + print(curr_fan_speed) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_gfx_clock_frequency + +Description: Get the average gfx clock frequency in MHz + +Input parameters: + +* `processor_handle` device which to query + +Output: average gfx clock frequency in MHz + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_gfx_clock_frequency` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_gfx_clock_frequency = amdsmi_get_gpu_metrics_avg_gfx_clock_frequency(device) + print(avg_gfx_clock_frequency) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_soc_clock_frequency + +Description: Get the average soc clock frequency in MHz + +Input parameters: + +* `processor_handle` device which to query + +Output: average soc clock frequency in MHz + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_soc_clock_frequency` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_soc_clock_frequency = amdsmi_get_gpu_metrics_avg_soc_clock_frequency(device) + print(avg_soc_clock_frequency) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_uclock_frequency + +Description: Get the average u clock frequency in MHz + +Input parameters: + +* `processor_handle` device which to query + +Output: average u clock frequency in MHz + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_uclock_frequency` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_uclock_frequency = amdsmi_get_gpu_metrics_avg_uclock_frequency(device) + print(avg_uclock_frequency) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_vclock0_frequency + +Description: Get the average v0 clock frequency in MHz + +Input parameters: + +* `processor_handle` device which to query + +Output: average v0 clock frequency in MHz + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_vclock0_frequency` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_vclock0_frequency = amdsmi_get_gpu_metrics_avg_vclock0_frequency(device) + print(avg_vclock0_frequency) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_dclock0_frequency + +Description: Get the average d0 clock frequency in MHz + +Input parameters: + +* `processor_handle` device which to query + +Output: average d0 clock frequency in MHz + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_dclock0_frequency` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_dclock0_frequency = amdsmi_get_gpu_metrics_avg_dclock0_frequency(device) + print(avg_dclock0_frequency) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_vclock1_frequency + +Description: Get the average v1 clock frequency in MHz + +Input parameters: + +* `processor_handle` device which to query + +Output: average v1 clock frequency in MHz + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_vclock1_frequency` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_vclock1_frequency = amdsmi_get_gpu_metrics_avg_vclock1_frequency(device) + print(avg_vclock1_frequency) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_avg_dclock1_frequency + +Description: Get the average d1 clock frequency in MHz + +Input parameters: + +* `processor_handle` device which to query + +Output: average d1 clock frequency in MHz + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_avg_dclock1_frequency` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + avg_dclock1_frequency = amdsmi_get_gpu_metrics_avg_dclock1_frequency(device) + print(avg_dclock1_frequency) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_volt_soc + +Description: Get the soc voltage in millivolts + +Input parameters: + +* `processor_handle` device which to query + +Output: soc voltage in millivolts + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_volt_soc` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + volt_soc = amdsmi_get_gpu_metrics_volt_soc(device) + print(volt_soc) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_volt_gfx + +Description: Get the gfx voltage in millivolts + +Input parameters: + +* `processor_handle` device which to query + +Output: gfx voltage in millivolts + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_volt_gfx` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + volt_gfx = amdsmi_get_gpu_metrics_volt_gfx(device) + print(volt_gfx) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_volt_mem + +Description: Get the mem voltage in millivolts + +Input parameters: + +* `processor_handle` device which to query + +Output: mem voltage in millivolts + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_volt_mem` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + volt_mem = amdsmi_get_gpu_metrics_volt_mem(device) + print(volt_mem) +except AmdSmiException as e: + print(e) +``` + +### amdsmi_get_gpu_metrics_header_info + +Description: Get the gpu metrics structure header info + +Input parameters: + +* `processor_handle` device which to query + +Output: dictionary of gpu metrics header information + +Exceptions that can be thrown by `amdsmi_get_gpu_metrics_header_info` function: + +* `AmdSmiLibraryException` +* `AmdSmiRetryException` +* `AmdSmiParameterException` + +Example: + +```python +try: + devices = amdsmi_get_processor_handles() + if len(devices) == 0: + print("No GPUs on the machine") + else: + for device in devices: + header_info = amdsmi_get_gpu_metrics_header_info(device) + print(header_info) +except AmdSmiException as e: + print(e) +``` + +## CPU APIs + ### amdsmi_get_cpusocket_handles **Note: CURRENTLY HARDCODED TO RETURN DUMMY DATA** diff --git a/py-interface/__init__.py b/py-interface/__init__.py index ba2b0c6e38..4d98d7fddd 100644 --- a/py-interface/__init__.py +++ b/py-interface/__init__.py @@ -130,7 +130,6 @@ from .amdsmi_interface import amdsmi_get_gpu_volt_metric # # Clock, Power and Performance Query from .amdsmi_interface import amdsmi_get_utilization_count from .amdsmi_interface import amdsmi_get_gpu_perf_level -from .amdsmi_interface import amdsmi_set_gpu_perf_determinism_mode from .amdsmi_interface import amdsmi_get_gpu_overdrive_level from .amdsmi_interface import amdsmi_get_clk_freq from .amdsmi_interface import amdsmi_get_gpu_od_volt_info @@ -195,6 +194,59 @@ from .amdsmi_interface import amdsmi_topo_get_link_type from .amdsmi_interface import amdsmi_is_P2P_accessible from .amdsmi_interface import amdsmi_get_xgmi_info +# # Individual GPU Metrics Functions +from .amdsmi_interface import amdsmi_get_gpu_metrics_temp_hotspot +from .amdsmi_interface import amdsmi_get_gpu_metrics_temp_mem +from .amdsmi_interface import amdsmi_get_gpu_metrics_temp_vrsoc +from .amdsmi_interface import amdsmi_get_gpu_metrics_curr_socket_power +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_gfx_activity +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_umc_activity +from .amdsmi_interface import amdsmi_get_gpu_metrics_energy_acc +from .amdsmi_interface import amdsmi_get_gpu_metrics_system_clock_counter +from .amdsmi_interface import amdsmi_get_gpu_metrics_firmware_timestamp +from .amdsmi_interface import amdsmi_get_gpu_metrics_throttle_status +from .amdsmi_interface import amdsmi_get_gpu_metrics_pcie_link_width +from .amdsmi_interface import amdsmi_get_gpu_metrics_pcie_link_speed +from .amdsmi_interface import amdsmi_get_gpu_metrics_xgmi_link_width +from .amdsmi_interface import amdsmi_get_gpu_metrics_xgmi_link_speed +from .amdsmi_interface import amdsmi_get_gpu_metrics_gfxclk_lock_status +from .amdsmi_interface import amdsmi_get_gpu_metrics_gfx_activity_acc +from .amdsmi_interface import amdsmi_get_gpu_metrics_mem_activity_acc +from .amdsmi_interface import amdsmi_get_gpu_metrics_pcie_bandwidth_acc +from .amdsmi_interface import amdsmi_get_gpu_metrics_pcie_bandwidth_inst +from .amdsmi_interface import amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc +from .amdsmi_interface import amdsmi_get_gpu_metrics_pcie_replay_count_acc +from .amdsmi_interface import amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc +from .amdsmi_interface import amdsmi_get_gpu_metrics_curr_uclk +from .amdsmi_interface import amdsmi_get_gpu_metrics_temp_hbm +from .amdsmi_interface import amdsmi_get_gpu_metrics_vcn_activity +from .amdsmi_interface import amdsmi_get_gpu_metrics_xgmi_read_data +from .amdsmi_interface import amdsmi_get_gpu_metrics_xgmi_write_data +from .amdsmi_interface import amdsmi_get_gpu_metrics_curr_gfxclk +from .amdsmi_interface import amdsmi_get_gpu_metrics_curr_socclk +from .amdsmi_interface import amdsmi_get_gpu_metrics_curr_vclk0 +from .amdsmi_interface import amdsmi_get_gpu_metrics_curr_dclk0 +from .amdsmi_interface import amdsmi_get_gpu_metrics_temp_edge +from .amdsmi_interface import amdsmi_get_gpu_metrics_temp_vrgfx +from .amdsmi_interface import amdsmi_get_gpu_metrics_temp_vrmem +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_mm_activity +from .amdsmi_interface import amdsmi_get_gpu_metrics_curr_vclk1 +from .amdsmi_interface import amdsmi_get_gpu_metrics_curr_dclk1 +from .amdsmi_interface import amdsmi_get_gpu_metrics_indep_throttle_status +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_socket_power +from .amdsmi_interface import amdsmi_get_gpu_metrics_curr_fan_speed +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_gfx_clock_frequency +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_soc_clock_frequency +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_uclock_frequency +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_vclock0_frequency +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_dclock0_frequency +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_vclock1_frequency +from .amdsmi_interface import amdsmi_get_gpu_metrics_avg_dclock1_frequency +from .amdsmi_interface import amdsmi_get_gpu_metrics_volt_soc +from .amdsmi_interface import amdsmi_get_gpu_metrics_volt_gfx +from .amdsmi_interface import amdsmi_get_gpu_metrics_volt_mem +from .amdsmi_interface import amdsmi_get_gpu_metrics_header_info + # # Enums from .amdsmi_interface import AmdSmiInitFlags from .amdsmi_interface import AmdSmiContainerTypes diff --git a/py-interface/amdsmi_interface.py b/py-interface/amdsmi_interface.py index 71ae0ffd71..924c782e5d 100644 --- a/py-interface/amdsmi_interface.py +++ b/py-interface/amdsmi_interface.py @@ -30,6 +30,14 @@ from .amdsmi_exception import * MAX_NUM_PROCESSES = 1024 +# gpu metrics macros defined in amdsmi.h +AMDSMI_NUM_HBM_INSTANCES = 4 +AMDSMI_MAX_NUM_VCN = 4 +AMDSMI_MAX_NUM_CLKS = 4 +AMDSMI_MAX_NUM_XGMI_LINKS = 8 +AMDSMI_MAX_NUM_GFX_CLKS = 8 + + class AmdSmiInitFlags(IntEnum): INIT_ALL_PROCESSORS = amdsmi_wrapper.AMDSMI_INIT_ALL_PROCESSORS INIT_AMD_CPUS = amdsmi_wrapper.AMDSMI_INIT_AMD_CPUS @@ -338,6 +346,7 @@ 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 + class AmdSmiProcessorType(IntEnum): UNKNOWN = amdsmi_wrapper.UNKNOWN AMD_GPU = amdsmi_wrapper.AMD_GPU @@ -1311,6 +1320,9 @@ def amdsmi_get_gpu_cache_info( "cpu_cache": cpu_cache, "simd_cache": simd_cache} + if cache_info_dict == {}: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NO_DATA) + return cache_info_dict @@ -1633,6 +1645,7 @@ def amdsmi_get_power_info( ) return { + "current_socket_power": power_measure.current_socket_power, "average_socket_power": power_measure.average_socket_power, "gfx_voltage": power_measure.gfx_voltage, "soc_voltage": power_measure.soc_voltage, @@ -1997,7 +2010,7 @@ def amdsmi_is_P2P_accessible( return accessible.value -def amdsmi_dev_compute_partition_get(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): +def amdsmi_get_gpu_compute_partition(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): raise AmdSmiParameterException( processor_handle, amdsmi_wrapper.amdsmi_processor_handle @@ -2009,7 +2022,7 @@ def amdsmi_dev_compute_partition_get(processor_handle: amdsmi_wrapper.amdsmi_pro compute_partition = ctypes.create_string_buffer(_AMDSMI_STRING_LENGTH) _check_res( - amdsmi_wrapper.amdsmi_dev_compute_partition_get( + amdsmi_wrapper.amdsmi_get_gpu_compute_partition( processor_handle, compute_partition, length ) ) @@ -2017,7 +2030,7 @@ def amdsmi_dev_compute_partition_get(processor_handle: amdsmi_wrapper.amdsmi_pro return compute_partition.value.decode("utf-8") -def amdsmi_dev_compute_partition_set(processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +def amdsmi_set_gpu_compute_partition(processor_handle: amdsmi_wrapper.amdsmi_processor_handle, compute_partition: AmdSmiComputePartitionType): if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): raise AmdSmiParameterException( @@ -2028,22 +2041,22 @@ def amdsmi_dev_compute_partition_set(processor_handle: amdsmi_wrapper.amdsmi_pro raise AmdSmiParameterException(compute_partition, AmdSmiComputePartitionType) _check_res( - amdsmi_wrapper.amdsmi_dev_compute_partition_set( + amdsmi_wrapper.amdsmi_set_gpu_compute_partition( processor_handle, compute_partition ) ) -def amdsmi_dev_compute_partition_reset(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): +def amdsmi_reset_gpu_compute_partition(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): raise AmdSmiParameterException( processor_handle, amdsmi_wrapper.amdsmi_processor_handle ) - _check_res(amdsmi_wrapper.amdsmi_dev_compute_partition_reset(processor_handle)) + _check_res(amdsmi_wrapper.amdsmi_reset_gpu_compute_partition(processor_handle)) -def amdsmi_dev_memory_partition_get(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): +def amdsmi_get_gpu_memory_partition(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): raise AmdSmiParameterException( processor_handle, amdsmi_wrapper.amdsmi_processor_handle @@ -2055,7 +2068,7 @@ def amdsmi_dev_memory_partition_get(processor_handle: amdsmi_wrapper.amdsmi_proc memory_partition = ctypes.create_string_buffer(_AMDSMI_STRING_LENGTH) _check_res( - amdsmi_wrapper.amdsmi_dev_memory_partition_get( + amdsmi_wrapper.amdsmi_get_gpu_memory_partition( processor_handle, memory_partition, length ) ) @@ -2063,7 +2076,7 @@ def amdsmi_dev_memory_partition_get(processor_handle: amdsmi_wrapper.amdsmi_proc return memory_partition.value.decode("utf-8") -def amdsmi_dev_memory_partition_set(processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +def amdsmi_set_gpu_memory_partition(processor_handle: amdsmi_wrapper.amdsmi_processor_handle, memory_partition: AmdSmiMemoryPartitionType): if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): raise AmdSmiParameterException( @@ -2074,19 +2087,19 @@ def amdsmi_dev_memory_partition_set(processor_handle: amdsmi_wrapper.amdsmi_proc raise AmdSmiParameterException(memory_partition, AmdSmiMemoryPartitionType) _check_res( - amdsmi_wrapper.amdsmi_dev_memory_partition_set( + amdsmi_wrapper.amdsmi_set_gpu_memory_partition( processor_handle, memory_partition ) ) -def amdsmi_dev_memory_partition_reset(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): +def amdsmi_reset_gpu_memory_partition(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): raise AmdSmiParameterException( processor_handle, amdsmi_wrapper.amdsmi_processor_handle ) - _check_res(amdsmi_wrapper.amdsmi_dev_memory_partition_reset(processor_handle)) + _check_res(amdsmi_wrapper.amdsmi_reset_gpu_memory_partition(processor_handle)) def amdsmi_get_xgmi_info(processor_handle: amdsmi_wrapper.amdsmi_processor_handle): @@ -2937,10 +2950,30 @@ def amdsmi_get_gpu_metrics_info( "current_fan_speed": gpu_metrics.current_fan_speed, "pcie_link_width": gpu_metrics.pcie_link_width, "pcie_link_speed": gpu_metrics.pcie_link_speed, - "padding": gpu_metrics.padding, "gfx_activity_acc": gpu_metrics.gfx_activity_acc, "mem_activity_acc": gpu_metrics.mem_activity_acc, "temperature_hbm": list(gpu_metrics.temperature_hbm), + "firmware_timestamp": gpu_metrics.firmware_timestamp, + "voltage_soc": gpu_metrics.voltage_soc, + "voltage_gfx": gpu_metrics.voltage_gfx, + "voltage_mem": gpu_metrics.voltage_mem, + "indep_throttle_status": gpu_metrics.indep_throttle_status, + "current_socket_power": gpu_metrics.current_socket_power, + "vcn_activity": list(gpu_metrics.vcn_activity), + "gfxclk_lock_status": gpu_metrics.gfxclk_lock_status, + "xgmi_link_width": gpu_metrics.xgmi_link_width, + "xgmi_link_speed": gpu_metrics.xgmi_link_speed, + "pcie_bandwidth_acc": gpu_metrics.pcie_bandwidth_acc, + "pcie_bandwidth_inst": gpu_metrics.pcie_bandwidth_inst, + "pcie_l0_to_recov_count_acc": gpu_metrics.pcie_l0_to_recov_count_acc, + "pcie_replay_count_acc": gpu_metrics.pcie_replay_count_acc, + "pcie_replay_rover_count_acc": gpu_metrics.pcie_replay_rover_count_acc, + "xgmi_read_data_acc": list(gpu_metrics.xgmi_read_data_acc), + "xgmi_write_data_acc": list(gpu_metrics.xgmi_write_data_acc), + "current_gfxclks": list(gpu_metrics.current_gfxclks), + "current_socclks": list(gpu_metrics.current_socclks), + "current_vclk0s": list(gpu_metrics.current_vclk0s), + "current_dclk0s": list(gpu_metrics.current_dclk0s), } @@ -3200,3 +3233,1076 @@ def amdsmi_get_gpu_memory_reserved_pages( table_records = _format_bad_page_info(retired_page_record, num_pages) return table_records + + +### Individual GPU Metrics Functions +def amdsmi_get_gpu_metrics_temp_hotspot( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + hotspot_value = ctypes.c_int16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_temp_hotspot( + processor_handle, ctypes.byref(hotspot_value) + ) + ) + + if hotspot_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return hotspot_value.value + + +def amdsmi_get_gpu_metrics_temp_mem( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + mem_value = ctypes.c_int16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_temp_mem( + processor_handle, ctypes.byref(mem_value) + ) + ) + + if mem_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return mem_value.value + + +def amdsmi_get_gpu_metrics_temp_vrsoc( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + vrsoc_value = ctypes.c_int16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_temp_vrsoc( + processor_handle, ctypes.byref(vrsoc_value) + ) + ) + + if vrsoc_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return vrsoc_value.value + + +def amdsmi_get_gpu_metrics_curr_socket_power( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + socket_power_value = ctypes.c_uint16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_curr_socket_power( + processor_handle, ctypes.byref(socket_power_value) + ) + ) + + if socket_power_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return socket_power_value.value + + +def amdsmi_get_gpu_metrics_avg_gfx_activity( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + gfx_activity_value = ctypes.c_uint16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_gfx_activity( + processor_handle, ctypes.byref(gfx_activity_value) + ) + ) + + if gfx_activity_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return gfx_activity_value.value + + +def amdsmi_get_gpu_metrics_avg_umc_activity( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + umc_activity_value = ctypes.c_uint16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_umc_activity( + processor_handle, ctypes.byref(umc_activity_value) + ) + ) + + if umc_activity_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return umc_activity_value.value + + +def amdsmi_get_gpu_metrics_energy_acc( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + energy_acc_value = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_energy_acc( + processor_handle, ctypes.byref(energy_acc_value) + ) + ) + + if energy_acc_value.value == 0xFFFFFFFFFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return energy_acc_value.value + + +def amdsmi_get_gpu_metrics_system_clock_counter( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + system_clock_counter_value = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_system_clock_counter( + processor_handle, ctypes.byref(system_clock_counter_value) + ) + ) + + if system_clock_counter_value.value == 0xFFFFFFFFFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return system_clock_counter_value.value + + +def amdsmi_get_gpu_metrics_firmware_timestamp( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + firmware_timestamp_value = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_firmware_timestamp( + processor_handle, ctypes.byref(firmware_timestamp_value) + ) + ) + + if firmware_timestamp_value.value == 0xFFFFFFFFFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return firmware_timestamp_value.value + + +def amdsmi_get_gpu_metrics_throttle_status( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> bool: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + throttle_status_value = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_throttle_status( + processor_handle, ctypes.byref(throttle_status_value) + ) + ) + + if throttle_status_value.value == 0xFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return bool(throttle_status_value.value) + + +def amdsmi_get_gpu_metrics_pcie_link_width( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + pcie_link_width_value = ctypes.c_uint16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_pcie_link_width( + processor_handle, ctypes.byref(pcie_link_width_value) + ) + ) + + if pcie_link_width_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return pcie_link_width_value.value + + +def amdsmi_get_gpu_metrics_pcie_link_speed( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + pcie_link_speed_value = ctypes.c_uint16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_pcie_link_speed( + processor_handle, ctypes.byref(pcie_link_speed_value) + ) + ) + + if pcie_link_speed_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return pcie_link_speed_value.value + + +def amdsmi_get_gpu_metrics_xgmi_link_width( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + xgmi_link_width_value = ctypes.c_uint16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_xgmi_link_width( + processor_handle, ctypes.byref(xgmi_link_width_value) + ) + ) + + if xgmi_link_width_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return xgmi_link_width_value.value + + +def amdsmi_get_gpu_metrics_xgmi_link_speed( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + xgmi_link_speed_value = ctypes.c_uint16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_xgmi_link_speed( + processor_handle, ctypes.byref(xgmi_link_speed_value) + ) + ) + + if xgmi_link_speed_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return xgmi_link_speed_value.value + + +def amdsmi_get_gpu_metrics_gfxclk_lock_status( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> bool: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + gfxclk_lock_status_value = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_gfxclk_lock_status( + processor_handle, ctypes.byref(gfxclk_lock_status_value) + ) + ) + + if gfxclk_lock_status_value.value == 0xFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return bool(gfxclk_lock_status_value.value) + + +def amdsmi_get_gpu_metrics_gfx_activity_acc( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + gfx_activity_acc_value = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_gfx_activity_acc( + processor_handle, ctypes.byref(gfx_activity_acc_value) + ) + ) + + if gfx_activity_acc_value.value == 0xFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return gfx_activity_acc_value.value + + +def amdsmi_get_gpu_metrics_mem_activity_acc( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + mem_activity_acc_value = ctypes.c_uint32() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_mem_activity_acc( + processor_handle, ctypes.byref(mem_activity_acc_value) + ) + ) + + if mem_activity_acc_value.value == 0xFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return mem_activity_acc_value.value + + +def amdsmi_get_gpu_metrics_pcie_bandwidth_acc( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + pcie_bandwidth_acc_value = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_pcie_bandwidth_acc( + processor_handle, ctypes.byref(pcie_bandwidth_acc_value) + ) + ) + + if pcie_bandwidth_acc_value.value == 0xFFFFFFFFFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return pcie_bandwidth_acc_value.value + + +def amdsmi_get_gpu_metrics_pcie_bandwidth_inst( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + pcie_bandwidth_inst_value = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_pcie_bandwidth_inst( + processor_handle, ctypes.byref(pcie_bandwidth_inst_value) + ) + ) + + if pcie_bandwidth_inst_value.value == 0xFFFFFFFFFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return pcie_bandwidth_inst_value.value + + +def amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + pcie_count_acc_value = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc( + processor_handle, ctypes.byref(pcie_count_acc_value) + ) + ) + + if pcie_count_acc_value.value == 0xFFFFFFFFFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return pcie_count_acc_value.value + + +def amdsmi_get_gpu_metrics_pcie_replay_count_acc( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + pcie_count_acc_value = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_pcie_replay_count_acc( + processor_handle, ctypes.byref(pcie_count_acc_value) + ) + ) + + if pcie_count_acc_value.value == 0xFFFFFFFFFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return pcie_count_acc_value.value + + +def amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + pcie_count_acc_value = ctypes.c_uint64() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc( + processor_handle, ctypes.byref(pcie_count_acc_value) + ) + ) + + if pcie_count_acc_value.value == 0xFFFFFFFFFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return pcie_count_acc_value.value + + +def amdsmi_get_gpu_metrics_curr_uclk( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + uclk_value = ctypes.c_uint16() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_curr_uclk( + processor_handle, ctypes.byref(uclk_value) + ) + ) + + if uclk_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return uclk_value.value + + +def amdsmi_get_gpu_metrics_temp_hbm( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> List[int]: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + temp_hbm_value = (ctypes.c_uint16 * AMDSMI_NUM_HBM_INSTANCES)() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_temp_hbm( + processor_handle, temp_hbm_value + ) + ) + + return [temp_hbm.value for temp_hbm in temp_hbm_value] + + +def amdsmi_get_gpu_metrics_vcn_activity( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> List[int]: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + vcn_activity_value = (ctypes.c_uint16 * AMDSMI_MAX_NUM_VCN)() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_vcn_activity( + processor_handle, vcn_activity_value + ) + ) + + return [vcn_activity.value for vcn_activity in vcn_activity_value] + + +def amdsmi_get_gpu_metrics_xgmi_read_data( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> List[int]: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + xgmi_write_data_acc_value = (ctypes.c_uint64 * AMDSMI_MAX_NUM_XGMI_LINKS)() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_xgmi_read_data( + processor_handle, xgmi_write_data_acc_value + ) + ) + + return [xgmi_read_data_acc.value for xgmi_read_data_acc in xgmi_write_data_acc_value] + + +def amdsmi_get_gpu_metrics_xgmi_write_data( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> List[int]: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + xgmi_write_data_acc_value = (ctypes.c_uint64 * AMDSMI_MAX_NUM_XGMI_LINKS)() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_xgmi_write_data( + processor_handle, xgmi_write_data_acc_value + ) + ) + + return [xgmi_write_data_acc.value for xgmi_write_data_acc in xgmi_write_data_acc_value] + + +def amdsmi_get_gpu_metrics_curr_gfxclk( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> List[int]: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + current_gfxclk_value = (ctypes.c_uint16 * AMDSMI_MAX_NUM_GFX_CLKS)() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_curr_gfxclk( + processor_handle, current_gfxclk_value + ) + ) + + return [curr_gfxclk.value for curr_gfxclk in current_gfxclk_value] + + +def amdsmi_get_gpu_metrics_curr_socclk( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> List[int]: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + current_socclk_value = (ctypes.c_uint16 * AMDSMI_MAX_NUM_CLKS)() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_curr_socclk( + processor_handle, current_socclk_value + ) + ) + + return [curr_socclk.value for curr_socclk in current_socclk_value] + + +def amdsmi_get_gpu_metrics_curr_vclk0( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> List[int]: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + current_vclk_value = (ctypes.c_uint16 * AMDSMI_MAX_NUM_CLKS)() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_curr_vclk0( + processor_handle, current_vclk_value + ) + ) + + return [curr_vclk0.value for curr_vclk0 in current_vclk_value] + + +def amdsmi_get_gpu_metrics_curr_dclk0( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> List[int]: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + current_dclk_value = (ctypes.c_uint16 * AMDSMI_MAX_NUM_CLKS)() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_curr_dclk0( + processor_handle, current_dclk_value + ) + ) + + return [curr_dclk0.value for curr_dclk0 in current_dclk_value] + + +def amdsmi_get_gpu_metrics_temp_edge( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + edge_value = ctypes.c_int16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_temp_edge( + processor_handle, ctypes.byref(edge_value) + ) + ) + + if edge_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return edge_value.value + + +def amdsmi_get_gpu_metrics_temp_vrgfx( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + vrgfx_value = ctypes.c_int16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_temp_vrgfx( + processor_handle, ctypes.byref(vrgfx_value) + ) + ) + + if vrgfx_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return vrgfx_value.value + + +def amdsmi_get_gpu_metrics_temp_vrmem( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + vrmem_value = ctypes.c_int16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_temp_vrmem( + processor_handle, ctypes.byref(vrmem_value) + ) + ) + + if vrmem_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return vrmem_value.value + + +def amdsmi_get_gpu_metrics_avg_mm_activity( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + mm_activity_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_mm_activity( + processor_handle, ctypes.byref(mm_activity_value) + ) + ) + + if mm_activity_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return mm_activity_value.value + + +def amdsmi_get_gpu_metrics_curr_vclk1( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + current_vclk_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_curr_vclk1( + processor_handle, ctypes.byref(current_vclk_value) + ) + ) + + if current_vclk_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return current_vclk_value.value + + +def amdsmi_get_gpu_metrics_curr_dclk1( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + current_dclk_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_curr_dclk1( + processor_handle, ctypes.byref(current_dclk_value) + ) + ) + + if current_dclk_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return current_dclk_value.value + + +def amdsmi_get_gpu_metrics_indep_throttle_status( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> bool: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + throttle_status_value = ctypes.c_uint64() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_indep_throttle_status( + processor_handle, ctypes.byref(throttle_status_value) + ) + ) + + if throttle_status_value.value == 0xFFFFFFFFFFFFFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return bool(throttle_status_value.value) + + +def amdsmi_get_gpu_metrics_avg_socket_power( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + socket_power_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_socket_power( + processor_handle, ctypes.byref(socket_power_value) + ) + ) + + if socket_power_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return socket_power_value.value + + +def amdsmi_get_gpu_metrics_curr_fan_speed( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + fan_speed_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_curr_fan_speed( + processor_handle, ctypes.byref(fan_speed_value) + ) + ) + + if fan_speed_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return fan_speed_value.value + + +def amdsmi_get_gpu_metrics_avg_gfx_clock_frequency( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + clock_frequency_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_gfx_clock_frequency( + processor_handle, ctypes.byref(clock_frequency_value) + ) + ) + + if clock_frequency_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return clock_frequency_value.value + + +def amdsmi_get_gpu_metrics_avg_soc_clock_frequency( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + clock_frequency_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_soc_clock_frequency( + processor_handle, ctypes.byref(clock_frequency_value) + ) + ) + + if clock_frequency_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return clock_frequency_value.value + + +def amdsmi_get_gpu_metrics_avg_uclock_frequency( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + clock_frequency_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_uclock_frequency( + processor_handle, ctypes.byref(clock_frequency_value) + ) + ) + + if clock_frequency_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return clock_frequency_value.value + + +def amdsmi_get_gpu_metrics_avg_vclock0_frequency( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + clock_frequency_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_vclock0_frequency( + processor_handle, ctypes.byref(clock_frequency_value) + ) + ) + + if clock_frequency_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return clock_frequency_value.value + + +def amdsmi_get_gpu_metrics_avg_dclock0_frequency( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + clock_frequency_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_dclock0_frequency( + processor_handle, ctypes.byref(clock_frequency_value) + ) + ) + + if clock_frequency_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return clock_frequency_value.value + + +def amdsmi_get_gpu_metrics_avg_vclock1_frequency( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + clock_frequency_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_vclock1_frequency( + processor_handle, ctypes.byref(clock_frequency_value) + ) + ) + + if clock_frequency_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return clock_frequency_value.value + + +def amdsmi_get_gpu_metrics_avg_dclock1_frequency( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + clock_frequency_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_avg_dclock1_frequency( + processor_handle, ctypes.byref(clock_frequency_value) + ) + ) + + if clock_frequency_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return clock_frequency_value.value + + +def amdsmi_get_gpu_metrics_volt_soc( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + voltage_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_volt_soc( + processor_handle, ctypes.byref(voltage_value) + ) + ) + + if voltage_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return voltage_value.value + + +def amdsmi_get_gpu_metrics_volt_gfx( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + voltage_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_volt_gfx( + processor_handle, ctypes.byref(voltage_value) + ) + ) + + return [volt_gfx.value for volt_gfx in voltage_value] + + +def amdsmi_get_gpu_metrics_volt_mem( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> int: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + voltage_value = ctypes.c_uint16() + + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_volt_mem( + processor_handle, ctypes.byref(voltage_value) + ) + ) + + if voltage_value.value == 0xFFFF: + raise AmdSmiLibraryException(amdsmi_wrapper.AMDSMI_STATUS_NOT_SUPPORTED) + + return voltage_value.value + + +def amdsmi_get_gpu_metrics_header_info( + processor_handle: amdsmi_wrapper.amdsmi_processor_handle, +) -> Dict[str, int]: + if not isinstance(processor_handle, amdsmi_wrapper.amdsmi_processor_handle): + raise AmdSmiParameterException( + processor_handle, amdsmi_wrapper.amdsmi_processor_handle + ) + + header_info = amdsmi_wrapper.amd_metrics_table_header_t() + _check_res( + amdsmi_wrapper.amdsmi_get_gpu_metrics_header_info( + ctypes.byref(header_info) + ) + ) + + return { + "structure_size": header_info.structure_size.value, + "format_revision": header_info.format_revision.value, + "content_revision": header_info.content_revision.value + } diff --git a/py-interface/amdsmi_wrapper.py b/py-interface/amdsmi_wrapper.py index c19a492943..9ab1307a90 100644 --- a/py-interface/amdsmi_wrapper.py +++ b/py-interface/amdsmi_wrapper.py @@ -284,6 +284,8 @@ amdsmi_status_t__enumvalues = { 51: 'AMDSMI_NO_DRV', 52: 'AMDSMI_FILE_NOT_FOUND', 53: 'AMDSMI_ARG_PTR_NULL', + 54: 'AMDSMI_STATUS_AMDGPU_RESTART_ERR', + 55: 'AMDSMI_STATUS_SETTING_UNAVAILABLE', 4294967294: 'AMDSMI_STATUS_MAP_ERROR', 4294967295: 'AMDSMI_STATUS_UNKNOWN_ERROR', } @@ -326,6 +328,8 @@ AMDSMI_HSMP_TIMEOUT = 50 AMDSMI_NO_DRV = 51 AMDSMI_FILE_NOT_FOUND = 52 AMDSMI_ARG_PTR_NULL = 53 +AMDSMI_STATUS_AMDGPU_RESTART_ERR = 54 +AMDSMI_STATUS_SETTING_UNAVAILABLE = 55 AMDSMI_STATUS_MAP_ERROR = 4294967294 AMDSMI_STATUS_UNKNOWN_ERROR = 4294967295 amdsmi_status_t = ctypes.c_uint32 # enum @@ -862,6 +866,7 @@ class struct_amdsmi_power_info_t(Structure): struct_amdsmi_power_info_t._pack_ = 1 # source:False struct_amdsmi_power_info_t._fields_ = [ + ('current_socket_power', ctypes.c_uint32), ('average_socket_power', ctypes.c_uint32), ('gfx_voltage', ctypes.c_uint32), ('soc_voltage', ctypes.c_uint32), @@ -1479,13 +1484,62 @@ struct_amdsmi_gpu_metrics_t._fields_ = [ ('current_fan_speed', ctypes.c_uint16), ('pcie_link_width', ctypes.c_uint16), ('pcie_link_speed', ctypes.c_uint16), - ('padding', ctypes.c_uint16), + ('PADDING_0', ctypes.c_ubyte * 2), ('gfx_activity_acc', ctypes.c_uint32), ('mem_activity_acc', ctypes.c_uint32), ('temperature_hbm', ctypes.c_uint16 * 4), + ('firmware_timestamp', ctypes.c_uint64), + ('voltage_soc', ctypes.c_uint16), + ('voltage_gfx', ctypes.c_uint16), + ('voltage_mem', ctypes.c_uint16), + ('PADDING_1', ctypes.c_ubyte * 2), + ('indep_throttle_status', ctypes.c_uint64), + ('current_socket_power', ctypes.c_uint16), + ('vcn_activity', ctypes.c_uint16 * 4), + ('PADDING_2', ctypes.c_ubyte * 2), + ('gfxclk_lock_status', ctypes.c_uint32), + ('xgmi_link_width', ctypes.c_uint16), + ('xgmi_link_speed', ctypes.c_uint16), + ('PADDING_3', ctypes.c_ubyte * 4), + ('pcie_bandwidth_acc', ctypes.c_uint64), + ('pcie_bandwidth_inst', ctypes.c_uint64), + ('pcie_l0_to_recov_count_acc', ctypes.c_uint64), + ('pcie_replay_count_acc', ctypes.c_uint64), + ('pcie_replay_rover_count_acc', ctypes.c_uint64), + ('xgmi_read_data_acc', ctypes.c_uint64 * 8), + ('xgmi_write_data_acc', ctypes.c_uint64 * 8), + ('current_gfxclks', ctypes.c_uint16 * 8), + ('current_socclks', ctypes.c_uint16 * 4), + ('current_vclk0s', ctypes.c_uint16 * 4), + ('current_dclk0s', ctypes.c_uint16 * 4), ] amdsmi_gpu_metrics_t = struct_amdsmi_gpu_metrics_t +class struct_amdsmi_name_value_t(Structure): + pass + +struct_amdsmi_name_value_t._pack_ = 1 # source:False +struct_amdsmi_name_value_t._fields_ = [ + ('name', ctypes.c_char * 64), + ('value', ctypes.c_uint64), +] + +amdsmi_name_value_t = struct_amdsmi_name_value_t + +# values for enumeration 'amdsmi_reg_type_t' +amdsmi_reg_type_t__enumvalues = { + 0: 'AMDSMI_REG_XGMI', + 1: 'AMDSMI_REG_WAFL', + 2: 'AMDSMI_REG_PCIE', + 3: 'AMDSMI_REG_USR', + 4: 'AMDSMI_REG_USR1', +} +AMDSMI_REG_XGMI = 0 +AMDSMI_REG_WAFL = 1 +AMDSMI_REG_PCIE = 2 +AMDSMI_REG_USR = 3 +AMDSMI_REG_USR1 = 4 +amdsmi_reg_type_t = ctypes.c_uint32 # enum class struct_amdsmi_ras_feature_t(Structure): pass @@ -1796,6 +1850,12 @@ amdsmi_get_gpu_od_volt_info.argtypes = [amdsmi_processor_handle, ctypes.POINTER( amdsmi_get_gpu_metrics_info = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_info amdsmi_get_gpu_metrics_info.restype = amdsmi_status_t amdsmi_get_gpu_metrics_info.argtypes = [amdsmi_processor_handle, ctypes.POINTER(struct_amdsmi_gpu_metrics_t)] +amdsmi_get_gpu_pm_metrics_info = _libraries['libamd_smi.so'].amdsmi_get_gpu_pm_metrics_info +amdsmi_get_gpu_pm_metrics_info.restype = amdsmi_status_t +amdsmi_get_gpu_pm_metrics_info.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.POINTER(struct_amdsmi_name_value_t)), ctypes.POINTER(ctypes.c_uint32)] +amdsmi_get_gpu_reg_table_info = _libraries['libamd_smi.so'].amdsmi_get_gpu_reg_table_info +amdsmi_get_gpu_reg_table_info.restype = amdsmi_status_t +amdsmi_get_gpu_reg_table_info.argtypes = [amdsmi_processor_handle, amdsmi_reg_type_t, ctypes.POINTER(ctypes.POINTER(struct_amdsmi_name_value_t)), ctypes.POINTER(ctypes.c_uint32)] amdsmi_set_gpu_clk_range = _libraries['libamd_smi.so'].amdsmi_set_gpu_clk_range amdsmi_set_gpu_clk_range.restype = amdsmi_status_t amdsmi_set_gpu_clk_range.argtypes = [amdsmi_processor_handle, uint64_t, uint64_t, amdsmi_clk_type_t] @@ -1883,24 +1943,24 @@ amdsmi_topo_get_link_type.argtypes = [amdsmi_processor_handle, amdsmi_processor_ amdsmi_is_P2P_accessible = _libraries['libamd_smi.so'].amdsmi_is_P2P_accessible amdsmi_is_P2P_accessible.restype = amdsmi_status_t amdsmi_is_P2P_accessible.argtypes = [amdsmi_processor_handle, amdsmi_processor_handle, ctypes.POINTER(ctypes.c_bool)] -amdsmi_dev_compute_partition_get = _libraries['libamd_smi.so'].amdsmi_dev_compute_partition_get -amdsmi_dev_compute_partition_get.restype = amdsmi_status_t -amdsmi_dev_compute_partition_get.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_char), uint32_t] -amdsmi_dev_compute_partition_set = _libraries['libamd_smi.so'].amdsmi_dev_compute_partition_set -amdsmi_dev_compute_partition_set.restype = amdsmi_status_t -amdsmi_dev_compute_partition_set.argtypes = [amdsmi_processor_handle, amdsmi_compute_partition_type_t] -amdsmi_dev_compute_partition_reset = _libraries['libamd_smi.so'].amdsmi_dev_compute_partition_reset -amdsmi_dev_compute_partition_reset.restype = amdsmi_status_t -amdsmi_dev_compute_partition_reset.argtypes = [amdsmi_processor_handle] -amdsmi_dev_memory_partition_get = _libraries['libamd_smi.so'].amdsmi_dev_memory_partition_get -amdsmi_dev_memory_partition_get.restype = amdsmi_status_t -amdsmi_dev_memory_partition_get.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_char), uint32_t] -amdsmi_dev_memory_partition_set = _libraries['libamd_smi.so'].amdsmi_dev_memory_partition_set -amdsmi_dev_memory_partition_set.restype = amdsmi_status_t -amdsmi_dev_memory_partition_set.argtypes = [amdsmi_processor_handle, amdsmi_memory_partition_type_t] -amdsmi_dev_memory_partition_reset = _libraries['libamd_smi.so'].amdsmi_dev_memory_partition_reset -amdsmi_dev_memory_partition_reset.restype = amdsmi_status_t -amdsmi_dev_memory_partition_reset.argtypes = [amdsmi_processor_handle] +amdsmi_get_gpu_compute_partition = _libraries['libamd_smi.so'].amdsmi_get_gpu_compute_partition +amdsmi_get_gpu_compute_partition.restype = amdsmi_status_t +amdsmi_get_gpu_compute_partition.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_char), uint32_t] +amdsmi_set_gpu_compute_partition = _libraries['libamd_smi.so'].amdsmi_set_gpu_compute_partition +amdsmi_set_gpu_compute_partition.restype = amdsmi_status_t +amdsmi_set_gpu_compute_partition.argtypes = [amdsmi_processor_handle, amdsmi_compute_partition_type_t] +amdsmi_reset_gpu_compute_partition = _libraries['libamd_smi.so'].amdsmi_reset_gpu_compute_partition +amdsmi_reset_gpu_compute_partition.restype = amdsmi_status_t +amdsmi_reset_gpu_compute_partition.argtypes = [amdsmi_processor_handle] +amdsmi_get_gpu_memory_partition = _libraries['libamd_smi.so'].amdsmi_get_gpu_memory_partition +amdsmi_get_gpu_memory_partition.restype = amdsmi_status_t +amdsmi_get_gpu_memory_partition.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_char), uint32_t] +amdsmi_set_gpu_memory_partition = _libraries['libamd_smi.so'].amdsmi_set_gpu_memory_partition +amdsmi_set_gpu_memory_partition.restype = amdsmi_status_t +amdsmi_set_gpu_memory_partition.argtypes = [amdsmi_processor_handle, amdsmi_memory_partition_type_t] +amdsmi_reset_gpu_memory_partition = _libraries['libamd_smi.so'].amdsmi_reset_gpu_memory_partition +amdsmi_reset_gpu_memory_partition.restype = amdsmi_status_t +amdsmi_reset_gpu_memory_partition.argtypes = [amdsmi_processor_handle] amdsmi_init_gpu_event_notification = _libraries['libamd_smi.so'].amdsmi_init_gpu_event_notification amdsmi_init_gpu_event_notification.restype = amdsmi_status_t amdsmi_init_gpu_event_notification.argtypes = [amdsmi_processor_handle] @@ -1967,6 +2027,173 @@ amdsmi_get_gpu_process_info.argtypes = [amdsmi_processor_handle, amdsmi_process_ 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)] +gpu_metric_temp_hbm_t = ctypes.c_uint16 * 4 +gpu_metric_vcn_activity_t = ctypes.c_uint16 * 4 +gpu_metric_xgmi_read_data_acc_t = ctypes.c_uint64 * 8 +gpu_metric_xgmi_write_data_acc_t = ctypes.c_uint64 * 8 +gpu_metric_curr_gfxclk_t = ctypes.c_uint16 * 8 +gpu_metric_curr_socclk_t = ctypes.c_uint16 * 4 +gpu_metric_curr_vclk0_t = ctypes.c_uint16 * 4 +gpu_metric_curr_dclk0_t = ctypes.c_uint16 * 4 +amdsmi_get_gpu_metrics_temp_hotspot = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_temp_hotspot +amdsmi_get_gpu_metrics_temp_hotspot.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_temp_hotspot.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_temp_mem = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_temp_mem +amdsmi_get_gpu_metrics_temp_mem.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_temp_mem.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_temp_vrsoc = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_temp_vrsoc +amdsmi_get_gpu_metrics_temp_vrsoc.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_temp_vrsoc.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_curr_socket_power = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_curr_socket_power +amdsmi_get_gpu_metrics_curr_socket_power.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_curr_socket_power.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_gfx_activity = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_gfx_activity +amdsmi_get_gpu_metrics_avg_gfx_activity.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_gfx_activity.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_umc_activity = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_umc_activity +amdsmi_get_gpu_metrics_avg_umc_activity.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_umc_activity.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_energy_acc = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_energy_acc +amdsmi_get_gpu_metrics_energy_acc.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_energy_acc.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)] +amdsmi_get_gpu_metrics_system_clock_counter = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_system_clock_counter +amdsmi_get_gpu_metrics_system_clock_counter.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_system_clock_counter.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)] +amdsmi_get_gpu_metrics_firmware_timestamp = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_firmware_timestamp +amdsmi_get_gpu_metrics_firmware_timestamp.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_firmware_timestamp.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)] +amdsmi_get_gpu_metrics_throttle_status = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_throttle_status +amdsmi_get_gpu_metrics_throttle_status.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_throttle_status.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint32)] +amdsmi_get_gpu_metrics_pcie_link_width = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_pcie_link_width +amdsmi_get_gpu_metrics_pcie_link_width.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_link_width.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_pcie_link_speed = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_pcie_link_speed +amdsmi_get_gpu_metrics_pcie_link_speed.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_link_speed.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_xgmi_link_width = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_xgmi_link_width +amdsmi_get_gpu_metrics_xgmi_link_width.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_link_width.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_xgmi_link_speed = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_xgmi_link_speed +amdsmi_get_gpu_metrics_xgmi_link_speed.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_link_speed.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_gfxclk_lock_status = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_gfxclk_lock_status +amdsmi_get_gpu_metrics_gfxclk_lock_status.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_gfxclk_lock_status.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint32)] +amdsmi_get_gpu_metrics_gfx_activity_acc = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_gfx_activity_acc +amdsmi_get_gpu_metrics_gfx_activity_acc.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_gfx_activity_acc.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint32)] +amdsmi_get_gpu_metrics_mem_activity_acc = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_mem_activity_acc +amdsmi_get_gpu_metrics_mem_activity_acc.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_mem_activity_acc.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint32)] +amdsmi_get_gpu_metrics_pcie_bandwidth_acc = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_pcie_bandwidth_acc +amdsmi_get_gpu_metrics_pcie_bandwidth_acc.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_bandwidth_acc.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)] +amdsmi_get_gpu_metrics_pcie_bandwidth_inst = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_pcie_bandwidth_inst +amdsmi_get_gpu_metrics_pcie_bandwidth_inst.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_bandwidth_inst.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)] +amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc +amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)] +amdsmi_get_gpu_metrics_pcie_replay_count_acc = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_pcie_replay_count_acc +amdsmi_get_gpu_metrics_pcie_replay_count_acc.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_replay_count_acc.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)] +amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc +amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)] +amdsmi_get_gpu_metrics_curr_uclk = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_curr_uclk +amdsmi_get_gpu_metrics_curr_uclk.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_curr_uclk.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_temp_hbm = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_temp_hbm +amdsmi_get_gpu_metrics_temp_hbm.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_temp_hbm.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16 * 4)] +amdsmi_get_gpu_metrics_vcn_activity = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_vcn_activity +amdsmi_get_gpu_metrics_vcn_activity.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_vcn_activity.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16 * 4)] +amdsmi_get_gpu_metrics_xgmi_read_data = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_xgmi_read_data +amdsmi_get_gpu_metrics_xgmi_read_data.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_read_data.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64 * 8)] +amdsmi_get_gpu_metrics_xgmi_write_data = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_xgmi_write_data +amdsmi_get_gpu_metrics_xgmi_write_data.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_write_data.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64 * 8)] +amdsmi_get_gpu_metrics_curr_gfxclk = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_curr_gfxclk +amdsmi_get_gpu_metrics_curr_gfxclk.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_curr_gfxclk.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16 * 8)] +amdsmi_get_gpu_metrics_curr_socclk = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_curr_socclk +amdsmi_get_gpu_metrics_curr_socclk.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_curr_socclk.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16 * 4)] +amdsmi_get_gpu_metrics_curr_vclk0 = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_curr_vclk0 +amdsmi_get_gpu_metrics_curr_vclk0.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_curr_vclk0.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16 * 4)] +amdsmi_get_gpu_metrics_curr_dclk0 = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_curr_dclk0 +amdsmi_get_gpu_metrics_curr_dclk0.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_curr_dclk0.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16 * 4)] +amdsmi_get_gpu_metrics_temp_edge = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_temp_edge +amdsmi_get_gpu_metrics_temp_edge.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_temp_edge.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_temp_vrgfx = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_temp_vrgfx +amdsmi_get_gpu_metrics_temp_vrgfx.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_temp_vrgfx.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_temp_vrmem = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_temp_vrmem +amdsmi_get_gpu_metrics_temp_vrmem.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_temp_vrmem.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_mm_activity = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_mm_activity +amdsmi_get_gpu_metrics_avg_mm_activity.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_mm_activity.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_curr_vclk1 = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_curr_vclk1 +amdsmi_get_gpu_metrics_curr_vclk1.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_curr_vclk1.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_curr_dclk1 = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_curr_dclk1 +amdsmi_get_gpu_metrics_curr_dclk1.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_curr_dclk1.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_indep_throttle_status = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_indep_throttle_status +amdsmi_get_gpu_metrics_indep_throttle_status.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_indep_throttle_status.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint64)] +amdsmi_get_gpu_metrics_avg_socket_power = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_socket_power +amdsmi_get_gpu_metrics_avg_socket_power.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_socket_power.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_curr_fan_speed = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_curr_fan_speed +amdsmi_get_gpu_metrics_curr_fan_speed.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_curr_fan_speed.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_gfx_clock_frequency = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_gfx_clock_frequency +amdsmi_get_gpu_metrics_avg_gfx_clock_frequency.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_gfx_clock_frequency.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_soc_clock_frequency = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_soc_clock_frequency +amdsmi_get_gpu_metrics_avg_soc_clock_frequency.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_soc_clock_frequency.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_uclock_frequency = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_uclock_frequency +amdsmi_get_gpu_metrics_avg_uclock_frequency.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_uclock_frequency.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_vclock0_frequency = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_vclock0_frequency +amdsmi_get_gpu_metrics_avg_vclock0_frequency.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_vclock0_frequency.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_dclock0_frequency = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_dclock0_frequency +amdsmi_get_gpu_metrics_avg_dclock0_frequency.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_dclock0_frequency.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_vclock1_frequency = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_vclock1_frequency +amdsmi_get_gpu_metrics_avg_vclock1_frequency.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_vclock1_frequency.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_avg_dclock1_frequency = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_avg_dclock1_frequency +amdsmi_get_gpu_metrics_avg_dclock1_frequency.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_avg_dclock1_frequency.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_volt_soc = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_volt_soc +amdsmi_get_gpu_metrics_volt_soc.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_volt_soc.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_volt_gfx = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_volt_gfx +amdsmi_get_gpu_metrics_volt_gfx.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_volt_gfx.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_volt_mem = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_volt_mem +amdsmi_get_gpu_metrics_volt_mem.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_volt_mem.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_header_info = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_header_info +amdsmi_get_gpu_metrics_header_info.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_header_info.argtypes = [amdsmi_processor_handle, ctypes.POINTER(struct_amd_metrics_table_header_t)] +amdsmi_get_gpu_metrics_xcd_counter = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_xcd_counter +amdsmi_get_gpu_metrics_xcd_counter.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_xcd_counter.argtypes = [amdsmi_processor_handle, ctypes.POINTER(ctypes.c_uint16)] +amdsmi_get_gpu_metrics_log = _libraries['libamd_smi.so'].amdsmi_get_gpu_metrics_log +amdsmi_get_gpu_metrics_log.restype = amdsmi_status_t +amdsmi_get_gpu_metrics_log.argtypes = [amdsmi_processor_handle] 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, uint32_t, ctypes.POINTER(ctypes.c_uint64)] @@ -2154,12 +2381,14 @@ __all__ = \ 'AMDSMI_RAS_ERR_STATE_INVALID', 'AMDSMI_RAS_ERR_STATE_LAST', 'AMDSMI_RAS_ERR_STATE_MULT_UC', 'AMDSMI_RAS_ERR_STATE_NONE', 'AMDSMI_RAS_ERR_STATE_PARITY', 'AMDSMI_RAS_ERR_STATE_POISON', - 'AMDSMI_RAS_ERR_STATE_SING_C', 'AMDSMI_SLOT_TYPE__CEM', + 'AMDSMI_RAS_ERR_STATE_SING_C', 'AMDSMI_REG_PCIE', + 'AMDSMI_REG_USR', 'AMDSMI_REG_USR1', 'AMDSMI_REG_WAFL', + 'AMDSMI_REG_XGMI', 'AMDSMI_SLOT_TYPE__CEM', 'AMDSMI_SLOT_TYPE__OAM', 'AMDSMI_SLOT_TYPE__PCIE', 'AMDSMI_SLOT_TYPE__RESERVED', 'AMDSMI_STATUS_ADDRESS_FAULT', - 'AMDSMI_STATUS_API_FAILED', 'AMDSMI_STATUS_BUSY', - 'AMDSMI_STATUS_DRIVER_NOT_LOADED', 'AMDSMI_STATUS_DRM_ERROR', - 'AMDSMI_STATUS_FAIL_LOAD_MODULE', + 'AMDSMI_STATUS_AMDGPU_RESTART_ERR', 'AMDSMI_STATUS_API_FAILED', + 'AMDSMI_STATUS_BUSY', 'AMDSMI_STATUS_DRIVER_NOT_LOADED', + 'AMDSMI_STATUS_DRM_ERROR', 'AMDSMI_STATUS_FAIL_LOAD_MODULE', 'AMDSMI_STATUS_FAIL_LOAD_SYMBOL', 'AMDSMI_STATUS_FILE_ERROR', 'AMDSMI_STATUS_INIT_ERROR', 'AMDSMI_STATUS_INPUT_OUT_OF_BOUNDS', 'AMDSMI_STATUS_INSUFFICIENT_SIZE', @@ -2172,15 +2401,16 @@ __all__ = \ 'AMDSMI_STATUS_NO_PERM', 'AMDSMI_STATUS_NO_SLOT', 'AMDSMI_STATUS_OUT_OF_RESOURCES', 'AMDSMI_STATUS_REFCOUNT_OVERFLOW', 'AMDSMI_STATUS_RETRY', - 'AMDSMI_STATUS_SUCCESS', 'AMDSMI_STATUS_TIMEOUT', - 'AMDSMI_STATUS_UNEXPECTED_DATA', 'AMDSMI_STATUS_UNEXPECTED_SIZE', - 'AMDSMI_STATUS_UNKNOWN_ERROR', 'AMDSMI_TEMP_CRITICAL', - 'AMDSMI_TEMP_CRITICAL_HYST', 'AMDSMI_TEMP_CRIT_MIN', - 'AMDSMI_TEMP_CRIT_MIN_HYST', 'AMDSMI_TEMP_CURRENT', - 'AMDSMI_TEMP_EMERGENCY', 'AMDSMI_TEMP_EMERGENCY_HYST', - 'AMDSMI_TEMP_FIRST', 'AMDSMI_TEMP_HIGHEST', 'AMDSMI_TEMP_LAST', - 'AMDSMI_TEMP_LOWEST', 'AMDSMI_TEMP_MAX', 'AMDSMI_TEMP_MAX_HYST', - 'AMDSMI_TEMP_MIN', 'AMDSMI_TEMP_MIN_HYST', 'AMDSMI_TEMP_OFFSET', + 'AMDSMI_STATUS_SETTING_UNAVAILABLE', 'AMDSMI_STATUS_SUCCESS', + 'AMDSMI_STATUS_TIMEOUT', 'AMDSMI_STATUS_UNEXPECTED_DATA', + 'AMDSMI_STATUS_UNEXPECTED_SIZE', 'AMDSMI_STATUS_UNKNOWN_ERROR', + 'AMDSMI_TEMP_CRITICAL', 'AMDSMI_TEMP_CRITICAL_HYST', + 'AMDSMI_TEMP_CRIT_MIN', 'AMDSMI_TEMP_CRIT_MIN_HYST', + 'AMDSMI_TEMP_CURRENT', 'AMDSMI_TEMP_EMERGENCY', + 'AMDSMI_TEMP_EMERGENCY_HYST', 'AMDSMI_TEMP_FIRST', + 'AMDSMI_TEMP_HIGHEST', 'AMDSMI_TEMP_LAST', 'AMDSMI_TEMP_LOWEST', + 'AMDSMI_TEMP_MAX', 'AMDSMI_TEMP_MAX_HYST', 'AMDSMI_TEMP_MIN', + 'AMDSMI_TEMP_MIN_HYST', 'AMDSMI_TEMP_OFFSET', 'AMDSMI_UTILIZATION_COUNTER_FIRST', 'AMDSMI_UTILIZATION_COUNTER_LAST', 'AMDSMI_VOLT_AVERAGE', 'AMDSMI_VOLT_CURRENT', 'AMDSMI_VOLT_FIRST', 'AMDSMI_VOLT_HIGHEST', @@ -2218,12 +2448,12 @@ __all__ = \ 'FW_ID_DRV_CAP', 'FW_ID_FIRST', 'FW_ID_IMU_DRAM', 'FW_ID_IMU_IRAM', 'FW_ID_ISP', 'FW_ID_MC', 'FW_ID_MES_KIQ', 'FW_ID_MES_STACK', 'FW_ID_MES_THREAD1', 'FW_ID_MES_THREAD1_STACK', - 'FW_ID_MMSCH', 'FW_ID_PPTABLE', 'FW_ID_PSP_BL', 'FW_ID_PSP_DBG', - 'FW_ID_PSP_INTF', 'FW_ID_PSP_KEYDB', 'FW_ID_PSP_SOC', - 'FW_ID_PSP_SOSDRV', 'FW_ID_PSP_SPL', 'FW_ID_PSP_SYSDRV', - 'FW_ID_PSP_TOC', 'FW_ID_REG_ACCESS_WHITELIST', 'FW_ID_RLC', - 'FW_ID_RLCV_LX7', 'FW_ID_RLC_P', 'FW_ID_RLC_RESTORE_LIST_CNTL', - 'FW_ID_RLC_RESTORE_LIST_GPM_MEM', + 'FW_ID_MMSCH', 'FW_ID_PM', 'FW_ID_PPTABLE', 'FW_ID_PSP_BL', + 'FW_ID_PSP_DBG', 'FW_ID_PSP_INTF', 'FW_ID_PSP_KEYDB', + 'FW_ID_PSP_SOC', 'FW_ID_PSP_SOSDRV', 'FW_ID_PSP_SPL', + 'FW_ID_PSP_SYSDRV', 'FW_ID_PSP_TOC', 'FW_ID_REG_ACCESS_WHITELIST', + 'FW_ID_RLC', 'FW_ID_RLCV_LX7', 'FW_ID_RLC_P', + 'FW_ID_RLC_RESTORE_LIST_CNTL', 'FW_ID_RLC_RESTORE_LIST_GPM_MEM', 'FW_ID_RLC_RESTORE_LIST_SRM_MEM', 'FW_ID_RLC_SAVE_RESTORE_LIST', 'FW_ID_RLC_SRLG', 'FW_ID_RLC_SRLS', 'FW_ID_RLC_V', 'FW_ID_RLX6', 'FW_ID_RLX6_CORE1', 'FW_ID_RLX6_DRAM_BOOT', @@ -2235,39 +2465,34 @@ __all__ = \ 'FW_ID_RS64_PFP_P1_DATA', 'FW_ID_SDMA0', 'FW_ID_SDMA1', 'FW_ID_SDMA2', 'FW_ID_SDMA3', 'FW_ID_SDMA4', 'FW_ID_SDMA5', 'FW_ID_SDMA6', 'FW_ID_SDMA7', 'FW_ID_SDMA_TH0', 'FW_ID_SDMA_TH1', - 'FW_ID_SEC_POLICY_STAGE2', 'FW_ID_PM', 'FW_ID_SMU', - 'FW_ID_TA_RAS', 'FW_ID_TA_XGMI', 'FW_ID_UVD', 'FW_ID_VCE', - 'FW_ID_VCN', 'FW_ID__MAX', 'MEMORY_PARTITION_NPS1', - 'MEMORY_PARTITION_NPS2', 'MEMORY_PARTITION_NPS4', - 'MEMORY_PARTITION_NPS8', 'MEMORY_PARTITION_UNKNOWN', - 'NON_AMD_CPU', 'NON_AMD_GPU', 'RD_BW0', 'TEMPERATURE_TYPE_EDGE', - 'TEMPERATURE_TYPE_FIRST', 'TEMPERATURE_TYPE_HBM_0', - 'TEMPERATURE_TYPE_HBM_1', 'TEMPERATURE_TYPE_HBM_2', - 'TEMPERATURE_TYPE_HBM_3', 'TEMPERATURE_TYPE_HOTSPOT', - 'TEMPERATURE_TYPE_JUNCTION', 'TEMPERATURE_TYPE_PLX', - 'TEMPERATURE_TYPE_VRAM', 'TEMPERATURE_TYPE__MAX', 'UNKNOWN', - 'VRAM_TYPE_DDR2', 'VRAM_TYPE_DDR3', 'VRAM_TYPE_DDR4', - 'VRAM_TYPE_GDDR1', 'VRAM_TYPE_GDDR3', 'VRAM_TYPE_GDDR4', - 'VRAM_TYPE_GDDR5', 'VRAM_TYPE_GDDR6', 'VRAM_TYPE_HBM', - 'VRAM_TYPE_UNKNOWN', 'VRAM_TYPE__MAX', 'WR_BW0', - 'amd_metrics_table_header_t', 'amdsmi_asic_info_t', - 'amdsmi_bdf_t', 'amdsmi_bit_field_t', 'amdsmi_board_info_t', - 'amdsmi_cache_flags_type_t', 'amdsmi_clk_info_t', - 'amdsmi_clk_type_t', 'amdsmi_compute_partition_type_t', - 'amdsmi_container_types_t', 'amdsmi_counter_command_t', - 'amdsmi_counter_value_t', 'amdsmi_cpu_apb_disable', - 'amdsmi_cpu_apb_enable', 'amdsmi_cpusocket_handle', - 'amdsmi_ddr_bw_metrics_t', 'amdsmi_dev_compute_partition_get', - 'amdsmi_dev_compute_partition_reset', - 'amdsmi_dev_compute_partition_set', - 'amdsmi_dev_memory_partition_get', - 'amdsmi_dev_memory_partition_reset', - 'amdsmi_dev_memory_partition_set', 'amdsmi_dev_perf_level_t', - 'amdsmi_dimm_power_t', 'amdsmi_dimm_thermal_t', - 'amdsmi_dpm_level_t', 'amdsmi_driver_info_t', - 'amdsmi_engine_usage_t', 'amdsmi_error_count_t', - 'amdsmi_event_group_t', 'amdsmi_event_handle_t', - 'amdsmi_event_type_t', 'amdsmi_evt_notification_data_t', + 'FW_ID_SEC_POLICY_STAGE2', 'FW_ID_SMU', 'FW_ID_TA_RAS', + 'FW_ID_TA_XGMI', 'FW_ID_UVD', 'FW_ID_VCE', 'FW_ID_VCN', + 'FW_ID__MAX', 'MEMORY_PARTITION_NPS1', 'MEMORY_PARTITION_NPS2', + 'MEMORY_PARTITION_NPS4', 'MEMORY_PARTITION_NPS8', + 'MEMORY_PARTITION_UNKNOWN', 'NON_AMD_CPU', 'NON_AMD_GPU', + 'RD_BW0', 'TEMPERATURE_TYPE_EDGE', 'TEMPERATURE_TYPE_FIRST', + 'TEMPERATURE_TYPE_HBM_0', 'TEMPERATURE_TYPE_HBM_1', + 'TEMPERATURE_TYPE_HBM_2', 'TEMPERATURE_TYPE_HBM_3', + 'TEMPERATURE_TYPE_HOTSPOT', 'TEMPERATURE_TYPE_JUNCTION', + 'TEMPERATURE_TYPE_PLX', 'TEMPERATURE_TYPE_VRAM', + 'TEMPERATURE_TYPE__MAX', 'UNKNOWN', 'VRAM_TYPE_DDR2', + 'VRAM_TYPE_DDR3', 'VRAM_TYPE_DDR4', 'VRAM_TYPE_GDDR1', + 'VRAM_TYPE_GDDR3', 'VRAM_TYPE_GDDR4', 'VRAM_TYPE_GDDR5', + 'VRAM_TYPE_GDDR6', 'VRAM_TYPE_HBM', 'VRAM_TYPE_UNKNOWN', + 'VRAM_TYPE__MAX', 'WR_BW0', 'amd_metrics_table_header_t', + 'amdsmi_asic_info_t', 'amdsmi_bdf_t', 'amdsmi_bit_field_t', + 'amdsmi_board_info_t', 'amdsmi_cache_flags_type_t', + 'amdsmi_clk_info_t', 'amdsmi_clk_type_t', + 'amdsmi_compute_partition_type_t', 'amdsmi_container_types_t', + 'amdsmi_counter_command_t', 'amdsmi_counter_value_t', + 'amdsmi_cpu_apb_disable', 'amdsmi_cpu_apb_enable', + 'amdsmi_cpusocket_handle', 'amdsmi_ddr_bw_metrics_t', + 'amdsmi_dev_perf_level_t', 'amdsmi_dimm_power_t', + 'amdsmi_dimm_thermal_t', 'amdsmi_dpm_level_t', + 'amdsmi_driver_info_t', 'amdsmi_engine_usage_t', + 'amdsmi_error_count_t', 'amdsmi_event_group_t', + 'amdsmi_event_handle_t', 'amdsmi_event_type_t', + 'amdsmi_evt_notification_data_t', 'amdsmi_evt_notification_type_t', 'amdsmi_first_online_core_on_cpu_socket', 'amdsmi_freq_ind_t', 'amdsmi_freq_volt_region_t', 'amdsmi_frequencies_t', @@ -2300,6 +2525,7 @@ __all__ = \ 'amdsmi_get_gpu_available_counters', 'amdsmi_get_gpu_bad_page_info', 'amdsmi_get_gpu_bdf_id', 'amdsmi_get_gpu_board_info', 'amdsmi_get_gpu_cache_info', + 'amdsmi_get_gpu_compute_partition', 'amdsmi_get_gpu_compute_process_gpus', 'amdsmi_get_gpu_compute_process_info', 'amdsmi_get_gpu_compute_process_info_by_pid', @@ -2308,18 +2534,73 @@ __all__ = \ 'amdsmi_get_gpu_ecc_enabled', 'amdsmi_get_gpu_ecc_status', 'amdsmi_get_gpu_event_notification', 'amdsmi_get_gpu_fan_rpms', 'amdsmi_get_gpu_fan_speed', 'amdsmi_get_gpu_fan_speed_max', - 'amdsmi_get_gpu_id', 'amdsmi_get_gpu_memory_reserved_pages', + 'amdsmi_get_gpu_id', 'amdsmi_get_gpu_memory_partition', + 'amdsmi_get_gpu_memory_reserved_pages', 'amdsmi_get_gpu_memory_total', 'amdsmi_get_gpu_memory_usage', - 'amdsmi_get_gpu_metrics_info', + 'amdsmi_get_gpu_metrics_avg_dclock0_frequency', + 'amdsmi_get_gpu_metrics_avg_dclock1_frequency', + 'amdsmi_get_gpu_metrics_avg_gfx_activity', + 'amdsmi_get_gpu_metrics_avg_gfx_clock_frequency', + 'amdsmi_get_gpu_metrics_avg_mm_activity', + 'amdsmi_get_gpu_metrics_avg_soc_clock_frequency', + 'amdsmi_get_gpu_metrics_avg_socket_power', + 'amdsmi_get_gpu_metrics_avg_uclock_frequency', + 'amdsmi_get_gpu_metrics_avg_umc_activity', + 'amdsmi_get_gpu_metrics_avg_vclock0_frequency', + 'amdsmi_get_gpu_metrics_avg_vclock1_frequency', + 'amdsmi_get_gpu_metrics_curr_dclk0', + 'amdsmi_get_gpu_metrics_curr_dclk1', + 'amdsmi_get_gpu_metrics_curr_fan_speed', + 'amdsmi_get_gpu_metrics_curr_gfxclk', + 'amdsmi_get_gpu_metrics_curr_socclk', + 'amdsmi_get_gpu_metrics_curr_socket_power', + 'amdsmi_get_gpu_metrics_curr_uclk', + 'amdsmi_get_gpu_metrics_curr_vclk0', + 'amdsmi_get_gpu_metrics_curr_vclk1', + 'amdsmi_get_gpu_metrics_energy_acc', + 'amdsmi_get_gpu_metrics_firmware_timestamp', + 'amdsmi_get_gpu_metrics_gfx_activity_acc', + 'amdsmi_get_gpu_metrics_gfxclk_lock_status', + 'amdsmi_get_gpu_metrics_header_info', + 'amdsmi_get_gpu_metrics_indep_throttle_status', + 'amdsmi_get_gpu_metrics_info', 'amdsmi_get_gpu_metrics_log', + 'amdsmi_get_gpu_metrics_mem_activity_acc', + 'amdsmi_get_gpu_metrics_pcie_bandwidth_acc', + 'amdsmi_get_gpu_metrics_pcie_bandwidth_inst', + 'amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc', + 'amdsmi_get_gpu_metrics_pcie_link_speed', + 'amdsmi_get_gpu_metrics_pcie_link_width', + 'amdsmi_get_gpu_metrics_pcie_replay_count_acc', + 'amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc', + 'amdsmi_get_gpu_metrics_system_clock_counter', + 'amdsmi_get_gpu_metrics_temp_edge', + 'amdsmi_get_gpu_metrics_temp_hbm', + 'amdsmi_get_gpu_metrics_temp_hotspot', + 'amdsmi_get_gpu_metrics_temp_mem', + 'amdsmi_get_gpu_metrics_temp_vrgfx', + 'amdsmi_get_gpu_metrics_temp_vrmem', + 'amdsmi_get_gpu_metrics_temp_vrsoc', + 'amdsmi_get_gpu_metrics_throttle_status', + 'amdsmi_get_gpu_metrics_vcn_activity', + 'amdsmi_get_gpu_metrics_volt_gfx', + 'amdsmi_get_gpu_metrics_volt_mem', + 'amdsmi_get_gpu_metrics_volt_soc', + 'amdsmi_get_gpu_metrics_xcd_counter', + 'amdsmi_get_gpu_metrics_xgmi_link_speed', + 'amdsmi_get_gpu_metrics_xgmi_link_width', + 'amdsmi_get_gpu_metrics_xgmi_read_data', + 'amdsmi_get_gpu_metrics_xgmi_write_data', 'amdsmi_get_gpu_od_volt_curve_regions', 'amdsmi_get_gpu_od_volt_info', 'amdsmi_get_gpu_overdrive_level', 'amdsmi_get_gpu_pci_bandwidth', 'amdsmi_get_gpu_pci_replay_counter', 'amdsmi_get_gpu_pci_throughput', 'amdsmi_get_gpu_perf_level', + 'amdsmi_get_gpu_pm_metrics_info', 'amdsmi_get_gpu_power_profile_presets', 'amdsmi_get_gpu_process_info', 'amdsmi_get_gpu_process_list', 'amdsmi_get_gpu_ras_block_features_enabled', - 'amdsmi_get_gpu_ras_feature_info', 'amdsmi_get_gpu_revision', + 'amdsmi_get_gpu_ras_feature_info', + 'amdsmi_get_gpu_reg_table_info', 'amdsmi_get_gpu_revision', 'amdsmi_get_gpu_subsystem_id', 'amdsmi_get_gpu_subsystem_name', 'amdsmi_get_gpu_topo_numa_affinity', 'amdsmi_get_gpu_total_ecc_count', 'amdsmi_get_gpu_vbios_info', @@ -2345,7 +2626,7 @@ __all__ = \ 'amdsmi_is_gpu_power_management_enabled', 'amdsmi_link_id_bw_type_t', 'amdsmi_memory_page_status_t', 'amdsmi_memory_partition_type_t', 'amdsmi_memory_type_t', - 'amdsmi_mm_ip_t', 'amdsmi_od_vddc_point_t', + 'amdsmi_mm_ip_t', 'amdsmi_name_value_t', 'amdsmi_od_vddc_point_t', 'amdsmi_od_volt_curve_t', 'amdsmi_od_volt_freq_data_t', 'amdsmi_pcie_bandwidth_t', 'amdsmi_pcie_info_t', 'amdsmi_pcie_slot_type_t', 'amdsmi_power_cap_info_t', @@ -2354,10 +2635,11 @@ __all__ = \ 'amdsmi_proc_info_t', 'amdsmi_process_handle_t', 'amdsmi_process_info_t', 'amdsmi_processor_handle', 'amdsmi_range_t', 'amdsmi_ras_err_state_t', - 'amdsmi_ras_feature_t', 'amdsmi_reset_gpu', - 'amdsmi_reset_gpu_fan', 'amdsmi_reset_gpu_xgmi_error', - 'amdsmi_retired_page_record_t', 'amdsmi_set_clk_freq', - 'amdsmi_set_cpu_core_boostlimit', + 'amdsmi_ras_feature_t', 'amdsmi_reg_type_t', 'amdsmi_reset_gpu', + 'amdsmi_reset_gpu_compute_partition', 'amdsmi_reset_gpu_fan', + 'amdsmi_reset_gpu_memory_partition', + 'amdsmi_reset_gpu_xgmi_error', 'amdsmi_retired_page_record_t', + 'amdsmi_set_clk_freq', 'amdsmi_set_cpu_core_boostlimit', 'amdsmi_set_cpu_df_pstate_range', 'amdsmi_set_cpu_gmi3_link_width_range', 'amdsmi_set_cpu_pcie_link_rate', @@ -2365,11 +2647,11 @@ __all__ = \ 'amdsmi_set_cpu_socket_boostlimit', 'amdsmi_set_cpu_socket_lclk_dpm_level', 'amdsmi_set_cpu_socket_power_cap', 'amdsmi_set_cpu_xgmi_width', - 'amdsmi_set_gpu_clk_range', + 'amdsmi_set_gpu_clk_range', 'amdsmi_set_gpu_compute_partition', 'amdsmi_set_gpu_event_notification_mask', - 'amdsmi_set_gpu_fan_speed', 'amdsmi_set_gpu_od_clk_info', - 'amdsmi_set_gpu_od_volt_info', 'amdsmi_set_gpu_overdrive_level', - 'amdsmi_set_gpu_pci_bandwidth', + 'amdsmi_set_gpu_fan_speed', 'amdsmi_set_gpu_memory_partition', + 'amdsmi_set_gpu_od_clk_info', 'amdsmi_set_gpu_od_volt_info', + 'amdsmi_set_gpu_overdrive_level', 'amdsmi_set_gpu_pci_bandwidth', 'amdsmi_set_gpu_perf_determinism_mode', 'amdsmi_set_gpu_perf_level', 'amdsmi_set_gpu_power_profile', 'amdsmi_set_power_cap', 'amdsmi_shut_down', @@ -2385,7 +2667,11 @@ __all__ = \ 'amdsmi_voltage_type_t', 'amdsmi_vram_info_t', 'amdsmi_vram_type_t', 'amdsmi_vram_usage_t', 'amdsmi_vram_vendor_type_t', 'amdsmi_xgmi_info_t', - 'amdsmi_xgmi_status_t', 'processor_type_t', 'size_t', + 'amdsmi_xgmi_status_t', 'gpu_metric_curr_dclk0_t', + 'gpu_metric_curr_gfxclk_t', 'gpu_metric_curr_socclk_t', + 'gpu_metric_curr_vclk0_t', 'gpu_metric_temp_hbm_t', + 'gpu_metric_vcn_activity_t', 'gpu_metric_xgmi_read_data_acc_t', + 'gpu_metric_xgmi_write_data_acc_t', 'processor_type_t', 'size_t', 'struct_amd_metrics_table_header_t', 'struct_amdsmi_asic_info_t', 'struct_amdsmi_board_info_t', 'struct_amdsmi_clk_info_t', 'struct_amdsmi_counter_value_t', 'struct_amdsmi_ddr_bw_metrics_t', @@ -2396,7 +2682,7 @@ __all__ = \ 'struct_amdsmi_freq_volt_region_t', 'struct_amdsmi_frequencies_t', 'struct_amdsmi_frequency_range_t', 'struct_amdsmi_fw_info_t', 'struct_amdsmi_gpu_cache_info_t', 'struct_amdsmi_gpu_metrics_t', - 'struct_amdsmi_link_id_bw_type_t', + 'struct_amdsmi_link_id_bw_type_t', 'struct_amdsmi_name_value_t', 'struct_amdsmi_od_vddc_point_t', 'struct_amdsmi_od_volt_curve_t', 'struct_amdsmi_od_volt_freq_data_t', 'struct_amdsmi_pcie_bandwidth_t', 'struct_amdsmi_pcie_info_t', diff --git a/rocm_smi/example/rocm_smi_example.cc b/rocm_smi/example/rocm_smi_example.cc index 4427c0c446..1f2983fc72 100755 --- a/rocm_smi/example/rocm_smi_example.cc +++ b/rocm_smi/example/rocm_smi_example.cc @@ -47,10 +47,12 @@ #include #include -#include -#include +#include #include +#include #include +#include +#include #include "rocm_smi/rocm_smi.h" #include "rocm_smi/rocm_smi_utils.h" @@ -166,9 +168,9 @@ void print_function_header_with_rsmi_ret( } static void print_test_header(const char *str, uint32_t dv_ind) { - std::cout << "********************************" << "\n"; + std::cout << "******************************************" << "\n"; std::cout << "*** " << str << "\n"; - std::cout << "********************************" << "\n"; + std::cout << "******************************************" << "\n"; std::cout << "Device index: " << dv_ind << "\n"; } @@ -728,6 +730,40 @@ template constexpr float convert_mw_to_w(T mw) { return static_cast(mw / 1000.0); } +template +auto print_error_or_value(rsmi_status_t status_code, const T& metric) { + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + if constexpr (std::is_array_v) { + auto idx = uint16_t(0); + auto str_values = std::string(); + const auto num_elems = static_cast(std::end(metric) - std::begin(metric)); + str_values = ("\n\t\t num of values: " + std::to_string(num_elems) + "\n"); + for (const auto& el : metric) { + str_values += "\t\t [" + std::to_string(idx) + "]: " + std::to_string(el) + "\n"; + ++idx; + } + return str_values; + } + else if constexpr ((std::is_same_v) || + (std::is_same_v) || + (std::is_same_v)) { + return std::to_string(metric); + } + } + else { + return ("\n\t\tStatus: [" + std::to_string(status_code) + "] " + "-> " + amd::smi::getRSMIStatusString(status_code)); + } +}; + +template +std::string print_unsigned_int(T value) { + std::stringstream ss; + ss << static_cast(value | 0); + + return ss.str(); +} + + int main() { rsmi_status_t ret; @@ -742,7 +778,7 @@ int main() { rsmi_dev_perf_level_t pfl; rsmi_frequencies_t f; uint32_t num_monitor_devs = 0; - rsmi_gpu_metrics_t p; + rsmi_gpu_metrics_t gpu_metrics; std::string val_str; RSMI_POWER_TYPE power_type = RSMI_INVALID_POWER; @@ -809,43 +845,308 @@ int main() { std::cout << "Not Supported\n"; } - ret = rsmi_dev_gpu_metrics_info_get(i, &p); - print_test_header("GPU METRICS", i); - print_function_header_with_rsmi_ret(ret, - "rsmi_dev_gpu_metrics_info_get(" + std::to_string(i) + ", &p)"); - std::cout << "\t**p.common_header.content_revision: " << std::dec - << p.common_header.content_revision << "\n"; - std::cout << "\t**p.common_header.format_revision: " << std::dec - << p.common_header.format_revision << "\n"; - std::cout << "\t**p.average_gfxclk_frequency: " << std::dec - << p.average_gfxclk_frequency << "\n"; - std::cout << "\t**p.average_socclk_frequency: " << std::dec - << p.average_socclk_frequency << "\n"; - std::cout << "\t**p.average_uclk_frequency: " << std::dec - << p.average_uclk_frequency << "\n"; - std::cout << "\t**p.average_vclk0_frequency: " << std::dec - << p.average_vclk0_frequency << "\n"; - std::cout << "\t**p.average_dclk0_frequency: " << std::dec - << p.average_dclk0_frequency << "\n"; - std::cout << "\t**p.average_vclk1_frequency: " << std::dec - << p.average_vclk1_frequency << "\n"; - std::cout << "\t**p.average_dclk1_frequency: " << std::dec - << p.average_dclk1_frequency << "\n"; + // + std::cout << "\n"; + print_test_header("GPU METRICS: Using static struct (Backwards Compatibility) ", i); + print_function_header_with_rsmi_ret(ret, "rsmi_dev_gpu_metrics_info_get(" + std::to_string(i) + ", &gpu_metrics)"); + rsmi_dev_gpu_metrics_info_get(i, &gpu_metrics); + + std::cout << "\t**.common_header.format_revision : " + << print_unsigned_int(gpu_metrics.common_header.format_revision) << "\n"; + std::cout << "\t**.common_header.content_revision : " + << print_unsigned_int(gpu_metrics.common_header.content_revision) << "\n"; + + std::cout << "\t**.temperature_edge : " << std::dec + << gpu_metrics.temperature_edge << "\n"; + std::cout << "\t**.temperature_hotspot : " << std::dec + << gpu_metrics.temperature_hotspot << "\n"; + std::cout << "\t**.temperature_mem : " << std::dec + << gpu_metrics.temperature_mem << "\n"; + std::cout << "\t**.temperature_vrgfx : " << std::dec + << gpu_metrics.temperature_vrgfx << "\n"; + std::cout << "\t**.temperature_vrsoc : " << std::dec + << gpu_metrics.temperature_vrsoc << "\n"; + std::cout << "\t**.temperature_vrmem : " << std::dec + << gpu_metrics.temperature_vrmem << "\n"; + std::cout << "\t**.average_gfx_activity : " << std::dec + << gpu_metrics.average_gfx_activity << "\n"; + std::cout << "\t**.average_umc_activity : " << std::dec + << gpu_metrics.average_umc_activity << "\n"; + std::cout << "\t**.average_mm_activity : " << std::dec + << gpu_metrics.average_mm_activity << "\n"; + std::cout << "\t**.average_socket_power : " << std::dec + << gpu_metrics.average_socket_power << "\n"; + std::cout << "\t**.energy_accumulator : " << std::dec + << gpu_metrics.energy_accumulator << "\n"; + std::cout << "\t**.system_clock_counter : " << std::dec + << gpu_metrics.system_clock_counter << "\n"; + std::cout << "\t**.average_gfxclk_frequency : " << std::dec + << gpu_metrics.average_gfxclk_frequency << "\n"; + std::cout << "\t**.average_socclk_frequency : " << std::dec + << gpu_metrics.average_socclk_frequency << "\n"; + std::cout << "\t**.average_uclk_frequency : " << std::dec + << gpu_metrics.average_uclk_frequency << "\n"; + std::cout << "\t**.average_vclk0_frequency : " << std::dec + << gpu_metrics.average_vclk0_frequency<< "\n"; + std::cout << "\t**.average_dclk0_frequency : " << std::dec + << gpu_metrics.average_dclk0_frequency << "\n"; + std::cout << "\t**.average_vclk1_frequency : " << std::dec + << gpu_metrics.average_vclk1_frequency << "\n"; + std::cout << "\t**.average_dclk1_frequency : " << std::dec + << gpu_metrics.average_dclk1_frequency << "\n"; + std::cout << "\t**.current_gfxclk : " << std::dec + << gpu_metrics.current_gfxclk << "\n"; + std::cout << "\t**.current_socclk : " << std::dec + << gpu_metrics.current_socclk << "\n"; + std::cout << "\t**.current_uclk : " << std::dec + << gpu_metrics.current_uclk << "\n"; + std::cout << "\t**.current_vclk0 : " << std::dec + << gpu_metrics.current_vclk0 << "\n"; + std::cout << "\t**.current_dclk0 : " << std::dec + << gpu_metrics.current_dclk0 << "\n"; + std::cout << "\t**.current_vclk1 : " << std::dec + << gpu_metrics.current_vclk1 << "\n"; + std::cout << "\t**.current_dclk1 : " << std::dec + << gpu_metrics.current_dclk1 << "\n"; + std::cout << "\t**.throttle_status : " << std::dec + << gpu_metrics.throttle_status << "\n"; + std::cout << "\t**.current_fan_speed : " << std::dec + << gpu_metrics.current_fan_speed << "\n"; + std::cout << "\t**.pcie_link_width : " << std::dec + << gpu_metrics.pcie_link_width << "\n"; + std::cout << "\t**.pcie_link_speed : " << std::dec + << gpu_metrics.pcie_link_speed << "\n"; + std::cout << "\t**.gfx_activity_acc : " << std::dec + << gpu_metrics.gfx_activity_acc << "\n"; + std::cout << "\t**.mem_activity_acc : " << std::dec + << gpu_metrics.mem_activity_acc << "\n"; + std::cout << "\t**.firmware_timestamp : " << std::dec + << gpu_metrics.firmware_timestamp << "\n"; + std::cout << "\t**.voltage_soc : " << std::dec + << gpu_metrics.voltage_soc << "\n"; + std::cout << "\t**.voltage_gfx : " << std::dec + << gpu_metrics.voltage_gfx << "\n"; + std::cout << "\t**.voltage_mem : " << std::dec + << gpu_metrics.voltage_mem << "\n"; + std::cout << "\t**.indep_throttle_status : " << std::dec + << gpu_metrics.indep_throttle_status << "\n"; + std::cout << "\t**.current_socket_power : " << std::dec + << gpu_metrics.current_socket_power << "\n"; + std::cout << "\t**.gfxclk_lock_status : " << std::dec + << gpu_metrics.gfxclk_lock_status << "\n"; + std::cout << "\t**.xgmi_link_width : " << std::dec + << gpu_metrics.xgmi_link_width << "\n"; + std::cout << "\t**.xgmi_link_speed : " << std::dec + << gpu_metrics.xgmi_link_speed << "\n"; + std::cout << "\t**.pcie_bandwidth_acc : " << std::dec + << gpu_metrics.pcie_bandwidth_acc << "\n"; + std::cout << "\t**.pcie_bandwidth_inst : " << std::dec + << gpu_metrics.pcie_bandwidth_inst << "\n"; + std::cout << "\t**.pcie_l0_to_recov_count_acc : " << std::dec + << gpu_metrics.pcie_l0_to_recov_count_acc << "\n"; + std::cout << "\t**.pcie_replay_count_acc : " << std::dec + << gpu_metrics.pcie_replay_count_acc << "\n"; + std::cout << "\t**.pcie_replay_rover_count_acc : " << std::dec + << gpu_metrics.pcie_replay_rover_count_acc << "\n"; + + std::cout << "\t**.temperature_hbm[] : " << std::dec << "\n"; + for (const auto& temp : gpu_metrics.temperature_hbm) { + std::cout << "\t -> " << std::dec << temp << "\n"; + } + + std::cout << "\t**.vcn_activity[] : " << std::dec << "\n"; + for (const auto& vcn : gpu_metrics.vcn_activity) { + std::cout << "\t -> " << std::dec << vcn << "\n"; + } + + std::cout << "\t**.xgmi_read_data_acc[] : " << std::dec << "\n"; + for (const auto& read_data : gpu_metrics.xgmi_read_data_acc) { + std::cout << "\t -> " << std::dec << read_data << "\n"; + } + + std::cout << "\t**.xgmi_write_data_acc[] : " << std::dec << "\n"; + for (const auto& write_data : gpu_metrics.xgmi_write_data_acc) { + std::cout << "\t -> " << std::dec << write_data << "\n"; + } + + std::cout << "\t**.current_gfxclks[] : " << std::dec << "\n"; + for (const auto& gfxclk : gpu_metrics.current_gfxclks) { + std::cout << "\t -> " << std::dec << gfxclk << "\n"; + } + + std::cout << "\t**.current_socclks[] : " << std::dec << "\n"; + for (const auto& socclk : gpu_metrics.current_socclks) { + std::cout << "\t -> " << std::dec << socclk << "\n"; + } + + std::cout << "\t**.current_vclk0s[] : " << std::dec << "\n"; + for (const auto& vclk : gpu_metrics.current_vclk0s) { + std::cout << "\t -> " << std::dec << vclk << "\n"; + } + + std::cout << "\t**.current_dclk0s[] : " << std::dec << "\n"; + for (const auto& dclk : gpu_metrics.current_dclk0s) { + std::cout << "\t -> " << std::dec << dclk << "\n"; + } + std::cout << " ** Note: Values MAX'ed out (UINTX MAX are unsupported for the version in question) ** " << "\n"; + + std::cout << "\n\n"; + print_test_header("GPU METRICS: Using direct APIs (newer)", i); + metrics_table_header_t header_values; + GPUMetricTempHbm_t hbm_values; + GPUMetricVcnActivity_t vcn_values; + GPUMetricXgmiReadDataAcc_t xgmi_read_values; + GPUMetricXgmiWriteDataAcc_t xgmi_write_values; + GPUMetricCurrGfxClk_t curr_gfxclk_values; + GPUMetricCurrSocClk_t curr_socclk_values; + GPUMetricCurrVClk0_t curr_vclk0_values; + GPUMetricCurrDClk0_t curr_dclk0_values; + + ret = rsmi_dev_metrics_header_info_get(i, &header_values); + std::cout << "\t[Metrics Header]" << "\n"; + std::cout << "\t -> format_revision : " << print_unsigned_int(header_values.format_revision) << "\n"; + std::cout << "\t -> content_revision : " << print_unsigned_int(header_values.content_revision) << "\n"; + std::cout << "\t--------------------" << "\n"; + + std::cout << "\n"; + std::cout << "\t[Temperature]" << "\n"; + ret = rsmi_dev_metrics_temp_edge_get(i, &val_ui16); + std::cout << "\t -> temp_edge(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_temp_hotspot_get(i, &val_ui16); + std::cout << "\t -> temp_hotspot(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_temp_mem_get(i, &val_ui16); + std::cout << "\t -> temp_mem(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_temp_vrgfx_get(i, &val_ui16); + std::cout << "\t -> temp_vrgfx(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_temp_vrsoc_get(i, &val_ui16); + std::cout << "\t -> temp_vrsoc(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_temp_vrmem_get(i, &val_ui16); + std::cout << "\t -> temp_vrmem(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_temp_hbm_get(i, &hbm_values); + std::cout << "\t -> temp_hbm(): " << print_error_or_value(ret, hbm_values) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Power/Energy]" << "\n"; + ret = rsmi_dev_metrics_curr_socket_power_get(i, &val_ui16); + std::cout << "\t -> current_socket_power(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_energy_acc_get(i, &val_ui64); + std::cout << "\t -> energy_accum(): " << print_error_or_value(ret, val_ui64) << "\n"; + ret = rsmi_dev_metrics_avg_socket_power_get(i, &val_ui16); + std::cout << "\t -> average_socket_power(): " << print_error_or_value(ret, val_ui16) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Utilization]" << "\n"; + ret = rsmi_dev_metrics_avg_gfx_activity_get(i, &val_ui16); + std::cout << "\t -> average_gfx_activity(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_avg_umc_activity_get(i, &val_ui16); + std::cout << "\t -> average_umc_activity(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_avg_mm_activity_get(i, &val_ui16); + std::cout << "\t -> average_mm_activity(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_vcn_activity_get(i, &vcn_values); + std::cout << "\t -> vcn_activity(): " << print_error_or_value(ret, vcn_values) << "\n"; + ret = rsmi_dev_metrics_mem_activity_acc_get(i, &val_ui32); + std::cout << "\t -> mem_activity_accum(): " << print_error_or_value(ret, val_ui32) << "\n"; + ret = rsmi_dev_metrics_gfx_activity_acc_get(i, &val_ui32); + std::cout << "\t -> gfx_activity_accum(): " << print_error_or_value(ret, val_ui32) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Average Clock]" << "\n"; + ret = rsmi_dev_metrics_avg_gfx_clock_frequency_get(i, &val_ui16); + std::cout << "\t -> average_gfx_clock_frequency(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_avg_soc_clock_frequency_get(i, &val_ui16); + std::cout << "\t -> average_soc_clock_frequency(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_avg_uclock_frequency_get(i, &val_ui16); + std::cout << "\t -> average_uclock_frequency(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_avg_vclock0_frequency_get(i, &val_ui16); + std::cout << "\t -> average_vclock0_frequency(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_avg_dclock0_frequency_get(i, &val_ui16); + std::cout << "\t -> average_dclock0_frequency(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_avg_vclock1_frequency_get(i, &val_ui16); + std::cout << "\t -> average_vclock1_frequency(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_avg_dclock1_frequency_get(i, &val_ui16); + std::cout << "\t -> average_dclock1_frequency(): " << print_error_or_value(ret, val_ui16) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Current Clock]" << "\n"; + ret = rsmi_dev_metrics_curr_vclk1_get(i, &val_ui16); + std::cout << "\t -> current_vclock1(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_curr_dclk1_get(i, &val_ui16); + std::cout << "\t -> current_dclock1(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_curr_uclk_get(i, &val_ui16); + std::cout << "\t -> current_uclock(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_curr_dclk0_get(i, &curr_dclk0_values); + std::cout << "\t -> current_dclk0(): " << print_error_or_value(ret, curr_dclk0_values) << "\n"; + ret = rsmi_dev_metrics_curr_gfxclk_get(i, &curr_gfxclk_values); + std::cout << "\t -> current_gfxclk(): " << print_error_or_value(ret, curr_gfxclk_values) << "\n"; + ret = rsmi_dev_metrics_curr_socclk_get(i, &curr_socclk_values); + std::cout << "\t -> current_soc_clock(): " << print_error_or_value(ret, curr_socclk_values) << "\n"; + ret = rsmi_dev_metrics_curr_vclk0_get(i, &curr_vclk0_values); + std::cout << "\t -> current_vclk0(): " << print_error_or_value(ret, curr_vclk0_values) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Throttle]" << "\n"; + ret = rsmi_dev_metrics_indep_throttle_status_get(i, &val_ui64); + std::cout << "\t -> indep_throttle_status(): " << print_error_or_value(ret, val_ui64) << "\n"; + ret = rsmi_dev_metrics_throttle_status_get(i, &val_ui32); + std::cout << "\t -> throttle_status(): " << print_error_or_value(ret, val_ui32) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Gfx Clock Lock]" << "\n"; + ret = rsmi_dev_metrics_gfxclk_lock_status_get(i, &val_ui32); + std::cout << "\t -> gfxclk_lock_status(): " << print_error_or_value(ret, val_ui32) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Current Fan Speed]" << "\n"; + ret = rsmi_dev_metrics_curr_fan_speed_get(i, &val_ui16); + std::cout << "\t -> current_fan_speed(): " << print_error_or_value(ret, val_ui16) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Link/Bandwidth/Speed]" << "\n"; + ret = rsmi_dev_metrics_pcie_link_width_get(i, &val_ui16); + std::cout << "\t -> pcie_link_width(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_pcie_link_speed_get(i, &val_ui16); + std::cout << "\t -> pcie_link_speed(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_pcie_bandwidth_acc_get(i, &val_ui64); + std::cout << "\t -> pcie_bandwidth_accum(): " << print_error_or_value(ret, val_ui64) << "\n"; + ret = rsmi_dev_metrics_pcie_bandwidth_inst_get(i, &val_ui64); + std::cout << "\t -> pcie_bandwidth_inst(): " << print_error_or_value(ret, val_ui64) << "\n"; + ret = rsmi_dev_metrics_pcie_l0_recov_count_acc_get(i, &val_ui64); + std::cout << "\t -> pcie_l0_recov_count_accum(): " << print_error_or_value(ret, val_ui64) << "\n"; + ret = rsmi_dev_metrics_pcie_replay_count_acc_get(i, &val_ui64); + std::cout << "\t -> pcie_replay_count_accum(): " << print_error_or_value(ret, val_ui64) << "\n"; + ret = rsmi_dev_metrics_pcie_replay_rover_count_acc_get(i, &val_ui64); + std::cout << "\t -> pcie_replay_rollover_count_accum(): " << print_error_or_value(ret, val_ui64) << "\n"; + ret = rsmi_dev_metrics_xgmi_link_width_get(i, &val_ui16); + std::cout << "\t -> xgmi_link_width(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_xgmi_link_speed_get(i, &val_ui16); + std::cout << "\t -> xgmi_link_speed(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_xgmi_read_data_get(i, &xgmi_read_values); + std::cout << "\t -> xgmi_read_data(): " << print_error_or_value(ret, xgmi_read_values) << "\n"; + ret = rsmi_dev_metrics_xgmi_write_data_get(i, &xgmi_write_values); + std::cout << "\t -> xgmi_write_data(): " << print_error_or_value(ret, xgmi_write_values) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Voltage]" << "\n"; + ret = rsmi_dev_metrics_volt_soc_get(i, &val_ui16); + std::cout << "\t -> voltage_soc(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_volt_gfx_get(i, &val_ui16); + std::cout << "\t -> voltage_gfx(): " << print_error_or_value(ret, val_ui16) << "\n"; + ret = rsmi_dev_metrics_volt_mem_get(i, &val_ui16); + std::cout << "\t -> voltage_mem(): " << print_error_or_value(ret, val_ui16) << "\n"; + + std::cout << "\n"; + std::cout << "\t[Timestamp]" << "\n"; + ret = rsmi_dev_metrics_system_clock_counter_get(i, &val_ui64); + std::cout << "\t -> system_clock_counter(): " << print_error_or_value(ret, val_ui64) << "\n"; + ret = rsmi_dev_metrics_firmware_timestamp_get(i, &val_ui64); + std::cout << "\t -> firmware_timestamp(): " << print_error_or_value(ret, val_ui64) << "\n"; + + std::cout << "\n"; + std::cout << "\t[XCD CounterVoltage]" << "\n"; + ret = rsmi_dev_metrics_xcd_counter_get(i, &val_ui16); + std::cout << "\t -> xcd_counter(): " << print_error_or_value(ret, val_ui16) << "\n"; + std::cout << "\n\n"; - std::cout << "\t**p.current_gfxclk: " << std::dec - << p.current_gfxclk << "\n"; - std::cout << "\t**p.current_socclk: " << std::dec - << p.current_socclk << "\n"; - std::cout << "\t**p.current_uclk: " << std::dec - << p.current_uclk << "\n"; - std::cout << "\t**p.current_vclk0: " << std::dec - << p.current_vclk0 << "\n"; - std::cout << "\t**p.current_dclk0: " << std::dec - << p.current_dclk0 << "\n"; - std::cout << "\t**p.current_vclk1: " << std::dec - << p.current_vclk1 << "\n"; - std::cout << "\t**p.current_dclk1: " << std::dec - << p.current_dclk1 << "\n"; ret = rsmi_dev_perf_level_get(i, &pfl); CHK_AND_PRINT_RSMI_ERR_RET(ret) diff --git a/rocm_smi/include/rocm_smi/rocm_smi.h b/rocm_smi/include/rocm_smi/rocm_smi.h index 71de14939b..e397ad27f0 100755 --- a/rocm_smi/include/rocm_smi/rocm_smi.h +++ b/rocm_smi/include/rocm_smi/rocm_smi.h @@ -961,6 +961,7 @@ typedef rsmi_od_volt_freq_data_t rsmi_od_volt_freq_data; */ struct metrics_table_header_t { // TODO(amd) Doxygen documents + // Note: This should match: AMDGpuMetricsHeader_v1_t /// \cond Ignore in docs. uint16_t structure_size; uint8_t format_revision; @@ -971,98 +972,200 @@ struct metrics_table_header_t { /** * @brief The following structure holds the gpu metrics values for a device. */ -// Below is the assumed version of gpu_metric data on the device. If the device -// is using this version, we can read data directly into rsmi_gpu_metrics_t. -// If the device is using an older format, a conversion of formats will be -// required. -// DGPU targets have a format version of 1. APU targets have a format version of -// 2. Currently, only version 1 (DGPU) gpu_metrics is supported. -#define RSMI_GPU_METRICS_API_FORMAT_VER 1 -// The content version increments when gpu_metrics is extended with new and/or -// existing field sizes are changed. -/** - * @brief The GPU metrics version 1 - */ -#define RSMI_GPU_METRICS_API_CONTENT_VER_1 1 -/** - * @brief The GPU metrics version 2 - */ -#define RSMI_GPU_METRICS_API_CONTENT_VER_2 2 -/** - * @brief The GPU metrics version 3 - */ -#define RSMI_GPU_METRICS_API_CONTENT_VER_3 3 -/** - * @brief This should match NUM_HBM_INSTANCES - */ -#define RSMI_NUM_HBM_INSTANCES 4 /** * @brief Unit conversion factor for HBM temperatures */ #define CENTRIGRADE_TO_MILLI_CENTIGRADE 1000 +/** + * @brief This should match kRSMI_MAX_NUM_HBM_INSTANCES + */ +#define RSMI_NUM_HBM_INSTANCES 4 + +/** + * @brief This should match kRSMI_MAX_NUM_VCN + */ +#define RSMI_MAX_NUM_VCN 4 + +/** + * @brief This should match kRSMI_MAX_NUM_CLKS + */ +#define RSMI_MAX_NUM_CLKS 4 + +/** + * @brief This should match kRSMI_MAX_NUM_XGMI_LINKS + */ +#define RSMI_MAX_NUM_XGMI_LINKS 8 + +/** + * @brief This should match kRSMI_MAX_NUM_GFX_CLKS + */ +#define RSMI_MAX_NUM_GFX_CLKS 8 + + typedef struct { // TODO(amd) Doxygen documents + // Note: This structure is extended to fit the needs of different GPU metric + // versions when exposing data through the structure. + // Depending on the version, some data members will hold data, and + // some will not. A good example is the set of 'current clocks': + // - current_gfxclk, current_socclk, current_vclk0, current_dclk0 + // These are single-valued data members, up to version 1.3. + // For version 1.4 and up these are multi-valued data members (arrays) + // and their counterparts; + // - current_gfxclks[], current_socclks[], current_vclk0s[], + // current_dclk0s[] + // will hold the data /// \cond Ignore in docs. + + /* + * v1.0 Base + */ struct metrics_table_header_t common_header; -/* Temperature */ - uint16_t temperature_edge; - uint16_t temperature_hotspot; - uint16_t temperature_mem; - uint16_t temperature_vrgfx; - uint16_t temperature_vrsoc; - uint16_t temperature_vrmem; + // Temperature + uint16_t temperature_edge; + uint16_t temperature_hotspot; + uint16_t temperature_mem; + uint16_t temperature_vrgfx; + uint16_t temperature_vrsoc; + uint16_t temperature_vrmem; -/* Utilization */ - uint16_t average_gfx_activity; - uint16_t average_umc_activity; // memory controller - uint16_t average_mm_activity; // UVD or VCN + // Utilization + uint16_t average_gfx_activity; + uint16_t average_umc_activity; // memory controller + uint16_t average_mm_activity; // UVD or VCN -/* Power/Energy */ - uint16_t average_socket_power; - uint64_t energy_accumulator; // v1 mod. (32->64) + // Power/Energy + uint16_t average_socket_power; + uint64_t energy_accumulator; // v1 mod. (32->64) -/* Driver attached timestamp (in ns) */ - uint64_t system_clock_counter; // v1 mod. (moved from top of struct) + // Driver attached timestamp (in ns) + uint64_t system_clock_counter; // v1 mod. (moved from top of struct) -/* Average clocks */ - uint16_t average_gfxclk_frequency; - uint16_t average_socclk_frequency; - uint16_t average_uclk_frequency; - uint16_t average_vclk0_frequency; - uint16_t average_dclk0_frequency; - uint16_t average_vclk1_frequency; - uint16_t average_dclk1_frequency; + // Average clocks + uint16_t average_gfxclk_frequency; + uint16_t average_socclk_frequency; + uint16_t average_uclk_frequency; + uint16_t average_vclk0_frequency; + uint16_t average_dclk0_frequency; + uint16_t average_vclk1_frequency; + uint16_t average_dclk1_frequency; -/* Current clocks */ - uint16_t current_gfxclk; - uint16_t current_socclk; - uint16_t current_uclk; - uint16_t current_vclk0; - uint16_t current_dclk0; - uint16_t current_vclk1; - uint16_t current_dclk1; + // Current clocks + uint16_t current_gfxclk; + uint16_t current_socclk; + uint16_t current_uclk; + uint16_t current_vclk0; + uint16_t current_dclk0; + uint16_t current_vclk1; + uint16_t current_dclk1; -/* Throttle status */ - uint32_t throttle_status; + // Throttle status + uint32_t throttle_status; -/* Fans */ - uint16_t current_fan_speed; + // Fans + uint16_t current_fan_speed; -/* Link width/speed */ - uint16_t pcie_link_width; // v1 mod.(8->16) - uint16_t pcie_link_speed; // in 0.1 GT/s; v1 mod. (8->16) + // Link width/speed + uint16_t pcie_link_width; // v1 mod.(8->16) + uint16_t pcie_link_speed; // in 0.1 GT/s; v1 mod. (8->16) - uint16_t padding; // new in v1 - uint32_t gfx_activity_acc; // new in v1 - uint32_t mem_activity_acc; // new in v1 - uint16_t temperature_hbm[RSMI_NUM_HBM_INSTANCES]; // new in v1 + /* + * v1.1 additions + */ + uint32_t gfx_activity_acc; // new in v1 + uint32_t mem_activity_acc; // new in v1 + uint16_t temperature_hbm[RSMI_NUM_HBM_INSTANCES]; // new in v1 + + + /* + * v1.2 additions + */ + // PMFW attached timestamp (10ns resolution) + uint64_t firmware_timestamp; + + + /* + * v1.3 additions + */ + // Voltage (mV) + uint16_t voltage_soc; + uint16_t voltage_gfx; + uint16_t voltage_mem; + + // Throttle status + uint64_t indep_throttle_status; + + + /* + * v1.4 additions + */ + // Power (Watts) + uint16_t current_socket_power; + + // Utilization (%) + uint16_t vcn_activity[RSMI_MAX_NUM_VCN]; // VCN instances activity percent (encode/decode) + + // Clock Lock Status. Each bit corresponds to clock instance + uint32_t gfxclk_lock_status; + + // XGMI bus width and bitrate (in Gbps) + uint16_t xgmi_link_width; + uint16_t xgmi_link_speed; + + // PCIE accumulated bandwidth (GB/sec) + uint64_t pcie_bandwidth_acc; + + // PCIE instantaneous bandwidth (GB/sec) + uint64_t pcie_bandwidth_inst; + + // PCIE L0 to recovery state transition accumulated count + uint64_t pcie_l0_to_recov_count_acc; + + // PCIE replay accumulated count + uint64_t pcie_replay_count_acc; + + // PCIE replay rollover accumulated count + uint64_t pcie_replay_rover_count_acc; + + // XGMI accumulated data transfer size(KiloBytes) + uint64_t xgmi_read_data_acc[RSMI_MAX_NUM_XGMI_LINKS]; + uint64_t xgmi_write_data_acc[RSMI_MAX_NUM_XGMI_LINKS]; + + // XGMI accumulated data transfer size(KiloBytes) + uint16_t current_gfxclks[RSMI_MAX_NUM_GFX_CLKS]; + uint16_t current_socclks[RSMI_MAX_NUM_CLKS]; + uint16_t current_vclk0s[RSMI_MAX_NUM_CLKS]; + uint16_t current_dclk0s[RSMI_MAX_NUM_CLKS]; + /// \endcond } rsmi_gpu_metrics_t; + +#define MAX_RSMI_NAME_LENGTH 64 + +/** + * @brief This structure holds the name value pairs + */ +typedef struct { + char name[MAX_RSMI_NAME_LENGTH]; //!< Name + uint64_t value; //!< Use uint64_t to make it universal +} rsmi_name_value_t; + +/** + * @brief This register type for register table + */ +typedef enum { + RSMI_REG_XGMI, + RSMI_REG_WAFL, + RSMI_REG_PCIE, + RSMI_REG_USR, + RSMI_REG_USR1, +} rsmi_reg_type_t; + /** * @brief This structure holds error counts. */ @@ -2765,6 +2868,76 @@ rsmi_status_t rsmi_dev_od_volt_info_get(uint32_t dv_ind, rsmi_status_t rsmi_dev_gpu_metrics_info_get(uint32_t dv_ind, rsmi_gpu_metrics_t *pgpu_metrics); +/** + * @brief Get the pm metrics table with provided device index. + * + * @details Given a device index @p dv_ind, @p pm_metrics pointer, + * and @p num_of_metrics pointer, + * this function will write the pm metrics name value pair + * to the array at @p pm_metrics and the number of metrics retreived to @p num_of_metrics + * Note: the library allocated memory for pm_metrics, and user must call + * free(pm_metrics) to free it after use. + * + * @param[in] dv_ind a device index + * + * @param[inout] pm_metrics A pointerto an array to hold multiple PM metrics. On successs, + * the library will allocate memory of pm_metrics and write metrics to this array. + * The caller must free this memory after usage to avoid memory leak. + * + * @param[inout] num_of_metrics a pointer to uint32_t to which the number of + * metrics is allocated for pm_metrics array as input, and the number of metrics retreived + * as output. If this parameter is NULL, this function will return + * ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided, + * arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the + * provided arguments. + * + * @retval ::RSMI_STATUS_SUCCESS call was successful + * @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not + * support this function with the given arguments + * @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid + * + */ +rsmi_status_t rsmi_dev_pm_metrics_info_get(uint32_t dv_ind, + rsmi_name_value_t** pm_metrics, + uint32_t *num_of_metrics); + + +/** + * @brief Get the register metrics table with provided device index and registertype. + * + * @details Given a device index @p dv_ind, @p reg_type, @p reg_metrics pointer, + * and @p num_of_metrics pointer, + * this function will write the register metrics name value pair + * to the array at @p reg_metrics and the number of metrics retreived to @p num_of_metrics + * Note: the library allocated memory for reg_metrics, and user must call + * free(reg_metrics) to free it after use. + * + * @param[in] dv_ind a device index + * + * @param[in] reg_type The register type + * + * @param[inout] reg_metrics A pointerto an array to hold multiple register metrics. On successs, + * the library will allocate memory of reg_metrics and write metrics to this array. + * The caller must free this memory after usage to avoid memory leak. + * + * @param[inout] num_of_metrics a pointer to uint32_t to which the number of + * metrics is allocated for reg_metrics array as input, and the number of metrics retreived + * as output. If this parameter is NULL, this function will return + * ::RSMI_STATUS_INVALID_ARGS if the function is supported with the provided, + * arguments and ::RSMI_STATUS_NOT_SUPPORTED if it is not supported with the + * provided arguments. + * + * @retval ::RSMI_STATUS_SUCCESS call was successful + * @retval ::RSMI_STATUS_NOT_SUPPORTED installed software or hardware does not + * support this function with the given arguments + * @retval ::RSMI_STATUS_INVALID_ARGS the provided arguments are not valid + * + */ +rsmi_status_t rsmi_dev_reg_table_info_get(uint32_t dv_ind, + rsmi_reg_type_t reg_type, + rsmi_name_value_t** reg_metrics, + uint32_t *num_of_metrics); + /** * @brief This function sets the clock range information * @@ -4440,6 +4613,1055 @@ rsmi_status_t rsmi_event_notification_stop(uint32_t dv_ind); /** @} */ // end of EvntNotif + +/*****************************************************************************/ +/** @defgroup GPU Metric Functions + * These functions are used to get granular information about all counters + * available in GPU Metrics. + * @{ + */ + +/** + * Metric multi-valued counter types + */ +typedef uint16_t GPUMetricTempHbm_t[RSMI_NUM_HBM_INSTANCES]; +typedef uint16_t GPUMetricVcnActivity_t[RSMI_MAX_NUM_VCN]; +typedef uint64_t GPUMetricXgmiReadDataAcc_t[RSMI_MAX_NUM_XGMI_LINKS]; +typedef uint64_t GPUMetricXgmiWriteDataAcc_t[RSMI_MAX_NUM_XGMI_LINKS]; +typedef uint16_t GPUMetricCurrGfxClk_t[RSMI_MAX_NUM_GFX_CLKS]; +typedef uint16_t GPUMetricCurrSocClk_t[RSMI_MAX_NUM_CLKS]; +typedef uint16_t GPUMetricCurrVClk0_t[RSMI_MAX_NUM_CLKS]; +typedef uint16_t GPUMetricCurrDClk0_t[RSMI_MAX_NUM_CLKS]; + + +/****** + * Metric single-valued counter types + */ + +/** + * @brief Get the 'temp_hotspot' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'temp_hotspot' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] hotspot_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_temp_hotspot_get(uint32_t dv_ind, uint16_t* hotspot_value); + +/** + * @brief Get the 'temp_mem' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'temp_mem' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] mem_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_temp_mem_get(uint32_t dv_ind, uint16_t* mem_value); + +/** + * @brief Get the 'temp_vrsoc' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'temp_vrsoc' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] vrsoc_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_temp_vrsoc_get(uint32_t dv_ind, uint16_t* vrsoc_value); + +/** + * @brief Get the 'curr_socket_power' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'socket_power' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] socket_power_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_curr_socket_power_get(uint32_t dv_ind, uint16_t* socket_power_value); + +/** + * @brief Get the 'avg_gfx_activity' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'gfx_activity' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] gfx_activity_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_gfx_activity_get(uint32_t dv_ind, uint16_t* gfx_activity_value); + +/** + * @brief Get the 'avg_umc_activity' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'umc_activity' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] umc_activity_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_umc_activity_get(uint32_t dv_ind, uint16_t* umc_activity_value); + +/** + * @brief Get the 'energy_acc' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'energy_acc' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] energy_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_energy_acc_get(uint32_t dv_ind, uint64_t* energy_acc_value); + +/** + * @brief Get the 'system_clock_counter' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'system_clock_counter' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] system_clock_counter_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_system_clock_counter_get(uint32_t dv_ind, uint64_t* system_clock_counter_value); + +/** + * @brief Get the 'firmware_timestamp' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'firmware_timestamp' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] firmware_timestamp_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_firmware_timestamp_get(uint32_t dv_ind, uint64_t* firmware_timestamp_value); + +/** + * @brief Get the 'throttle_status' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint32_t in which + * the 'throttle_status' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] throttle_status_value a pointer to uint32_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_throttle_status_get(uint32_t dv_ind, uint32_t* throttle_status_value); + +/** + * @brief Get the 'pcie_link_width' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'pcie_link_width' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] pcie_link_width_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_pcie_link_width_get(uint32_t dv_ind, uint16_t* pcie_link_width_value); + +/** + * @brief Get the 'pcie_link_speed' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'pcie_link_speed' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] pcie_link_speed_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_pcie_link_speed_get(uint32_t dv_ind, uint16_t* pcie_link_speed_value); + +/** + * @brief Get the 'xgmi_link_width' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'xgmi_link_width' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] xgmi_link_width_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_xgmi_link_width_get(uint32_t dv_ind, uint16_t* xgmi_link_width_value); + +/** + * @brief Get the 'xgmi_link_speed' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'xgmi_link_speed' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] xgmi_link_speed_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_xgmi_link_speed_get(uint32_t dv_ind, uint16_t* xgmi_link_speed_value); + +/** + * @brief Get the 'gfxclk_lock_status' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint32_t in which + * the 'gfxclk_lock_status' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] gfxclk_lock_status_value a pointer to uint32_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_gfxclk_lock_status_get(uint32_t dv_ind, uint32_t* gfxclk_lock_status_value); + +/** + * @brief Get the 'gfx_activity_acc' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint32_t in which + * the 'gfx_activity_acc' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] gfx_activity_acc_value a pointer to uint32_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_gfx_activity_acc_get(uint32_t dv_ind, uint32_t* gfx_activity_acc_value); + +/** + * @brief Get the 'mem_activity_acc' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint32_t in which + * the 'mem_activity_acc' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] mem_activity_acc_value a pointer to uint32_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_mem_activity_acc_get(uint32_t dv_ind, uint32_t* mem_activity_acc_value); + +/** + * @brief Get the 'pcie_bandwidth_acc' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'pcie_bandwidth_acc' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] pcie_bandwidth_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_pcie_bandwidth_acc_get(uint32_t dv_ind, uint64_t* pcie_bandwidth_acc_value); + +/** + * @brief Get the 'pcie_bandwidth_inst' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'pcie_bandwidth_inst' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] pcie_bandwidth_inst_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_pcie_bandwidth_inst_get(uint32_t dv_ind, uint64_t* pcie_bandwidth_inst_value); + +/** + * @brief Get the 'pcie_l0_recov_count_acc' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'pcie_l0_recov_count_acc' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] pcie_count_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_pcie_l0_recov_count_acc_get(uint32_t dv_ind, uint64_t* pcie_count_acc_value); + +/** + * @brief Get the 'pcie_replay_count_acc' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'pcie_replay_count_acc' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] pcie_count_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_pcie_replay_count_acc_get(uint32_t dv_ind, uint64_t* pcie_count_acc_value); + +/** + * @brief Get the 'pcie_replay_rover_count_acc' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'pcie_replay_rover_count_acc' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] pcie_count_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_pcie_replay_rover_count_acc_get(uint32_t dv_ind, uint64_t* pcie_count_acc_value); + +/** + * @brief Get the 'curr_uclk' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'curr_uclk' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] uclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_curr_uclk_get(uint32_t dv_ind, uint16_t* uclk_value); + + +/****** + * Metric multi-valued counter types + */ + +/** + * @brief Get the 'temp_hbm' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'temp_hbm' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] temp_hbm_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (RSMI_NUM_HBM_INSTANCES) + * element array (GPUMetricTempHbm_t) + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_temp_hbm_get(uint32_t dv_ind, GPUMetricTempHbm_t* temp_hbm_value); + +/** + * @brief Get the 'vcn_activity' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'vcn_activity' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] vcn_activity_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (RSMI_MAX_NUM_VCN) + * element array (GPUMetricVcnActivity_t) + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_vcn_activity_get(uint32_t dv_ind, GPUMetricVcnActivity_t* vcn_activity_value); + +/** + * @brief Get the 'xgmi_read_data' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'xgmi_read_data' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] xgmi_read_data_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding an 8 (RSMI_MAX_NUM_XGMI_LINKS) + * element array (GPUMetricXgmiReadDataAcc_t) + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_xgmi_read_data_get(uint32_t dv_ind, GPUMetricXgmiReadDataAcc_t* xgmi_read_data_acc_value); + +/** + * @brief Get the 'xgmi_write_data' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'xgmi_write_data' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] xgmi_write_data_acc_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding an 8 (RSMI_MAX_NUM_XGMI_LINKS) + * element array (GPUMetricXgmiWriteDataAcc_t) + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_xgmi_write_data_get(uint32_t dv_ind, GPUMetricXgmiWriteDataAcc_t* xgmi_write_data_acc_value); + +/** + * @brief Get the 'curr_gfxclk' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'curr_gfxclk' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] current_gfxclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding an 8 (RSMI_MAX_NUM_GFX_CLKS) + * element array (GPUMetricCurrGfxClk_t) + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_curr_gfxclk_get(uint32_t dv_ind, GPUMetricCurrGfxClk_t* current_gfxclk_value); + +/** + * @brief Get the 'curr_socclk' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'curr_socclk' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] current_socclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (RSMI_MAX_NUM_CLKS) + * element array (GPUMetricCurrSocClk_t) + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_curr_socclk_get(uint32_t dv_ind, GPUMetricCurrSocClk_t* current_socclk_value); + +/** + * @brief Get the 'curr_vclk0' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'curr_vclk0' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] current_vclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (RSMI_MAX_NUM_CLKS) + * element array (GPUMetricCurrVClk0_t) + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_curr_vclk0_get(uint32_t dv_ind, GPUMetricCurrVClk0_t* current_vclk_value); + +/** + * @brief Get the 'curr_dclk0' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'curr_dclk0' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] current_dclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * - This is a multi-valued counter holding a 4 (RSMI_MAX_NUM_CLKS) + * element array (GPUMetricCurrDClk0_t) + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_curr_dclk0_get(uint32_t dv_ind, GPUMetricCurrDClk0_t* current_dclk_value); + +/** + * @brief Get the 'temp_edge' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'temp_edge' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] edge_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_temp_edge_get(uint32_t dv_ind, uint16_t* edge_value); + +/** + * @brief Get the 'temp_vrgfx' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'temp_vrgfx' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] vrgfx_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_temp_vrgfx_get(uint32_t dv_ind, uint16_t* vrgfx_value); + +/** + * @brief Get the 'temp_vrmem' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'temp_vrmem' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] vrmem_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_temp_vrmem_get(uint32_t dv_ind, uint16_t* vrmem_value); + +/** + * @brief Get the 'avg_mm_activity' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'avg_mm_activity' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] mm_activity_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_mm_activity_get(uint32_t dv_ind, uint16_t* mm_activity_value); + +/** + * @brief Get the 'curr_vclk1' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'curr_vclk1' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] current_vclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_curr_vclk1_get(uint32_t dv_ind, uint16_t* current_vclk_value); + +/** + * @brief Get the 'curr_dclk1' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'curr_dclk1' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] current_dclk_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_curr_dclk1_get(uint32_t dv_ind, uint16_t* current_dclk_value); + +/** + * @brief Get the 'indep_throttle_status' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint64_t in which + * the 'indep_throttle_status' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] throttle_status_value a pointer to uint64_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_indep_throttle_status_get(uint32_t dv_ind, uint64_t* throttle_status_value); + +/** + * @brief Get the 'avg_socket_power' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'avg_socket_power' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] socket_power_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_socket_power_get(uint32_t dv_ind, uint16_t* socket_power_value); + +/** + * @brief Get the 'curr_fan_speed' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'curr_fan_speed' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] fan_speed_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_curr_fan_speed_get(uint32_t dv_ind, uint16_t* fan_speed_value); + +/** + * @brief Get the 'avg_gfx_clock_frequency' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'avg_gfx_clock_frequency' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_gfx_clock_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_soc_clock_frequency' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'avg_soc_clock_frequency' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_soc_clock_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_uclock_frequency' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'avg_uclock_frequency' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_uclock_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_vclock0_frequency' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'avg_vclock0_frequency' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_vclock0_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_dclock0_frequency' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'avg_dclock0_frequency' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_dclock0_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_vclock1_frequency' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'avg_vclock1_frequency' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_vclock1_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'avg_dclock1_frequency' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'avg_dclock1_frequency' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] clock_frequency_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_avg_dclock1_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value); + +/** + * @brief Get the 'volt_soc' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'volt_soc' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] voltage_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_volt_soc_get(uint32_t dv_ind, uint16_t* voltage_value); + +/** + * @brief Get the 'volt_gfx' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'volt_gfx' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] voltage_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_volt_gfx_get(uint32_t dv_ind, uint16_t* voltage_value); + +/** + * @brief Get the 'volt_mem' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'volt_mem' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] voltage_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_volt_mem_get(uint32_t dv_ind, uint16_t* voltage_value); + +/** + * @brief Get the 'metrics_header_info' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a metrics_table_header_t in which + * the 'metrics_header_info' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] header_value a pointer to metrics_table_header_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_header_info_get(uint32_t dv_ind, metrics_table_header_t* header_value); + +/** + * @brief Get the 'xcd_counter' from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind and a pointer to a uint16_t in which + * the 'xcd_counter' will stored + * + * @param[in] dv_ind a device index + * + * @param[inout] xcd_counter_value a pointer to uint16_t to which the device gpu + * metric unit will be stored + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * ::RSMI_STATUS_NOT_SUPPORTED is returned in case the metric unit + * does not exist for the given device + * + */ +rsmi_status_t +rsmi_dev_metrics_xcd_counter_get(uint32_t dv_ind, uint16_t* xcd_counter_value); + +/** + * @brief Get the log from the GPU metrics associated with the device + * + * @details Given a device index @p dv_ind it will log all the gpu metric info + * related to the device. The 'logging' feature must be on. + * + * @param[in] dv_ind a device index + * + * @retval ::RSMI_STATUS_SUCCESS is returned upon successful call. + * + */ +rsmi_status_t +rsmi_dev_metrics_log_get(uint32_t dv_ind); + + #ifdef __cplusplus } #endif // __cplusplus diff --git a/rocm_smi/include/rocm_smi/rocm_smi_binary_parser.h b/rocm_smi/include/rocm_smi/rocm_smi_binary_parser.h new file mode 100644 index 0000000000..6c48f5e7b5 --- /dev/null +++ b/rocm_smi/include/rocm_smi/rocm_smi_binary_parser.h @@ -0,0 +1,262 @@ +/* + * ============================================================================= + * The University of Illinois/NCSA + * Open Source License (NCSA) + * + * Copyright (c) 2017-2023, Advanced Micro Devices, Inc. + * All rights reserved. + * + * Developed by: + * + * AMD Research and AMD ROC Software Development + * + * Advanced Micro Devices, Inc. + * + * www.amd.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal with the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimers. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimers in + * the documentation and/or other materials provided with the distribution. + * - Neither the names of , + * nor the names of its contributors may be used to endorse or promote + * products derived from this Software without specific prior written + * permission. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS WITH THE SOFTWARE. + * + */ + +#ifndef ROCM_SMI_ROCM_SMI_BINARY_PARSER_H_ +#define ROCM_SMI_ROCM_SMI_BINARY_PARSER_H_ + +#include "rocm_smi/rocm_smi_common.h" +#include "rocm_smi/rocm_smi.h" + +#include +#include +#include +#include +#include + +/** + * A binary parser to read the pm table and register table + * + */ +namespace amd::smi { + +// definition for register table +enum amdgpu_sysfs_reg_offset { + AMDGPU_SYS_REG_STATE_XGMI = 0x0000, + AMDGPU_SYS_REG_STATE_WAFL = 0x1000, + AMDGPU_SYS_REG_STATE_PCIE = 0x2000, + AMDGPU_SYS_REG_STATE_USR = 0x3000, + AMDGPU_SYS_REG_STATE_USR_1 = 0x4000, + AMDGPU_SYS_REG_STATE_END = 0x5000, +}; + +#define FIELD_FLAG_NUM_INSTANCE 0x01 +#define FIELD_FLAG_NUM_SMN 0x02 +#define FIELD_FLAG_INSTANCE_START 0x04 +#define FIELD_FLAG_SMN_START 0x08 + +#define FIELD_TYPE_U8 0x01 +#define FIELD_TYPE_U16 0x02 +#define FIELD_TYPE_U32 0x04 +#define FIELD_TYPE_U64 0x08 + +struct metric_field { + uint8_t field_type; + int field_arr_size; + const char *field_name; + uint8_t field_flag; +}; + +struct metric_field xgmi_regs[] = { + { FIELD_TYPE_U16, 1, "structure_size", 0 }, + { FIELD_TYPE_U8, 1, "format_revision", 0 }, + { FIELD_TYPE_U8, 1, "content_revision", 0 }, + { FIELD_TYPE_U8, 1, "state_type", 0 }, + { FIELD_TYPE_U8, 1, "num_instances", FIELD_FLAG_NUM_INSTANCE }, + { FIELD_TYPE_U16, 1, "pad", 0 }, + + { FIELD_TYPE_U16, 1, "instance", FIELD_FLAG_INSTANCE_START }, + { FIELD_TYPE_U16, 1, "state", 0 }, + { FIELD_TYPE_U16, 1, "num_smn_regs", FIELD_FLAG_NUM_SMN }, + { FIELD_TYPE_U16, 1, "pad", 0 }, + + { FIELD_TYPE_U64, 1, "addr", FIELD_FLAG_SMN_START }, + { FIELD_TYPE_U32, 1, "value", 0 }, + { FIELD_TYPE_U32, 1, "pad", 0 }, + { 0, 0, NULL, 0 }, +}; + +// check me! +struct metric_field wafl_regs[] = { + { FIELD_TYPE_U16, 1, "structure_size", 0 }, + { FIELD_TYPE_U8, 1, "format_revision", 0 }, + { FIELD_TYPE_U8, 1, "content_revision", 0 }, + { FIELD_TYPE_U8, 1, "state_type", 0 }, + { FIELD_TYPE_U8, 1, "num_instances", FIELD_FLAG_NUM_INSTANCE }, + { FIELD_TYPE_U16, 1, "pad", 0 }, + + { FIELD_TYPE_U16, 1, "instance", FIELD_FLAG_INSTANCE_START }, + { FIELD_TYPE_U16, 1, "state", 0 }, + { FIELD_TYPE_U16, 1, "num_smn_regs", FIELD_FLAG_NUM_SMN }, + { FIELD_TYPE_U16, 1, "pad", 0 }, + + { FIELD_TYPE_U64, 1, "addr", FIELD_FLAG_SMN_START }, + { FIELD_TYPE_U32, 1, "value", 0 }, + { FIELD_TYPE_U32, 1, "pad", 0 }, + { 0, 0, NULL, 0 }, +}; + +struct metric_field pcie_regs[] = { + { FIELD_TYPE_U16, 1, "structure_size", 0 }, + { FIELD_TYPE_U8, 1, "format_revision", 0 }, + { FIELD_TYPE_U8, 1, "content_revision", 0 }, + { FIELD_TYPE_U8, 1, "state_type", 0 }, + { FIELD_TYPE_U8, 1, "num_instances", FIELD_FLAG_NUM_INSTANCE }, + { FIELD_TYPE_U16, 1, "pad", 0 }, + + { FIELD_TYPE_U16, 1, "instance", FIELD_FLAG_INSTANCE_START }, + { FIELD_TYPE_U16, 1, "state", 0 }, + { FIELD_TYPE_U16, 1, "num_smn_regs", FIELD_FLAG_NUM_SMN }, + { FIELD_TYPE_U16, 1, "pad", 0 }, + + { FIELD_TYPE_U16, 1, "device_status", 0 }, + { FIELD_TYPE_U16, 1, "link_status", 0 }, + { FIELD_TYPE_U32, 1, "sub_bus_number_latency", 0 }, + { FIELD_TYPE_U32, 1, "pcie_corr_err_status", 0 }, + { FIELD_TYPE_U32, 1, "pcie_uncorr_err_status", 0 }, + + { FIELD_TYPE_U64, 1, "addr", FIELD_FLAG_SMN_START }, + { FIELD_TYPE_U32, 1, "value", 0 }, + { FIELD_TYPE_U32, 1, "pad", 0 }, + { 0, 0, NULL, 0 }, +}; + +struct metric_field usr_regs[] = { + { FIELD_TYPE_U16, 1, "structure_size", 0 }, + { FIELD_TYPE_U8, 1, "format_revision", 0 }, + { FIELD_TYPE_U8, 1, "content_revision", 0 }, + { FIELD_TYPE_U8, 1, "state_type", 0 }, + { FIELD_TYPE_U8, 1, "num_instances", FIELD_FLAG_NUM_INSTANCE }, + { FIELD_TYPE_U16, 1, "pad", 0 }, + + { FIELD_TYPE_U16, 1, "instance", FIELD_FLAG_INSTANCE_START }, + { FIELD_TYPE_U16, 1, "state", 0 }, + { FIELD_TYPE_U16, 1, "num_smn_regs", FIELD_FLAG_NUM_SMN }, + { FIELD_TYPE_U16, 1, "pad", 0 }, + + { FIELD_TYPE_U64, 1, "addr", FIELD_FLAG_SMN_START }, + { FIELD_TYPE_U32, 1, "value", 0 }, + { FIELD_TYPE_U32, 1, "pad", 0 }, + { 0, 0, NULL, 0 }, +}; + +// definition for pm metrics table +#define FIELD_FLAG_ACCUMULATOR 0x01 + +struct metric_field smu_13_0_6_v8[] = { + { FIELD_TYPE_U16, 1, "structure_size", 0 }, + { FIELD_TYPE_U16, 1, "pad", 0 }, + { FIELD_TYPE_U32, 1, "mp1_ip_discovery_version", 0 }, + { FIELD_TYPE_U32, 1, "pmfw_version", 0 }, + { FIELD_TYPE_U32, 1, "pmmetrics_version", 0 }, + + { FIELD_TYPE_U32, 1, "AccumulationCounter", 0 }, + + { FIELD_TYPE_U32, 1, "MaxSocketTemperature", 0 }, + { FIELD_TYPE_U32, 1, "MaxVrTemperature", 0 }, + { FIELD_TYPE_U32, 1, "MaxHbmTemperature", 0 }, + { FIELD_TYPE_U64, 1, "MaxSocketTemperatureAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 1, "MaxVrTemperatureAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 1, "MaxHbmTemperatureAcc", FIELD_FLAG_ACCUMULATOR }, + + { FIELD_TYPE_U32, 1, "SocketPowerLimit", 0 }, + { FIELD_TYPE_U32, 1, "MaxSocketPowerLimit", 0 }, + { FIELD_TYPE_U32, 1, "SocketPower", 0 }, + + { FIELD_TYPE_U64, 1, "Timestamp", 0 }, + { FIELD_TYPE_U64, 1, "SocketEnergyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 1, "CcdEnergyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 1, "XcdEnergyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 1, "AidEnergyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 1, "HbmEnergyAcc", FIELD_FLAG_ACCUMULATOR }, + + { FIELD_TYPE_U32, 1, "CclkFrequencyLimit", 0 }, + { FIELD_TYPE_U32, 1, "GfxclkFrequencyLimit", 0 }, + { FIELD_TYPE_U32, 1, "FclkFrequency", 0 }, + { FIELD_TYPE_U32, 1, "UclkFrequency", 0 }, + { FIELD_TYPE_U32, 4, "SocclkFrequency", 0 }, + { FIELD_TYPE_U32, 4, "VclkFrequency", 0 }, + { FIELD_TYPE_U32, 4, "DclkFrequency", 0 }, + { FIELD_TYPE_U32, 4, "LclkFrequency", 0 }, + { FIELD_TYPE_U64, 8, "GfxclkFrequencyAcc", FIELD_FLAG_ACCUMULATOR}, + { FIELD_TYPE_U64, 96, "CclkFrequencyAcc", FIELD_FLAG_ACCUMULATOR }, + + { FIELD_TYPE_U32, 1, "MaxCclkFrequency", 0 }, + { FIELD_TYPE_U32, 1, "MinCclkFrequency", 0 }, + { FIELD_TYPE_U32, 1, "MaxGfxclkFrequency", 0 }, + { FIELD_TYPE_U32, 1, "MinGfxclkFrequency", 0 }, + { FIELD_TYPE_U32, 4, "FclkFrequencyTable", 0 }, + { FIELD_TYPE_U32, 4, "UclkFrequencyTable", 0 }, + { FIELD_TYPE_U32, 4, "SocclkFrequencyTable", 0 }, + { FIELD_TYPE_U32, 4, "VclkFrequencyTable", 0 }, + { FIELD_TYPE_U32, 4, "DclkFrequencyTable", 0 }, + { FIELD_TYPE_U32, 4, "LclkFrequencyTable", 0 }, + { FIELD_TYPE_U32, 1, "MaxLclkDpmRange", 0 }, + { FIELD_TYPE_U32, 1, "MinLclkDpmRange", 0 }, + + { FIELD_TYPE_U32, 1, "XgmiWidth", 0 }, + { FIELD_TYPE_U32, 1, "XgmiBitrate", 0 }, + { FIELD_TYPE_U64, 8, "XgmiReadBandwidthAcc", 0 }, + { FIELD_TYPE_U64, 8, "XgmiWriteBandwidthAcc", 0 }, + + { FIELD_TYPE_U32, 1, "SocketC0Residency", 0 }, + { FIELD_TYPE_U32, 1, "SocketGfxBusy", 0 }, + { FIELD_TYPE_U32, 1, "DramBandwidthUtilization", 0 }, + { FIELD_TYPE_U64, 1, "SocketC0ResidencyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 1, "SocketGfxBusyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 1, "DramBandwidthAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U32, 1, "MaxDramBandwidth", 0 }, + { FIELD_TYPE_U64, 1, "DramBandwidthUtilizationAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 4, "PcieBandwidthAcc", FIELD_FLAG_ACCUMULATOR }, + + { FIELD_TYPE_U32, 1, "ProchotResidencyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U32, 1, "PptResidencyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U32, 1, "SocketThmResidencyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U32, 1, "VrThmResidencyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U32, 1, "HbmThmResidencyAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U32, 1, "GfxLockXCDMak", 0 }, + + { FIELD_TYPE_U32, 8, "GfxclkFrequency", 0 }, + + { FIELD_TYPE_U64, 4, "PublicSerialNumber_AID", 0 }, + { FIELD_TYPE_U64, 8, "PublicSerialNumber_XCD", 0 }, + { FIELD_TYPE_U64, 12, "PublicSerialNumber_CCD", 0 }, + + { FIELD_TYPE_U64, 8, "XgmiReadDataSizeAcc", FIELD_FLAG_ACCUMULATOR }, + { FIELD_TYPE_U64, 8, "XgmiWriteDataSizeAcc", FIELD_FLAG_ACCUMULATOR }, + { 0, 0, NULL, 0 }, +}; + +} // namespace amd::smi + +#endif // ROCM_SMI_ROCM_SMI_BINARY_PARSER_H_ + diff --git a/rocm_smi/include/rocm_smi/rocm_smi_device.h b/rocm_smi/include/rocm_smi/rocm_smi_device.h index a64852133a..d3323fc25e 100755 --- a/rocm_smi/include/rocm_smi/rocm_smi_device.h +++ b/rocm_smi/include/rocm_smi/rocm_smi_device.h @@ -53,6 +53,7 @@ #include #include #include +#include #include "rocm_smi/rocm_smi_monitor.h" #include "rocm_smi/rocm_smi_power_mon.h" @@ -171,6 +172,8 @@ enum DevInfoTypes { kDevMemPageBad, kDevNumaNode, kDevGpuMetrics, + kDevPmMetrics, + kDevRegMetrics, kDevGpuReset, kDevAvailableComputePartition, kDevComputePartition, @@ -205,6 +208,7 @@ class Device { int readDevInfo(DevInfoTypes type, std::vector *retVec); int readDevInfo(DevInfoTypes type, std::size_t b_size, void *p_binary_data); + std::string get_sys_file_path_by_type(DevInfoTypes type) const; // Get the property from a file which may contain multiple properties. int readDevInfo(DevInfoTypes type, const std::string& property, std::string& value); @@ -231,7 +235,7 @@ class Device { void set_evt_notif_anon_fd(uint32_t fd) { evt_notif_anon_fd_ = static_cast(fd);} int evt_notif_anon_fd(void) const {return evt_notif_anon_fd_;} - metrics_table_header_t &gpu_metrics_ver(void) {return gpu_metrics_ver_;} + void fillSupportedFuncs(void); void DumpSupportedFunctions(void); bool DeviceAPISupported(std::string name, uint64_t variant, @@ -241,18 +245,15 @@ class Device { template std::string readBootPartitionState(uint32_t dv_ind); rsmi_status_t check_amdgpu_property_reinforcement_query(uint32_t dev_idx, AMDGpuVerbTypes_t verb_type); - void dev_set_gpu_metric(GpuMetricsBasePtr gpu_metrics_ptr) { m_gpu_metrics_ptr = gpu_metrics_ptr; }; + void dev_set_gpu_metric(GpuMetricsBasePtr gpu_metrics_ptr) { m_gpu_metrics_ptr = std::move(gpu_metrics_ptr); }; GpuMetricsBasePtr& dev_get_gpu_metric() { return m_gpu_metrics_ptr; }; const AMDGpuMetricsHeader_v1_t& dev_get_metrics_header() {return m_gpu_metrics_header; } rsmi_status_t setup_gpu_metrics_reading(); rsmi_status_t dev_read_gpu_metrics_header_data(); rsmi_status_t dev_read_gpu_metrics_all_data(); - rsmi_status_t dev_log_gpu_metrics(); rsmi_status_t run_internal_gpu_metrics_query(AMDGpuMetricsUnitType_t metric_counter, AMDGpuDynamicMetricTblValues_t& values); - - template - rsmi_status_t dev_run_gpu_metrics_query(AMDGpuMetricsUnitType_t metric_counter, T& metric_value); - + rsmi_status_t dev_log_gpu_metrics(std::ostringstream& outstream_metrics); + AMGpuMetricsPublicLatestTupl_t dev_copy_internal_to_external_metrics(); private: std::shared_ptr monitor_; @@ -287,8 +288,6 @@ class Device { int evt_notif_anon_fd_; FILE *evt_notif_anon_file_ptr_; - struct metrics_table_header_t gpu_metrics_ver_; - GpuMetricsBasePtr m_gpu_metrics_ptr; AMDGpuMetricsHeader_v1_t m_gpu_metrics_header; uint64_t m_gpu_metrics_updated_timestamp; diff --git a/rocm_smi/include/rocm_smi/rocm_smi_gpu_metrics.h b/rocm_smi/include/rocm_smi/rocm_smi_gpu_metrics.h index 607bd6acf0..1c217917e4 100644 --- a/rocm_smi/include/rocm_smi/rocm_smi_gpu_metrics.h +++ b/rocm_smi/include/rocm_smi/rocm_smi_gpu_metrics.h @@ -47,10 +47,16 @@ #include "rocm_smi/rocm_smi_common.h" #include "rocm_smi/rocm_smi.h" +#include +#include +#include #include +#include #include #include +#include #include +#include #include @@ -96,15 +102,14 @@ struct AMDGpuMetricsHeader_v1_t uint8_t m_content_revision; }; - -struct AMDGpuMetricsBase_t; -using AMDGpuMetricsBaseRef = AMDGpuMetricsBase_t&; struct AMDGpuMetricsBase_t { virtual ~AMDGpuMetricsBase_t() = default; }; +using AMDGpuMetricsBaseRef = AMDGpuMetricsBase_t&; -struct AMDGpuMetrics_v11_t : AMDGpuMetricsBase_t + +struct AMDGpuMetrics_v11_t { ~AMDGpuMetrics_v11_t() = default; @@ -166,7 +171,7 @@ struct AMDGpuMetrics_v11_t : AMDGpuMetricsBase_t uint16_t m_temperature_hbm[kRSMI_MAX_NUM_HBM_INSTANCES]; }; -struct AMDGpuMetrics_v12_t : AMDGpuMetricsBase_t +struct AMDGpuMetrics_v12_t { ~AMDGpuMetrics_v12_t() = default; @@ -226,11 +231,11 @@ struct AMDGpuMetrics_v12_t : AMDGpuMetricsBase_t uint32_t m_mem_activity_acc; // new in v1 uint16_t m_temperature_hbm[kRSMI_MAX_NUM_HBM_INSTANCES]; // new in v1 - // PMFW attached timestamp (10ns resolution) + // PMFW attached timestamp (10ns resolution) uint64_t m_firmware_timestamp; }; -struct AMDGpuMetrics_v13_t : AMDGpuMetricsBase_t +struct AMDGpuMetrics_v13_t { ~AMDGpuMetrics_v13_t() = default; @@ -304,7 +309,7 @@ struct AMDGpuMetrics_v13_t : AMDGpuMetricsBase_t uint64_t m_indep_throttle_status; }; -struct AMDGpuMetrics_v14_t : AMDGpuMetricsBase_t +struct AMDGpuMetrics_v14_t { ~AMDGpuMetrics_v14_t() = default; @@ -316,7 +321,7 @@ struct AMDGpuMetrics_v14_t : AMDGpuMetricsBase_t uint16_t m_temperature_vrsoc; // Power (Watts) - uint16_t m_curr_socket_power; + uint16_t m_current_socket_power; // Utilization (%) uint16_t m_average_gfx_activity; @@ -340,8 +345,8 @@ struct AMDGpuMetrics_v14_t : AMDGpuMetricsBase_t uint16_t m_pcie_link_speed; // in 0.1 GT/s // XGMI bus width and bitrate (in Gbps) - uint16_t m_xgmi_link_width; - uint16_t m_xgmi_link_speed; + uint16_t m_xgmi_link_width; + uint16_t m_xgmi_link_speed; // Utilization Accumulated (%) uint32_t m_gfx_activity_acc; @@ -353,6 +358,15 @@ struct AMDGpuMetrics_v14_t : AMDGpuMetricsBase_t // PCIE instantaneous bandwidth (GB/sec) uint64_t m_pcie_bandwidth_inst; + // PCIE L0 to recovery state transition accumulated count + uint64_t m_pcie_l0_to_recov_count_acc; + + // PCIE replay accumulated count + uint64_t m_pcie_replay_count_acc; + + // PCIE replay rollover accumulated count + uint64_t m_pcie_replay_rover_count_acc; + // XGMI accumulated data transfer size(KiloBytes) uint64_t m_xgmi_read_data_acc[kRSMI_MAX_NUM_XGMI_LINKS]; uint64_t m_xgmi_write_data_acc[kRSMI_MAX_NUM_XGMI_LINKS]; @@ -371,33 +385,52 @@ struct AMDGpuMetrics_v14_t : AMDGpuMetricsBase_t }; using AMGpuMetricsLatest_t = AMDGpuMetrics_v14_t; +/** + * This is GPU Metrics version that gets to public access. + * It is a unique/unified version (joined) of the previous + * versions (1.2 to latest 1.4). Data fields not used/relevant + * for the current driver version and GPU metrics version will + * not be populated, and therefore 0s (zeroes). + * + * If/in case anything new is added to a new version and there is + * a requirement to make it publicly available, into a single static + * table/form/struct, then it should be added here. + * + */ +using AMGpuMetricsPublicLatest_t = rsmi_gpu_metrics_t; +using AMGpuMetricsPublicLatestTupl_t = std::tuple; + +using GpuMetricU16Tbl_t = std::vector; +using GpuMetricU32Tbl_t = std::vector; +using GpuMetricU64Tbl_t = std::vector; using GPUMetricTempHbm_t = decltype(AMDGpuMetrics_v13_t::m_temperature_hbm); -using GPUMetricTempHbmTbl_t = std::array; +using GPUMetricTempHbmTbl_t = GpuMetricU16Tbl_t; using GPUMetricVcnActivity_t = decltype(AMDGpuMetrics_v14_t::m_vcn_activity); -using GPUMetricVcnActivityTbl_t = std::array; +using GPUMetricVcnActivityTbl_t = GpuMetricU16Tbl_t; using GPUMetricXgmiReadDataAcc_t = decltype(AMDGpuMetrics_v14_t::m_xgmi_read_data_acc); using GPUMetricXgmiWriteDataAcc_t = decltype(AMDGpuMetrics_v14_t::m_xgmi_write_data_acc); -using GPUMetricXgmiAccTbl_t = std::array; +using GPUMetricXgmiAccTbl_t = GpuMetricU64Tbl_t; using GPUMetricCurrGfxClk_t = decltype(AMDGpuMetrics_v14_t::m_current_gfxclk); -using GPUMetricCurrGfxClkTbl_t = std::array; +using GPUMetricCurrGfxClkTbl_t = GpuMetricU16Tbl_t; using GPUMetricCurrSocClk_t = decltype(AMDGpuMetrics_v14_t::m_current_socclk); -using GPUMetricCurrSocClkTbl_t = std::array; +using GPUMetricCurrSocClkTbl_t = GpuMetricU16Tbl_t; using GPUMetricCurrVClk0_t = decltype(AMDGpuMetrics_v14_t::m_current_vclk0); -using GPUMetricCurrVClkTbl_t = std::array; +using GPUMetricCurrVClkTbl_t = GpuMetricU16Tbl_t; using GPUMetricCurrDClk0_t = decltype(AMDGpuMetrics_v14_t::m_current_dclk0); -using GPUMetricCurrDClkTbl_t = std::array; +using GPUMetricCurrDClkTbl_t = GpuMetricU16Tbl_t; -/* +//// +/************************************************************ * When a new metric table is released, we have to update: * - 1. Constants related to the new metrics added; + 1. Constants related to the new metrics added (if any); (ie: kRSMI_MAX_NUM_XGMI_LINKS) 2. Constants related to new version: (ie: kRSMI_GPU_METRICS_API_CONTENT_MAJOR_VER_1) @@ -411,19 +444,35 @@ using GPUMetricCurrDClkTbl_t = std::array; 5. AMGpuMetricsLatest_t -> Newest AMDGpuMetrics_v1x_t 6. AMDGpuMetricVersionFlags_t (ie: AMDGpuMetricVersionFlags_t::kGpuMetricV14) + 7. Create the proper API using granular controls used by + rsmi_dev_gpu_metrics_info_query() (ie: rsmi_dev_temp_hotspot_get()) + + -> Remember to check/update: + - AMDGpuMetricsUnitType_t + - amdgpu_metrics_unit_type_translation_table + - AMDGpuMetrics_v1X_t structure in question + - populate_metrics_dynamic_tbl() + - copy_internal_to_external_metrics() + - init_max_public_gpu_matrics() */ using AMDGpuMetricTypeId_t = uint32_t; using AMDGpuMetricTypeIdSeq_t = uint32_t; using AMDGpuMetricVersionFlagId_t = uint32_t; +//// +/* + * + * These are used as Metric class, so Metric Units can be properly grouped. + * Each Metric Unit (or a set of them) is related to a Metric class. + * + */ enum class AMDGpuMetricsClassId_t : AMDGpuMetricTypeId_t { - kGpuMetricHeader = 0, + kGpuMetricHeader, kGpuMetricTemperature, kGpuMetricUtilization, kGpuMetricPowerEnergy, - kGpuMetricSystemClockCounter, kGpuMetricAverageClock, kGpuMetricCurrentClock, kGpuMetricThrottleStatus, @@ -435,6 +484,22 @@ enum class AMDGpuMetricsClassId_t : AMDGpuMetricTypeId_t }; using AMDGpuMetricsClassIdTranslationTbl_t = std::map; +/* + * + * These are the Metric units. Each one represents a specific metric we want + * to either store or retrieve. + * + * This also gives a more granular control over to what exactly is needed, + * helping to generalize metric queries. + * + * Each type a new (non-existing metric unit) metric is added, it should be + * updated here. + * - Their names matches (closely, regardless of their version) the name of + * the data structure members they represent. + * + * All metric units not flagged as v1.4 were either part of the base or + * added/changed up to v1.3 + */ enum class AMDGpuMetricsUnitType_t : AMDGpuMetricTypeId_t { // kGpuMetricTemperature counters @@ -452,7 +517,7 @@ enum class AMDGpuMetricsUnitType_t : AMDGpuMetricTypeId_t kMetricAvgMmActivity, kMetricGfxActivityAccumulator, kMetricMemActivityAccumulator, - kMetricVcnActivity, + kMetricVcnActivity, //v1.4 // kGpuMetricAverageClock counters kMetricAvgGfxClockFrequency, @@ -464,11 +529,11 @@ enum class AMDGpuMetricsUnitType_t : AMDGpuMetricTypeId_t kMetricAvgDClock1Frequency, // kGpuMetricCurrentClock counters - kMetricCurrGfxClock, - kMetricCurrSocClock, + kMetricCurrGfxClock, //v1.4: Changed to multi-valued + kMetricCurrSocClock, //v1.4: Changed to multi-valued kMetricCurrUClock, - kMetricCurrVClock0, - kMetricCurrDClock0, + kMetricCurrVClock0, //v1.4: Changed to multi-valued + kMetricCurrDClock0, //v1.4: Changed to multi-valued kMetricCurrVClock1, kMetricCurrDClock1, @@ -477,7 +542,7 @@ enum class AMDGpuMetricsUnitType_t : AMDGpuMetricTypeId_t kMetricIndepThrottleStatus, // kGpuMetricGfxClkLockStatus counters - kMetricGfxClkLockStatus, + kMetricGfxClkLockStatus, //v1.4 // kGpuMetricCurrentFanSpeed counters kMetricCurrFanSpeed, @@ -485,22 +550,25 @@ enum class AMDGpuMetricsUnitType_t : AMDGpuMetricTypeId_t // kGpuMetricLinkWidthSpeed counters kMetricPcieLinkWidth, kMetricPcieLinkSpeed, - kMetricPcieBandwidthAccumulator, - kMetricPcieBandwidthInst, - kMetricXgmiLinkWidth, - kMetricXgmiLinkSpeed, - kMetricXgmiReadDataAccumulator, - kMetricXgmiWriteDataAccumulator, + kMetricPcieBandwidthAccumulator, //v1.4 + kMetricPcieBandwidthInst, //v1.4 + kMetricXgmiLinkWidth, //v1.4 + kMetricXgmiLinkSpeed, //v1.4 + kMetricXgmiReadDataAccumulator, //v1.4 + kMetricXgmiWriteDataAccumulator, //v1.4 + kMetricPcieL0RecovCountAccumulator, //v1.4 + kMetricPcieReplayCountAccumulator, //v1.4 + kMetricPcieReplayRollOverCountAccumulator, //v1.4 // kGpuMetricPowerEnergy counters kMetricAvgSocketPower, - kMetricCurrSocketPower, - kMetricEnergyAccumulator, + kMetricCurrSocketPower, //v1.4 + kMetricEnergyAccumulator, //v1.4 // kGpuMetricVoltage counters - kMetricVoltageSoc, - kMetricVoltageGfx, - kMetricVoltageMem, + kMetricVoltageSoc, //v1.3 + kMetricVoltageGfx, //v1.3 + kMetricVoltageMem, //v1.3 // kGpuMetricTimestamp counters kMetricTSClockCounter, @@ -526,8 +594,12 @@ struct AMDGpuDynamicMetricsValue_t using AMDGpuDynamicMetricTblValues_t = std::vector; using AMDGpuDynamicMetricsTbl_t = std::map>; -// Note: All supported metric versions are listed her -// If not here, they are not supported + +/* + * + * Note: All supported metric versions are listed here, otherwise unsupported + * + */ enum class AMDGpuMetricVersionFlags_t : AMDGpuMetricVersionFlagId_t { kGpuMetricNone = 0x0, @@ -537,21 +609,19 @@ enum class AMDGpuMetricVersionFlags_t : AMDGpuMetricVersionFlagId_t kGpuMetricV13 = (0x1 << 3), kGpuMetricV14 = (0x1 << 4), }; -using AMDGpuMetricVersionTranslationTbl_t = std::map; - - -class GpuMetricsBase_t; -using GpuMetricsBasePtr = std::shared_ptr; +using AMDGpuMetricVersionTranslationTbl_t = std::map; +using GpuMetricTypePtr_t = std::shared_ptr; class GpuMetricsBase_t { public: virtual ~GpuMetricsBase_t() = default; virtual size_t sizeof_metric_table() = 0; - virtual AMDGpuMetricsBaseRef get_metrics_table() = 0; + virtual GpuMetricTypePtr_t get_metrics_table() = 0; + virtual void dump_internal_metrics_table() = 0; virtual AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() = 0; virtual rsmi_status_t populate_metrics_dynamic_tbl() = 0; - + virtual AMGpuMetricsPublicLatestTupl_t copy_internal_to_external_metrics() = 0; virtual AMDGpuDynamicMetricsTbl_t get_metrics_dynamic_tbl() { return m_metrics_dynamic_tbl; } @@ -561,21 +631,31 @@ class GpuMetricsBase_t uint64_t m_metrics_timestamp; }; +using GpuMetricsBasePtr = std::shared_ptr; using AMDGpuMetricFactories_t = std::map; class GpuMetricsBase_v11_t final : public GpuMetricsBase_t { public: - ~GpuMetricsBase_v11_t() = default; + virtual ~GpuMetricsBase_v11_t() = default; size_t sizeof_metric_table() override { return sizeof(AMDGpuMetrics_v11_t); } - AMDGpuMetricsBaseRef get_metrics_table() override + GpuMetricTypePtr_t get_metrics_table() override { - return m_gpu_metrics_tbl; + if (!m_gpu_metric_ptr) { + m_gpu_metric_ptr.reset(&m_gpu_metrics_tbl, [](AMDGpuMetrics_v11_t*){}); + } + assert(m_gpu_metric_ptr != nullptr); + return m_gpu_metric_ptr; + } + + void dump_internal_metrics_table() override + { + return; } AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override @@ -584,10 +664,12 @@ class GpuMetricsBase_v11_t final : public GpuMetricsBase_t } rsmi_status_t populate_metrics_dynamic_tbl() override; + AMGpuMetricsPublicLatestTupl_t copy_internal_to_external_metrics() override; private: AMDGpuMetrics_v11_t m_gpu_metrics_tbl; + std::shared_ptr m_gpu_metric_ptr; }; @@ -600,9 +682,18 @@ class GpuMetricsBase_v12_t final : public GpuMetricsBase_t return sizeof(AMDGpuMetrics_v12_t); } - AMDGpuMetricsBaseRef get_metrics_table() override + GpuMetricTypePtr_t get_metrics_table() override { - return m_gpu_metrics_tbl; + if (!m_gpu_metric_ptr) { + m_gpu_metric_ptr.reset(&m_gpu_metrics_tbl, [](AMDGpuMetrics_v12_t*){}); + } + assert(m_gpu_metric_ptr != nullptr); + return m_gpu_metric_ptr; + } + + void dump_internal_metrics_table() override + { + return; } AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override @@ -611,10 +702,11 @@ class GpuMetricsBase_v12_t final : public GpuMetricsBase_t } rsmi_status_t populate_metrics_dynamic_tbl() override; - + AMGpuMetricsPublicLatestTupl_t copy_internal_to_external_metrics() override; private: AMDGpuMetrics_v12_t m_gpu_metrics_tbl; + std::shared_ptr m_gpu_metric_ptr; }; @@ -627,21 +719,29 @@ class GpuMetricsBase_v13_t final : public GpuMetricsBase_t return sizeof(AMDGpuMetrics_v13_t); } - AMDGpuMetricsBaseRef get_metrics_table() override + GpuMetricTypePtr_t get_metrics_table() override { - return m_gpu_metrics_tbl; + if (!m_gpu_metric_ptr) { + m_gpu_metric_ptr.reset(&m_gpu_metrics_tbl, [](AMDGpuMetrics_v13_t*){}); + } + assert(m_gpu_metric_ptr != nullptr); + return (m_gpu_metric_ptr); } + void dump_internal_metrics_table() override; + AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { return AMDGpuMetricVersionFlags_t::kGpuMetricV13; } rsmi_status_t populate_metrics_dynamic_tbl() override; + AMGpuMetricsPublicLatestTupl_t copy_internal_to_external_metrics() override; private: AMDGpuMetrics_v13_t m_gpu_metrics_tbl; + std::shared_ptr m_gpu_metric_ptr; }; @@ -654,28 +754,41 @@ class GpuMetricsBase_v14_t final : public GpuMetricsBase_t return sizeof(AMDGpuMetrics_v14_t); } - AMDGpuMetricsBaseRef get_metrics_table() override + GpuMetricTypePtr_t get_metrics_table() override { - return m_gpu_metrics_tbl; + if (!m_gpu_metric_ptr) { + m_gpu_metric_ptr.reset(&m_gpu_metrics_tbl, [](AMDGpuMetrics_v14_t*){}); + } + assert(m_gpu_metric_ptr != nullptr); + return m_gpu_metric_ptr; } + void dump_internal_metrics_table() override; + AMDGpuMetricVersionFlags_t get_gpu_metrics_version_used() override { return AMDGpuMetricVersionFlags_t::kGpuMetricV14; } rsmi_status_t populate_metrics_dynamic_tbl() override; + AMGpuMetricsPublicLatestTupl_t copy_internal_to_external_metrics() override; private: AMDGpuMetrics_v14_t m_gpu_metrics_tbl; + std::shared_ptr m_gpu_metric_ptr; }; + template rsmi_status_t rsmi_dev_gpu_metrics_info_query(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, T& metric_value); } // namespace amd::smi -#endif // ROCM_SMI_ROCM_SMI_GPU_METRICS_H_ +rsmi_status_t +rsmi_dev_gpu_metrics_header_info_get(uint32_t dv_ind, metrics_table_header_t& header_value); + + +#endif // ROCM_SMI_ROCM_SMI_GPU_METRICS_H_ diff --git a/rocm_smi/python_smi_tools/README.md b/rocm_smi/python_smi_tools/README.md index 57654290fe..5d9cb9fd06 100644 --- a/rocm_smi/python_smi_tools/README.md +++ b/rocm_smi/python_smi_tools/README.md @@ -1,6 +1,4 @@ -## Synopsis - -Radeon Open Compute Platform - System Management Interface - Command Line tool. +## Radeon Open Compute (ROCm) - System Management Interface - Command Line Tool This tool acts as a command line interface for manipulating and monitoring the amdgpu kernel, and is intended to replace diff --git a/rocm_smi/src/rocm_smi.cc b/rocm_smi/src/rocm_smi.cc index d9251397e3..3a71904b26 100755 --- a/rocm_smi/src/rocm_smi.cc +++ b/rocm_smi/src/rocm_smi.cc @@ -61,6 +61,7 @@ #include #include #include +#include #include #include @@ -106,6 +107,14 @@ static const std::map kClkTypeMap = { #define TRY try { #define CATCH } catch (...) {return amd::smi::handleException();} +// declare pm metrics and register table function +namespace amd::smi { +int present_pmmetrics(const char* sysfs_file_name, + rsmi_name_value_t **kv, uint32_t *kvnum); +int present_reg_state(const char* fname, rsmi_reg_type_t reg_type, + rsmi_name_value_t **kv, uint32_t *kvnum); +} + static uint64_t get_multiplier_from_str(char units_char) { uint32_t multiplier = 0; @@ -2479,6 +2488,40 @@ rsmi_dev_vendor_name_get(uint32_t dv_ind, char *name, size_t len) { CATCH } +rsmi_status_t rsmi_dev_pm_metrics_info_get(uint32_t dv_ind, + rsmi_name_value_t** pm_metrics, + uint32_t *num_of_metrics) { + TRY + DEVICE_MUTEX + CHK_SUPPORT_NAME_ONLY(num_of_metrics) + std::string file_path = dev-> + get_sys_file_path_by_type(amd::smi::kDevPmMetrics); + + int ret = amd::smi::present_pmmetrics( + file_path.c_str(), pm_metrics, num_of_metrics); + if (ret == 0) return RSMI_STATUS_SUCCESS; + return RSMI_STATUS_NOT_SUPPORTED; + + CATCH +} + +rsmi_status_t rsmi_dev_reg_table_info_get(uint32_t dv_ind, + rsmi_reg_type_t reg_type, + rsmi_name_value_t** reg_metrics, + uint32_t *num_of_metrics) { + TRY + DEVICE_MUTEX + CHK_SUPPORT_NAME_ONLY(num_of_metrics) + std::string file_path = dev-> + get_sys_file_path_by_type(amd::smi::kDevRegMetrics); + + int ret = amd::smi::present_reg_state( + file_path.c_str(), reg_type, reg_metrics, num_of_metrics); + if (ret == 0) return RSMI_STATUS_SUCCESS; + return RSMI_STATUS_NOT_SUPPORTED; + + CATCH +} rsmi_status_t rsmi_dev_pci_bandwidth_get(uint32_t dv_ind, rsmi_pcie_bandwidth_t *b) { @@ -3232,6 +3275,11 @@ rsmi_dev_energy_count_get(uint32_t dv_ind, uint64_t *power, ss << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ss); + if (power == nullptr || + timestamp == nullptr) { + return RSMI_STATUS_INVALID_ARGS; + } + rsmi_status_t ret; rsmi_gpu_metrics_t gpu_metrics; ret = rsmi_dev_gpu_metrics_info_get(dv_ind, &gpu_metrics); @@ -3239,11 +3287,6 @@ rsmi_dev_energy_count_get(uint32_t dv_ind, uint64_t *power, return ret; } - if (power == nullptr || - timestamp == nullptr) { - return RSMI_STATUS_INVALID_ARGS; - } - *power = gpu_metrics.energy_accumulator; *timestamp = gpu_metrics.system_clock_counter; // hard-coded for now since all ASICs have same resolution. If it ASIC @@ -3734,6 +3777,11 @@ rsmi_utilization_count_get(uint32_t dv_ind, uint64_t *timestamp) { TRY + if (timestamp == nullptr || + utilization_counters == nullptr) { + return RSMI_STATUS_INVALID_ARGS; + } + rsmi_status_t ret; rsmi_gpu_metrics_t gpu_metrics; uint32_t val_ui32; @@ -3743,11 +3791,6 @@ rsmi_utilization_count_get(uint32_t dv_ind, return ret; } - if (timestamp == nullptr || - utilization_counters == nullptr) { - return RSMI_STATUS_INVALID_ARGS; - } - for (uint32_t index = 0 ; index < count; index++) { switch (utilization_counters[index].type) { case RSMI_COARSE_GRAIN_GFX_ACTIVITY: @@ -5796,13 +5839,45 @@ rsmi_status_t rsmi_event_notification_stop(uint32_t dv_ind) { // so they can be used/tested. // rsmi_status_t -rsmi_dev_temp_hotspot_get(uint32_t dv_ind, uint16_t* hotspot_value) +rsmi_dev_metrics_temp_edge_get(uint32_t dv_ind, uint16_t* edge_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(edge_value != nullptr); + if (edge_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricTempEdge); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *edge_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_temp_hotspot_get(uint32_t dv_ind, uint16_t* hotspot_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(hotspot_value != nullptr); + if (hotspot_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricTempHotspot); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *hotspot_value); ostrstream << __PRETTY_FUNCTION__ @@ -5818,13 +5893,18 @@ rsmi_dev_temp_hotspot_get(uint32_t dv_ind, uint16_t* hotspot_value) } rsmi_status_t -rsmi_dev_temp_mem_get(uint32_t dv_ind, uint16_t* mem_value) +rsmi_dev_metrics_temp_mem_get(uint32_t dv_ind, uint16_t* mem_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(mem_value != nullptr); + if (mem_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricTempMem); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *mem_value); ostrstream << __PRETTY_FUNCTION__ @@ -5840,13 +5920,45 @@ rsmi_dev_temp_mem_get(uint32_t dv_ind, uint16_t* mem_value) } rsmi_status_t -rsmi_dev_temp_vrsoc_get(uint32_t dv_ind, uint16_t* vrsoc_value) +rsmi_dev_metrics_temp_vrgfx_get(uint32_t dv_ind, uint16_t* vrgfx_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(vrgfx_value != nullptr); + if (vrgfx_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricTempVrGfx); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *vrgfx_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_temp_vrsoc_get(uint32_t dv_ind, uint16_t* vrsoc_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(vrsoc_value != nullptr); + if (vrsoc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricTempVrSoc); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *vrsoc_value); ostrstream << __PRETTY_FUNCTION__ @@ -5862,13 +5974,45 @@ rsmi_dev_temp_vrsoc_get(uint32_t dv_ind, uint16_t* vrsoc_value) } rsmi_status_t -rsmi_dev_curr_socket_power_get(uint32_t dv_ind, uint16_t* socket_power_value) +rsmi_dev_metrics_temp_vrmem_get(uint32_t dv_ind, uint16_t* vrmem_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(vrmem_value != nullptr); + if (vrmem_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricTempVrMem); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *vrmem_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_curr_socket_power_get(uint32_t dv_ind, uint16_t* socket_power_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(socket_power_value != nullptr); + if (socket_power_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricCurrSocketPower); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *socket_power_value); ostrstream << __PRETTY_FUNCTION__ @@ -5883,14 +6027,47 @@ rsmi_dev_curr_socket_power_get(uint32_t dv_ind, uint16_t* socket_power_value) CATCH } + rsmi_status_t -rsmi_dev_avg_gfx_activity_get(uint32_t dv_ind, uint16_t* gfx_activity_value) +rsmi_dev_metrics_avg_socket_power_get(uint32_t dv_ind, uint16_t* socket_power_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(socket_power_value != nullptr); + if (socket_power_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgSocketPower); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *socket_power_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_avg_gfx_activity_get(uint32_t dv_ind, uint16_t* gfx_activity_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(gfx_activity_value != nullptr); + if (gfx_activity_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgGfxActivity); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *gfx_activity_value); ostrstream << __PRETTY_FUNCTION__ @@ -5906,13 +6083,18 @@ rsmi_dev_avg_gfx_activity_get(uint32_t dv_ind, uint16_t* gfx_activity_value) } rsmi_status_t -rsmi_dev_avg_umc_activity_get(uint32_t dv_ind, uint16_t* umc_activity_value) +rsmi_dev_metrics_avg_umc_activity_get(uint32_t dv_ind, uint16_t* umc_activity_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(umc_activity_value != nullptr); + if (umc_activity_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgUmcActivity); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *umc_activity_value); ostrstream << __PRETTY_FUNCTION__ @@ -5928,13 +6110,45 @@ rsmi_dev_avg_umc_activity_get(uint32_t dv_ind, uint16_t* umc_activity_value) } rsmi_status_t -rsmi_dev_energy_acc_get(uint32_t dv_ind, uint64_t* energy_acc_value) +rsmi_dev_metrics_avg_mm_activity_get(uint32_t dv_ind, uint16_t* mm_activity_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(mm_activity_value != nullptr); + if (mm_activity_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgMmActivity); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *mm_activity_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_energy_acc_get(uint32_t dv_ind, uint64_t* energy_acc_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(energy_acc_value != nullptr); + if (energy_acc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricEnergyAccumulator); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *energy_acc_value); ostrstream << __PRETTY_FUNCTION__ @@ -5950,13 +6164,18 @@ rsmi_dev_energy_acc_get(uint32_t dv_ind, uint64_t* energy_acc_value) } rsmi_status_t -rsmi_dev_system_clock_counter_get(uint32_t dv_ind, uint64_t* system_clock_counter_value) +rsmi_dev_metrics_system_clock_counter_get(uint32_t dv_ind, uint64_t* system_clock_counter_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(system_clock_counter_value != nullptr); + if (system_clock_counter_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricTSClockCounter); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *system_clock_counter_value); ostrstream << __PRETTY_FUNCTION__ @@ -5972,13 +6191,18 @@ rsmi_dev_system_clock_counter_get(uint32_t dv_ind, uint64_t* system_clock_counte } rsmi_status_t -rsmi_dev_firmware_timestamp_get(uint32_t dv_ind, uint64_t* firmware_timestamp_value) +rsmi_dev_metrics_firmware_timestamp_get(uint32_t dv_ind, uint64_t* firmware_timestamp_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(firmware_timestamp_value != nullptr); + if (firmware_timestamp_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricTSFirmware); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *firmware_timestamp_value); ostrstream << __PRETTY_FUNCTION__ @@ -5994,13 +6218,45 @@ rsmi_dev_firmware_timestamp_get(uint32_t dv_ind, uint64_t* firmware_timestamp_va } rsmi_status_t -rsmi_dev_throttle_status_get(uint32_t dv_ind, uint32_t* throttle_status_value) +rsmi_dev_metrics_indep_throttle_status_get(uint32_t dv_ind, uint64_t* throttle_status_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(throttle_status_value != nullptr); + if (throttle_status_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricIndepThrottleStatus); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *throttle_status_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_throttle_status_get(uint32_t dv_ind, uint32_t* throttle_status_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(throttle_status_value != nullptr); + if (throttle_status_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricThrottleStatus); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *throttle_status_value); ostrstream << __PRETTY_FUNCTION__ @@ -6016,13 +6272,45 @@ rsmi_dev_throttle_status_get(uint32_t dv_ind, uint32_t* throttle_status_value) } rsmi_status_t -rsmi_dev_pcie_link_width_get(uint32_t dv_ind, uint16_t* pcie_link_width_value) +rsmi_dev_metrics_curr_fan_speed_get(uint32_t dv_ind, uint16_t* fan_speed_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(fan_speed_value != nullptr); + if (fan_speed_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricCurrFanSpeed); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *fan_speed_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_pcie_link_width_get(uint32_t dv_ind, uint16_t* pcie_link_width_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(pcie_link_width_value != nullptr); + if (pcie_link_width_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricPcieLinkWidth); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *pcie_link_width_value); ostrstream << __PRETTY_FUNCTION__ @@ -6038,13 +6326,18 @@ rsmi_dev_pcie_link_width_get(uint32_t dv_ind, uint16_t* pcie_link_width_value) } rsmi_status_t -rsmi_dev_pcie_link_speed_get(uint32_t dv_ind, uint16_t* pcie_link_speed_value) +rsmi_dev_metrics_pcie_link_speed_get(uint32_t dv_ind, uint16_t* pcie_link_speed_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(pcie_link_speed_value != nullptr); + if (pcie_link_speed_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricPcieLinkSpeed); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *pcie_link_speed_value); ostrstream << __PRETTY_FUNCTION__ @@ -6060,13 +6353,18 @@ rsmi_dev_pcie_link_speed_get(uint32_t dv_ind, uint16_t* pcie_link_speed_value) } rsmi_status_t -rsmi_dev_xgmi_link_width_get(uint32_t dv_ind, uint16_t* xgmi_link_width_value) +rsmi_dev_metrics_xgmi_link_width_get(uint32_t dv_ind, uint16_t* xgmi_link_width_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(xgmi_link_width_value != nullptr); + if (xgmi_link_width_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricXgmiLinkWidth); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *xgmi_link_width_value); ostrstream << __PRETTY_FUNCTION__ @@ -6082,13 +6380,18 @@ rsmi_dev_xgmi_link_width_get(uint32_t dv_ind, uint16_t* xgmi_link_width_value) } rsmi_status_t -rsmi_dev_xgmi_link_speed_get(uint32_t dv_ind, uint16_t* xgmi_link_speed_value) +rsmi_dev_metrics_xgmi_link_speed_get(uint32_t dv_ind, uint16_t* xgmi_link_speed_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(xgmi_link_speed_value != nullptr); + if (xgmi_link_speed_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricXgmiLinkSpeed); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *xgmi_link_speed_value); ostrstream << __PRETTY_FUNCTION__ @@ -6104,13 +6407,18 @@ rsmi_dev_xgmi_link_speed_get(uint32_t dv_ind, uint16_t* xgmi_link_speed_value) } rsmi_status_t -rsmi_dev_gfxclk_lock_status_get(uint32_t dv_ind, uint32_t* gfxclk_lock_status_value) +rsmi_dev_metrics_gfxclk_lock_status_get(uint32_t dv_ind, uint32_t* gfxclk_lock_status_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(gfxclk_lock_status_value != nullptr); + if (gfxclk_lock_status_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricGfxClkLockStatus); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *gfxclk_lock_status_value); ostrstream << __PRETTY_FUNCTION__ @@ -6126,13 +6434,18 @@ rsmi_dev_gfxclk_lock_status_get(uint32_t dv_ind, uint32_t* gfxclk_lock_status_va } rsmi_status_t -rsmi_dev_gfx_activity_acc_get(uint32_t dv_ind, uint32_t* gfx_activity_acc_value) +rsmi_dev_metrics_gfx_activity_acc_get(uint32_t dv_ind, uint32_t* gfx_activity_acc_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(gfx_activity_acc_value != nullptr); + if (gfx_activity_acc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricGfxActivityAccumulator); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *gfx_activity_acc_value); ostrstream << __PRETTY_FUNCTION__ @@ -6148,13 +6461,18 @@ rsmi_dev_gfx_activity_acc_get(uint32_t dv_ind, uint32_t* gfx_activity_acc_value) } rsmi_status_t -rsmi_dev_mem_activity_acc_get(uint32_t dv_ind, uint32_t* mem_activity_acc_value) +rsmi_dev_metrics_mem_activity_acc_get(uint32_t dv_ind, uint32_t* mem_activity_acc_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(mem_activity_acc_value != nullptr); + if (mem_activity_acc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricMemActivityAccumulator); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *mem_activity_acc_value); ostrstream << __PRETTY_FUNCTION__ @@ -6170,13 +6488,18 @@ rsmi_dev_mem_activity_acc_get(uint32_t dv_ind, uint32_t* mem_activity_acc_value) } rsmi_status_t -rsmi_dev_pcie_bandwidth_acc_get(uint32_t dv_ind, uint64_t* pcie_bandwidth_acc_value) +rsmi_dev_metrics_pcie_bandwidth_acc_get(uint32_t dv_ind, uint64_t* pcie_bandwidth_acc_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(pcie_bandwidth_acc_value != nullptr); + if (pcie_bandwidth_acc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricPcieBandwidthAccumulator); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *pcie_bandwidth_acc_value); ostrstream << __PRETTY_FUNCTION__ @@ -6192,13 +6515,18 @@ rsmi_dev_pcie_bandwidth_acc_get(uint32_t dv_ind, uint64_t* pcie_bandwidth_acc_va } rsmi_status_t -rsmi_dev_pcie_bandwidth_inst_get(uint32_t dv_ind, uint64_t* pcie_bandwidth_inst_value) +rsmi_dev_metrics_pcie_bandwidth_inst_get(uint32_t dv_ind, uint64_t* pcie_bandwidth_inst_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(pcie_bandwidth_inst_value != nullptr); + if (pcie_bandwidth_inst_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricPcieBandwidthInst); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *pcie_bandwidth_inst_value); ostrstream << __PRETTY_FUNCTION__ @@ -6213,14 +6541,101 @@ rsmi_dev_pcie_bandwidth_inst_get(uint32_t dv_ind, uint64_t* pcie_bandwidth_inst_ CATCH } + rsmi_status_t -rsmi_dev_curr_uclk_get(uint32_t dv_ind, uint16_t* uclk_value) +rsmi_dev_metrics_pcie_l0_recov_count_acc_get(uint32_t dv_ind, uint64_t* pcie_count_acc_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(pcie_count_acc_value != nullptr); + if (pcie_count_acc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricPcieL0RecovCountAccumulator); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *pcie_count_acc_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_pcie_replay_count_acc_get(uint32_t dv_ind, uint64_t* pcie_count_acc_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(pcie_count_acc_value != nullptr); + if (pcie_count_acc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricPcieReplayCountAccumulator); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *pcie_count_acc_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_pcie_replay_rover_count_acc_get(uint32_t dv_ind, uint64_t* pcie_count_acc_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(pcie_count_acc_value != nullptr); + if (pcie_count_acc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricPcieReplayRollOverCountAccumulator); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *pcie_count_acc_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_curr_uclk_get(uint32_t dv_ind, uint16_t* uclk_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(uclk_value != nullptr); + if (uclk_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricCurrUClock); auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *uclk_value); ostrstream << __PRETTY_FUNCTION__ @@ -6236,155 +6651,258 @@ rsmi_dev_curr_uclk_get(uint32_t dv_ind, uint16_t* uclk_value) } rsmi_status_t -rsmi_dev_vcn_activity_get(uint32_t dv_ind, amd::smi::GPUMetricVcnActivityTbl_t* vcn_activity_value) +rsmi_dev_metrics_temp_hbm_get(uint32_t dv_ind, GPUMetricTempHbm_t* temp_hbm_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); - const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVcnActivity); - amd::smi::GPUMetricVcnActivityTbl_t tmp_vcn_activity_value; - *vcn_activity_value = tmp_vcn_activity_value; - auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + assert(temp_hbm_value != nullptr); + if (temp_hbm_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricTempHbm); + amd::smi::GPUMetricTempHbmTbl_t tmp_hbl_tbl{}; + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, tmp_hbl_tbl); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + const auto max_num_elems = + static_cast(std::end(*temp_hbm_value) - std::begin(*temp_hbm_value)); + std::copy_n(std::begin(tmp_hbl_tbl), max_num_elems, *temp_hbm_value); + } ostrstream << __PRETTY_FUNCTION__ << " | ======= end ======= " << " | End Result " << " | Device #: " << dv_ind << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Metric Size: " << tmp_hbl_tbl.size() << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; LOG_INFO(ostrstream); + return status_code; CATCH } rsmi_status_t -rsmi_dev_xgmi_read_data_get(uint32_t dv_ind, amd::smi::GPUMetricXgmiAccTbl_t* xgmi_read_data_acc_value) +rsmi_dev_metrics_vcn_activity_get(uint32_t dv_ind, GPUMetricVcnActivity_t* vcn_activity_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); + assert(vcn_activity_value != nullptr); + if (vcn_activity_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVcnActivity); - amd::smi::GPUMetricXgmiAccTbl_t tmp_xgmi_read_data_acc_value; - *xgmi_read_data_acc_value = tmp_xgmi_read_data_acc_value; - auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + amd::smi::GPUMetricVcnActivityTbl_t tmp_vcn_tbl{}; + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, tmp_vcn_tbl); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + const auto max_num_elems = + static_cast(std::end(*vcn_activity_value) - std::begin(*vcn_activity_value)); + std::copy_n(std::begin(tmp_vcn_tbl), max_num_elems, *vcn_activity_value); + } ostrstream << __PRETTY_FUNCTION__ << " | ======= end ======= " << " | End Result " << " | Device #: " << dv_ind << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Metric Size: " << tmp_vcn_tbl.size() << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; LOG_INFO(ostrstream); + return status_code; CATCH } rsmi_status_t -rsmi_dev_xgmi_write_data_get(uint32_t dv_ind, amd::smi::GPUMetricXgmiAccTbl_t* xgmi_write_data_acc_value) +rsmi_dev_metrics_xgmi_read_data_get(uint32_t dv_ind, GPUMetricXgmiReadDataAcc_t* xgmi_read_data_acc_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); - const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVcnActivity); - amd::smi::GPUMetricXgmiAccTbl_t tmp_xgmi_write_data_acc_value; - *xgmi_write_data_acc_value = tmp_xgmi_write_data_acc_value; - auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + assert(xgmi_read_data_acc_value != nullptr); + if (xgmi_read_data_acc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricXgmiReadDataAccumulator); + amd::smi::GPUMetricXgmiAccTbl_t tmp_xgmi_acc_tbl{}; + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, tmp_xgmi_acc_tbl); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + const auto max_num_elems = + static_cast(std::end(*xgmi_read_data_acc_value) - std::begin(*xgmi_read_data_acc_value)); + std::copy_n(std::begin(tmp_xgmi_acc_tbl), max_num_elems, *xgmi_read_data_acc_value); + } ostrstream << __PRETTY_FUNCTION__ << " | ======= end ======= " << " | End Result " << " | Device #: " << dv_ind << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Metric Size: " << tmp_xgmi_acc_tbl.size() << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; LOG_INFO(ostrstream); + return status_code; CATCH } rsmi_status_t -rsmi_dev_curr_gfxclk_get(uint32_t dv_ind, amd::smi::GPUMetricCurrGfxClkTbl_t* current_gfxclk_value) +rsmi_dev_metrics_xgmi_write_data_get(uint32_t dv_ind, GPUMetricXgmiWriteDataAcc_t* xgmi_write_data_acc_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); - const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVcnActivity); - amd::smi::GPUMetricCurrGfxClkTbl_t tmp_current_gfxclk_value; - *current_gfxclk_value = tmp_current_gfxclk_value; - auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + assert(xgmi_write_data_acc_value != nullptr); + if (xgmi_write_data_acc_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricXgmiWriteDataAccumulator); + amd::smi::GPUMetricXgmiAccTbl_t tmp_xgmi_acc_tbl{}; + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, tmp_xgmi_acc_tbl); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + const auto max_num_elems = + static_cast(std::end(*xgmi_write_data_acc_value) - std::begin(*xgmi_write_data_acc_value)); + std::copy_n(std::begin(tmp_xgmi_acc_tbl), max_num_elems, *xgmi_write_data_acc_value); + } ostrstream << __PRETTY_FUNCTION__ << " | ======= end ======= " << " | End Result " << " | Device #: " << dv_ind << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Metric Size: " << tmp_xgmi_acc_tbl.size() << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; LOG_INFO(ostrstream); + return status_code; CATCH } rsmi_status_t -rsmi_dev_curr_socclk_get(uint32_t dv_ind, amd::smi::GPUMetricCurrSocClkTbl_t* current_socclk_value) +rsmi_dev_metrics_curr_gfxclk_get(uint32_t dv_ind, GPUMetricCurrGfxClk_t* current_gfxclk_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); - const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVcnActivity); - amd::smi::GPUMetricCurrSocClkTbl_t tmp_current_socclk_value; - *current_socclk_value = tmp_current_socclk_value; - auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + assert(current_gfxclk_value != nullptr); + if (current_gfxclk_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricCurrGfxClock); + amd::smi::GPUMetricCurrGfxClkTbl_t tmp_curr_gfxclk_tbl{}; + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, tmp_curr_gfxclk_tbl); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + const auto max_num_elems = + static_cast(std::end(*current_gfxclk_value) - std::begin(*current_gfxclk_value)); + std::copy_n(std::begin(tmp_curr_gfxclk_tbl), max_num_elems, *current_gfxclk_value); + } ostrstream << __PRETTY_FUNCTION__ << " | ======= end ======= " << " | End Result " << " | Device #: " << dv_ind << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Metric Size: " << tmp_curr_gfxclk_tbl.size() << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; LOG_INFO(ostrstream); + return status_code; CATCH } rsmi_status_t -rsmi_dev_curr_vclk0_get(uint32_t dv_ind, amd::smi::GPUMetricCurrVClkTbl_t* current_vclk_value) +rsmi_dev_metrics_curr_socclk_get(uint32_t dv_ind, GPUMetricCurrSocClk_t* current_socclk_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); - const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVcnActivity); - amd::smi::GPUMetricCurrVClkTbl_t tmp_current_vclk_value; - *current_vclk_value = tmp_current_vclk_value; - auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + assert(current_socclk_value != nullptr); + if (current_socclk_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricCurrSocClock); + amd::smi::GPUMetricCurrSocClkTbl_t tmp_curr_socclk_tbl{}; + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, tmp_curr_socclk_tbl); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + const auto max_num_elems = + static_cast(std::end(*current_socclk_value) - std::begin(*current_socclk_value)); + std::copy_n(std::begin(tmp_curr_socclk_tbl), max_num_elems, *current_socclk_value); + } ostrstream << __PRETTY_FUNCTION__ << " | ======= end ======= " << " | End Result " << " | Device #: " << dv_ind << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Metric Size: " << tmp_curr_socclk_tbl.size() << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; LOG_INFO(ostrstream); + return status_code; CATCH } rsmi_status_t -rsmi_dev_curr_vdlk0_get(uint32_t dv_ind, amd::smi::GPUMetricCurrDClkTbl_t* current_dclk_value) +rsmi_dev_metrics_curr_vclk0_get(uint32_t dv_ind, GPUMetricCurrVClk0_t* current_vclk_value) { TRY std::ostringstream ostrstream; ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; LOG_TRACE(ostrstream); - const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVcnActivity); - amd::smi::GPUMetricCurrDClkTbl_t tmp_current_dclk_value; - *current_dclk_value = tmp_current_dclk_value; - auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + assert(current_vclk_value != nullptr); + if (current_vclk_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricCurrVClock0); + amd::smi::GPUMetricCurrVClkTbl_t tmp_curr_vclk0_tbl{}; + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, tmp_curr_vclk0_tbl); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + const auto max_num_elems = + static_cast(std::end(*current_vclk_value) - std::begin(*current_vclk_value)); + std::copy_n(std::begin(tmp_curr_vclk0_tbl), max_num_elems, *current_vclk_value); + } + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Metric Size: " << tmp_curr_vclk0_tbl.size() + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_curr_vclk1_get(uint32_t dv_ind, uint16_t* current_vclk_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(current_vclk_value != nullptr); + if (current_vclk_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricCurrVClock1); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *current_vclk_value); ostrstream << __PRETTY_FUNCTION__ << " | ======= end ======= " << " | End Result " @@ -6392,10 +6910,428 @@ rsmi_dev_curr_vdlk0_get(uint32_t dv_ind, amd::smi::GPUMetricCurrDClkTbl_t* curre << " | Metric Type: " << static_cast(gpu_metric_unit) << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; LOG_INFO(ostrstream); + return status_code; CATCH } +rsmi_status_t +rsmi_dev_metrics_curr_dclk0_get(uint32_t dv_ind, GPUMetricCurrDClk0_t* current_dclk_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(current_dclk_value != nullptr); + if (current_dclk_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricCurrDClock0); + amd::smi::GPUMetricCurrDClkTbl_t tmp_curr_dclk0_tbl; + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, tmp_curr_dclk0_tbl); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + const auto max_num_elems = + static_cast(std::end(*current_dclk_value) - std::begin(*current_dclk_value)); + std::copy_n(std::begin(tmp_curr_dclk0_tbl), max_num_elems, *current_dclk_value); + } + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Metric Size: " << tmp_curr_dclk0_tbl.size() + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_curr_dclk1_get(uint32_t dv_ind, uint16_t* current_dclk_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(current_dclk_value != nullptr); + if (current_dclk_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricCurrDClock1); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *current_dclk_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_avg_gfx_clock_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(clock_frequency_value != nullptr); + if (clock_frequency_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgGfxClockFrequency); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *clock_frequency_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_avg_soc_clock_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(clock_frequency_value != nullptr); + if (clock_frequency_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgSocClockFrequency); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *clock_frequency_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_avg_uclock_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(clock_frequency_value != nullptr); + if (clock_frequency_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgUClockFrequency); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *clock_frequency_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_avg_vclock0_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(clock_frequency_value != nullptr); + if (clock_frequency_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgVClock0Frequency); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *clock_frequency_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_avg_dclock0_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(clock_frequency_value != nullptr); + if (clock_frequency_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgDClock0Frequency); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *clock_frequency_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_avg_vclock1_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(clock_frequency_value != nullptr); + if (clock_frequency_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgVClock1Frequency); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *clock_frequency_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_avg_dclock1_frequency_get(uint32_t dv_ind, uint16_t* clock_frequency_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(clock_frequency_value != nullptr); + if (clock_frequency_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricAvgDClock1Frequency); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *clock_frequency_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_volt_soc_get(uint32_t dv_ind, uint16_t* voltage_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(voltage_value != nullptr); + if (voltage_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVoltageSoc); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *voltage_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_volt_gfx_get(uint32_t dv_ind, uint16_t* voltage_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(voltage_value != nullptr); + if (voltage_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVoltageGfx); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *voltage_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_volt_mem_get(uint32_t dv_ind, uint16_t* voltage_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(voltage_value != nullptr); + if (voltage_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + const auto gpu_metric_unit(AMDGpuMetricsUnitType_t::kMetricVoltageMem); + auto status_code = rsmi_dev_gpu_metrics_info_query(dv_ind, gpu_metric_unit, *voltage_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(gpu_metric_unit) + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_header_info_get(uint32_t dv_ind, metrics_table_header_t* header_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(header_value != nullptr); + if (header_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + auto status_code = rsmi_dev_gpu_metrics_header_info_get(dv_ind, *header_value); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Format Revision: " << header_value->format_revision + << " | Content Revision: " << header_value->content_revision + << " | Header Size: " << header_value->structure_size + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_xcd_counter_get(uint32_t dv_ind, uint16_t* xcd_counter_value) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(xcd_counter_value != nullptr); + if (xcd_counter_value == nullptr) { + return rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + } + + auto xcd_counter = uint16_t(0); + GPUMetricCurrGfxClk_t curr_gfxclk_table{}; + auto status_code = rsmi_dev_metrics_curr_gfxclk_get(dv_ind, &curr_gfxclk_table); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + for (const auto& gfxclk : curr_gfxclk_table) { + if ((gfxclk != 0) && (gfxclk != UINT16_MAX)) { + xcd_counter++; + } + } + } + + *xcd_counter_value = xcd_counter; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | XCDs counter: " << xcd_counter + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} + +rsmi_status_t +rsmi_dev_metrics_log_get(uint32_t dv_ind) +{ + TRY + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + GET_DEV_FROM_INDX + auto status_code = dev->dev_log_gpu_metrics(ostrstream); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | End Result " + << " | Device #: " << dv_ind + << " | Metric Type: " << "All GPU Metrics..." + << " | Returning = " << status_code << " " << getRSMIStatusString(status_code) << " |"; + LOG_INFO(ostrstream); + + return status_code; + CATCH +} // // End of: new GPU Metrics related work. // diff --git a/rocm_smi/src/rocm_smi_binary_parser.cc b/rocm_smi/src/rocm_smi_binary_parser.cc new file mode 100755 index 0000000000..805be841c2 --- /dev/null +++ b/rocm_smi/src/rocm_smi_binary_parser.cc @@ -0,0 +1,320 @@ +/* + * ============================================================================= + * The University of Illinois/NCSA + * Open Source License (NCSA) + * + * Copyright (c) 2017-2023, Advanced Micro Devices, Inc. + * All rights reserved. + * + * Developed by: + * + * AMD Research and AMD ROC Software Development + * + * Advanced Micro Devices, Inc. + * + * www.amd.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal with the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimers. + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimers in + * the documentation and/or other materials provided with the distribution. + * - Neither the names of , + * nor the names of its contributors may be used to endorse or promote + * products derived from this Software without specific prior written + * permission. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS WITH THE SOFTWARE. + * + */ + +#include "rocm_smi/rocm_smi_binary_parser.h" +#include "rocm_smi/rocm_smi_common.h" // Should go before rocm_smi.h +#include "rocm_smi/rocm_smi.h" +#include "rocm_smi/rocm_smi_main.h" +#include "rocm_smi/rocm_smi_utils.h" +#include "rocm_smi/rocm_smi_exception.h" +#include "rocm_smi/rocm_smi_device.h" +#include "rocm_smi/rocm_smi_logger.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace amd::smi { +static uint64_t get_value(uint8_t **ptr, struct metric_field *field) { + uint64_t v; + switch (field->field_type) { + case FIELD_TYPE_U8: + v = *(uint8_t*)(*ptr); + ++(*ptr); + break; + case FIELD_TYPE_U16: + v = *(uint16_t*)(*ptr); + (*ptr) += 2; + break; + case FIELD_TYPE_U32: + v = *(uint32_t*)(*ptr); + (*ptr) += 4; + break; + case FIELD_TYPE_U64: + v = *(uint64_t*)(*ptr); + (*ptr) += 8; + break; + } + return v; +} + +static int parse_pmmetric_table(uint8_t *buf, struct metric_field *table, + int32_t buflen, rsmi_name_value_t **kv, uint32_t *kvnum) { + uint64_t v1; + int x, y; + uint8_t *origbuf = buf; + uint32_t kvsize = 64; + + *kv = reinterpret_cast(calloc(kvsize, sizeof **kv)); + *kvnum = 0; + + for (x = 0; table[x].field_name; x++) { + for (y = 0; y < table[x].field_arr_size; y++) { + v1 = get_value(&buf, &table[x]); + if ((intptr_t)(buf - origbuf) > buflen) { + fprintf(stderr, + "[ERROR]: Invalid buffer as buffer length exceeded\n"); + return -1; + } + + if (*kvnum == kvsize) { + kvsize += 64; + *kv = reinterpret_cast + (realloc(*kv,kvsize * (sizeof **kv))); + } + if (table[x].field_arr_size == 1) { + sprintf((*kv)[*kvnum].name, "%s", table[x].field_name); + } else { + sprintf((*kv)[*kvnum].name, "%s[%d]", table[x].field_name, y); + } + (*kv)[*kvnum].value = v1; + + ++(*kvnum); + } + } + return 0; +} + +/** present the PM metrics data + * + * @dri_instance: which card to pick under /sys/class/drm/card${instance}/device/ + * @kv: pointer to pointer of rsmi_name_value pairs + * @kvnum: pointer to number of used rsmi_name_value pairs + */ +int present_pmmetrics(const char* fname, + rsmi_name_value_t **kv, uint32_t *kvnum) +{ + uint8_t *buf1; + FILE *infile; + uint32_t pmmetrics_version; + metric_field *table; + int r; + int32_t len; + + infile = fopen(fname, "rb"); + if (!infile) { + fprintf(stderr, "[ERROR]: pm_metrics file not found \n"); + return -1; + } + + buf1 = reinterpret_cast(calloc(1, 65536)); + if (!buf1) { + return -1; + } + + table = NULL; + len = fread(buf1, 1, 65536, infile); + fseek(infile, 0, SEEK_SET); + memcpy(&pmmetrics_version, &buf1[12], 4); + + switch (pmmetrics_version) { + case 4: // ??? why 4? + table = &smu_13_0_6_v8[0]; + break; + default: + fprintf(stderr, "Metrics version %d not supported\n" + , pmmetrics_version); + return -1; + } + r = parse_pmmetric_table(buf1, table, len, kv, kvnum); + fclose(infile); + free(buf1); + return r; +} + +static int parse_reg_state_table(uint8_t *buf, int32_t buflen, + struct metric_field *table, + rsmi_name_value_t **kv, uint32_t *kvnum) { + int skip_smn, x, y, cur_instance, cur_smn, + num_instance, num_smn, instance_start, smn_start; + uint64_t v; + uint8_t *obuf, *origbuf; + int kvsize = 64; + + *kv = reinterpret_cast(calloc(kvsize, sizeof **kv)); + *kvnum = 0; + + skip_smn = cur_instance = num_instance = num_smn = 0; + instance_start = smn_start = 0x1000; + x = 0; + origbuf = buf; +top: + while (table[x].field_name != NULL) { + for (y = 0; y < table[x].field_arr_size; y++) { + obuf = buf; + v = get_value(&buf, &table[x]); + if ((intptr_t)(buf - origbuf) > buflen) { + fprintf(stderr, + "[ERROR] Invalid buffer as read length was exceeded\n"); + return -1; + } + switch (table[x].field_flag) { + case FIELD_FLAG_INSTANCE_START: + instance_start = x; + num_smn = cur_smn = 0; + break; + case FIELD_FLAG_SMN_START: + // if we hit an SMN start but there are no registers then skip back to the start + // of the instance block + if (skip_smn) { + // out of instances we're done so bail! + if (!num_instance) + return 0; + x = instance_start; + --num_instance; + ++cur_instance; + // rewind the buffer since we didn't actually consume + // this word + buf = obuf; + goto top; + } else { + smn_start = x; + } + break; + case FIELD_FLAG_NUM_INSTANCE: + num_instance = v; + break; + case FIELD_FLAG_NUM_SMN: + num_smn = v; + if (v) + skip_smn = 0; + else + skip_smn = 1; + break; + } + if (*kvnum == kvsize) { + kvsize += 64; + *kv = reinterpret_cast( + realloc(*kv, kvsize * (sizeof **kv))); + } + sprintf((*kv)[*kvnum].name, "%s", table[x].field_name); + if (table[x].field_arr_size > 1) { + sprintf((*kv)[*kvnum].name + strlen((*kv)[*kvnum].name), "[%d]", y); + } + if (x >= instance_start) + sprintf((*kv)[*kvnum].name + strlen((*kv)[*kvnum].name), ".instance[%d]", cur_instance); + if (x >= smn_start) + sprintf((*kv)[*kvnum].name + strlen((*kv)[*kvnum].name), ".smn[%d]", cur_smn); + (*kv)[*kvnum].value = v; + ++(*kvnum); + } + + // done move to next or loop + ++x; + if (table[x].field_name == NULL && --num_smn) { + x = smn_start; + ++cur_smn; + } else if (table[x].field_name == NULL && --num_instance) { + x = instance_start; + ++cur_instance; + } + } + return 0; +} + +/** present_reg_state: present register state data + * + * @dri_instance: The DRI instance to select under /sys/class/drm/card${instance}/device + * @table: Name of the table to read {"xgmi', "wafl", "pcie", "usr", "usr_1"} + * @kv: pointer to pointer of rsmi_name_value pairs + * @kvnum: pointer to number of used rsmi_name_value pairs + */ +int present_reg_state(const char* fname, + rsmi_reg_type_t reg_type, rsmi_name_value_t **kv, uint32_t *kvnum) { + uint8_t buf[4096]; + FILE *infile; + struct metric_field *tab; + int32_t len; + + infile = fopen(fname, "rb"); + if (!infile) { + fprintf(stderr, "[ERROR]: reg_state file not found\n"); + return -1; + } + + tab = NULL; + if (reg_type == RSMI_REG_XGMI) { + fseek(infile, AMDGPU_SYS_REG_STATE_XGMI, SEEK_SET); + tab = &xgmi_regs[0]; + } + if (reg_type == RSMI_REG_WAFL) { + fseek(infile, AMDGPU_SYS_REG_STATE_WAFL, SEEK_SET); + tab = &wafl_regs[0]; + } + if (reg_type == RSMI_REG_PCIE) { + fseek(infile, AMDGPU_SYS_REG_STATE_PCIE, SEEK_SET); + tab = &pcie_regs[0]; + } + if (reg_type == RSMI_REG_USR) { + fseek(infile, AMDGPU_SYS_REG_STATE_USR, SEEK_SET); + tab = &usr_regs[0]; + } + if (reg_type == RSMI_REG_USR1) { + fseek(infile, AMDGPU_SYS_REG_STATE_USR_1, SEEK_SET); + tab = &usr_regs[0]; + } + if (!tab) { + fprintf(stderr, "[ERROR]: Invalid register space named <%d>\n", reg_type); + fclose(infile); + return -2; + } + + len = fread(buf, 1, sizeof buf, infile); + fclose(infile); + return parse_reg_state_table(buf, len, tab, kv, kvnum); +} + + +} // namespace amd::smi diff --git a/rocm_smi/src/rocm_smi_device.cc b/rocm_smi/src/rocm_smi_device.cc index dc0506a2ab..9aa92b7f3f 100755 --- a/rocm_smi/src/rocm_smi_device.cc +++ b/rocm_smi/src/rocm_smi_device.cc @@ -130,6 +130,8 @@ static const char *kDevXGMIErrorFName = "xgmi_error"; static const char *kDevSerialNumberFName = "serial_number"; static const char *kDevNumaNodeFName = "numa_node"; static const char *kDevGpuMetricsFName = "gpu_metrics"; +static const char *kDevPmMetricsFName = "pm_metrics"; // PM log +static const char *kDevRegMetricsFName = "reg_state"; // register table static const char *kDevAvailableComputePartitionFName = "available_compute_partition"; static const char *kDevComputePartitionFName = "current_compute_partition"; @@ -312,6 +314,8 @@ static const std::map kDevAttribNameMap = { {kDevMemPageBad, kDevMemPageBadFName}, {kDevNumaNode, kDevNumaNodeFName}, {kDevGpuMetrics, kDevGpuMetricsFName}, + {kDevPmMetrics, kDevPmMetricsFName}, + {kDevRegMetrics, kDevRegMetricsFName}, {kDevGpuReset, kDevGpuResetFName}, {kDevAvailableComputePartition, kDevAvailableComputePartitionFName}, {kDevComputePartition, kDevComputePartitionFName}, @@ -445,6 +449,8 @@ static const std::map kDevFuncDependsMap = { {"rsmi_dev_memory_reserved_pages_get", {{kDevMemPageBadFName}, {}}}, {"rsmi_topo_numa_affinity_get", {{kDevNumaNodeFName}, {}}}, {"rsmi_dev_gpu_metrics_info_get", {{kDevGpuMetricsFName}, {}}}, + {"rsmi_dev_pm_metrics_info_get", {{kDevPmMetricsFName}, {}}}, + {"rsmi_dev_reg_table_info_get", {{kDevRegMetricsFName}, {}}}, {"rsmi_dev_gpu_reset", {{kDevGpuResetFName}, {}}}, {"rsmi_dev_compute_partition_get", {{kDevComputePartitionFName}, {}}}, {"rsmi_dev_compute_partition_set", {{kDevComputePartitionFName}, {}}}, @@ -543,7 +549,7 @@ static const std::map kDevFuncDependsMap = { Device::Device(std::string p, RocmSMI_env_vars const *e) : monitor_(nullptr), path_(p), env_(e), evt_notif_anon_fd_(-1), - gpu_metrics_ver_{0, 0, 0} { + m_gpu_metrics_header{0, 0, 0} { #ifndef DEBUG env_ = nullptr; #endif @@ -594,6 +600,14 @@ int Device::openDebugFileStream(DevInfoTypes type, T *fs, const char *str) { return 0; } +std::string Device::get_sys_file_path_by_type(DevInfoTypes type) const { + auto sysfs_path = path_; + sysfs_path += "/device/"; + sysfs_path += kDevAttribNameMap.at(type); + + return sysfs_path; +} + template int Device::openSysfsFileStream(DevInfoTypes type, T *fs, const char *str) { auto sysfs_path = path_; @@ -902,7 +916,14 @@ int Device::readDevInfoBinary(DevInfoTypes type, std::size_t b_size, if ((num*b_size) != b_size) { ss << "Could not read DevInfoBinary for DevInfoType (" << RocmSMI::devInfoTypesStrings.at(type) << ") - SYSFS (" - << sysfs_path << "), binary size error, " + << sysfs_path << "), binary size error; " + << "[buff: " + << p_binary_data + << " size: " + << b_size + << " read: " + << num + << "]" << ", returning ENOENT (" << std::strerror(ENOENT) << ")"; LOG_ERROR(ss); return ENOENT; diff --git a/rocm_smi/src/rocm_smi_gpu_metrics.cc b/rocm_smi/src/rocm_smi_gpu_metrics.cc index 23a498876d..11d2871ca9 100755 --- a/rocm_smi/src/rocm_smi_gpu_metrics.cc +++ b/rocm_smi/src/rocm_smi_gpu_metrics.cc @@ -54,16 +54,20 @@ #include #include +#include #include #include #include #include +#include #include #include #include #include +#include #include // NOLINT #include +#include #include #include #include @@ -74,478 +78,6 @@ using namespace amd::smi; #define TRY try { #define CATCH } catch (...) {return amd::smi::handleException();} -// Put definitions of old gpu_metrics formats here -typedef struct { - struct metrics_table_header_t common_header; - - /* Driver attached timestamp (in ns) */ - uint64_t system_clock_counter; - -/* Temperature */ - uint16_t temperature_edge; - uint16_t temperature_hotspot; - uint16_t temperature_mem; - uint16_t temperature_vrgfx; - uint16_t temperature_vrsoc; - uint16_t temperature_vrmem; - -/* Utilization */ - uint16_t average_gfx_activity; - uint16_t average_umc_activity; // memory controller - uint16_t average_mm_activity; // UVD or VCN - -/* Power/Energy */ - uint16_t average_socket_power; - uint32_t energy_accumulator; - -/* Average clocks */ - uint16_t average_gfxclk_frequency; - uint16_t average_socclk_frequency; - uint16_t average_uclk_frequency; - uint16_t average_vclk0_frequency; - uint16_t average_dclk0_frequency; - uint16_t average_vclk1_frequency; - uint16_t average_dclk1_frequency; - -/* Current clocks */ - uint16_t current_gfxclk; - uint16_t current_socclk; - uint16_t current_uclk; - uint16_t current_vclk0; - uint16_t current_dclk0; - uint16_t current_vclk1; - uint16_t current_dclk1; - -/* Throttle status */ - uint32_t throttle_status; - -/* Fans */ - uint16_t current_fan_speed; - -/* Link width/speed */ - uint8_t pcie_link_width; - uint8_t pcie_link_speed; // in 0.1 GT/s -} rsmi_gpu_metrics_v_1_0_t; - -typedef struct { - rsmi_gpu_metrics_t base; - uint64_t firmware_timestamp; -} rsmi_gpu_metrics_v_1_2; - -typedef struct { - rsmi_gpu_metrics_t base; - /* PMFW attached timestamp (10ns resolution) */ - uint64_t firmware_timestamp; - - /* Voltage (mV) */ - uint16_t voltage_soc; - uint16_t gfx_voltage; - uint16_t mem_voltage; - - uint16_t padding1; - - /* Throttle status (ASIC independent) */ - uint64_t indep_throttle_status; - -} rsmi_gpu_metrics_v_1_3; - - -// log current gpu_metrics file content read -// any metrics value can be a nullptr -void log_gpu_metrics(const metrics_table_header_t *gpu_metrics_table_header, - const rsmi_gpu_metrics_v_1_2 *rsmi_gpu_metrics_v_1_2, - const rsmi_gpu_metrics_v_1_3 *gpu_metrics_v_1_3, - const rsmi_gpu_metrics_t *rsmi_gpu_metrics) { - if (!RocmSMI::getInstance().isLoggingOn()) { - return; - } - std::ostringstream ss; - if (gpu_metrics_table_header != nullptr) { - ss - /* Common Header */ - << print_unsigned_hex_and_int( - gpu_metrics_table_header->structure_size, - "gpu_metrics_table_header->structure_size") - << print_unsigned_hex_and_int( - gpu_metrics_table_header->format_revision, - "gpu_metrics_table_header->format_revision") - << print_unsigned_hex_and_int( - gpu_metrics_table_header->content_revision, - "gpu_metrics_table_header->content_revision"); - LOG_DEBUG(ss); - } - if (rsmi_gpu_metrics == nullptr) { - return; - } - - ss - /* Common Header */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->common_header.structure_size, - "rsmi_gpu_metrics->common_header.structure_size") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->common_header.format_revision, - "rsmi_gpu_metrics->common_header.format_revision") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->common_header.content_revision, - "rsmi_gpu_metrics->common_header.content_revision") - /* Temperature */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->temperature_edge, - "rsmi_gpu_metrics->temperature_edge") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->temperature_hotspot, - "rsmi_gpu_metrics->temperature_hotspot") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->temperature_mem, - "rsmi_gpu_metrics->temperature_mem") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->temperature_vrgfx, - "rsmi_gpu_metrics->temperature_vrgfx") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->temperature_vrsoc, - "rsmi_gpu_metrics->temperature_vrsoc") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->temperature_vrmem, - "rsmi_gpu_metrics->temperature_vrmem") - /* Utilization */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_gfx_activity, - "rsmi_gpu_metrics->average_gfx_activity") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_umc_activity, - "rsmi_gpu_metrics->average_umc_activity") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_mm_activity, - "rsmi_gpu_metrics->average_mm_activity") - /* Power/Energy */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_socket_power, - "rsmi_gpu_metrics->average_socket_power") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->energy_accumulator, - "rsmi_gpu_metrics->energy_accumulator") - /* Driver attached timestamp (in ns) */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->system_clock_counter, - "rsmi_gpu_metrics->system_clock_counter") - /* Average clocks */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_gfxclk_frequency, - "rsmi_gpu_metrics->average_gfxclk_frequency") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_socclk_frequency, - "rsmi_gpu_metrics->average_socclk_frequency") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_uclk_frequency, - "rsmi_gpu_metrics->average_uclk_frequency") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_vclk0_frequency, - "rsmi_gpu_metrics->average_vclk0_frequency") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_dclk0_frequency, - "rsmi_gpu_metrics->average_dclk0_frequency") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_vclk1_frequency, - "rsmi_gpu_metrics->average_vclk1_frequency") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->average_dclk1_frequency, - "rsmi_gpu_metrics->average_dclk1_frequency") - /* Current clocks */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->current_gfxclk, - "rsmi_gpu_metrics->current_gfxclk") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->current_socclk, - "rsmi_gpu_metrics->current_socclk") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->current_uclk, - "rsmi_gpu_metrics->current_uclk") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->current_vclk0, - "rsmi_gpu_metrics->current_vclk0") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->current_dclk0, - "rsmi_gpu_metrics->current_dclk0") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->current_vclk1, - "rsmi_gpu_metrics->current_vclk1") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->current_dclk1, - "rsmi_gpu_metrics->current_dclk1") - /* Throttle status */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->throttle_status, - "rsmi_gpu_metrics->throttle_status") - /* Fans */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->current_fan_speed, - "rsmi_gpu_metrics->current_fan_speed") - /* Link width/speed */ - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->pcie_link_width, - "rsmi_gpu_metrics->pcie_link_width") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->pcie_link_speed, - "rsmi_gpu_metrics->pcie_link_speed") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->padding, - "rsmi_gpu_metrics->padding") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->gfx_activity_acc, - "rsmi_gpu_metrics->gfx_activity_acc") - << print_unsigned_hex_and_int( - rsmi_gpu_metrics->mem_activity_acc, - "rsmi_gpu_metrics->mem_activity_acc"); - for (int i=0; i < RSMI_NUM_HBM_INSTANCES; i++) { - ss << print_unsigned_hex_and_int( - rsmi_gpu_metrics->temperature_hbm[i], - "rsmi_gpu_metrics->temperature_hbm[" + std::to_string(i) + "]"); - } - - if (rsmi_gpu_metrics_v_1_2 != nullptr) { - /* PMFW attached timestamp (10ns resolution) */ - ss - << print_unsigned_hex_and_int( - rsmi_gpu_metrics_v_1_2->firmware_timestamp, - "rsmi_gpu_metrics_v_1_2->firmware_timestamp"); - } - - if (gpu_metrics_v_1_3 != nullptr) { - /* PMFW attached timestamp (10ns resolution) */ - ss - << print_unsigned_hex_and_int( - gpu_metrics_v_1_3->firmware_timestamp, - "gpu_metrics_v_1_3->firmware_timestamp") - /* Voltage (mV) */ - << print_unsigned_hex_and_int( - gpu_metrics_v_1_3->voltage_soc, - "gpu_metrics_v_1_3->voltage_soc") - << print_unsigned_hex_and_int( - gpu_metrics_v_1_3->gfx_voltage, - "gpu_metrics_v_1_3->voltage_gfx") - << print_unsigned_hex_and_int( - gpu_metrics_v_1_3->mem_voltage, - "gpu_metrics_v_1_3->voltage_mem") - << print_unsigned_hex_and_int( - gpu_metrics_v_1_3->padding1, - "gpu_metrics_v_1_3->padding1") - /* Throttle status (ASIC independent) */ - << print_unsigned_hex_and_int( - gpu_metrics_v_1_3->indep_throttle_status, - "gpu_metrics_v_1_3->indep_throttle_status"); - } - LOG_DEBUG(ss); -} - -static rsmi_status_t GetGPUMetricsFormat1(uint32_t dv_ind, - rsmi_gpu_metrics_t *data, uint8_t content_v) { - assert(content_v != RSMI_GPU_METRICS_API_CONTENT_VER_1 && - content_v != RSMI_GPU_METRICS_API_CONTENT_VER_2 && - content_v != RSMI_GPU_METRICS_API_CONTENT_VER_3 ); - if (content_v == RSMI_GPU_METRICS_API_CONTENT_VER_1 || - content_v == RSMI_GPU_METRICS_API_CONTENT_VER_2 || - content_v == RSMI_GPU_METRICS_API_CONTENT_VER_3 ) { - // This function shouldn't be called if content version is - // RSMI_GPU_METRICS_API_CONTENT_VER_1 or RSMI_GPU_METRICS_API_CONTENT_VER_2 - // or RSMI_GPU_METRICS_API_CONTENT_VER_3 - return RSMI_STATUS_INVALID_ARGS; - } - void *metric_data = nullptr; - size_t data_size; - rsmi_status_t ret; - - rsmi_gpu_metrics_v_1_0_t metric_data_v_1_0; - - if (content_v == 0) { - metric_data = &metric_data_v_1_0; - data_size = sizeof(rsmi_gpu_metrics_v_1_0_t); - } // else { ... handle other conversions to v1 - - assert(metric_data != nullptr && "Unexpected conversion attempted."); - ret = GetDevBinaryBlob(amd::smi::kDevGpuMetrics, dv_ind, data_size, - metric_data); - if (ret != RSMI_STATUS_SUCCESS) { - return ret; - } - -#define ASSIGN_DATA_FIELD(FIELD, SRC) \ - data->FIELD = (SRC)->FIELD; - -#define ASSIGN_COMMON_FORMATS(SRC) \ - ASSIGN_DATA_FIELD(common_header, (SRC)) \ - ASSIGN_DATA_FIELD(temperature_edge, (SRC)) \ - ASSIGN_DATA_FIELD(temperature_hotspot, (SRC)) \ - ASSIGN_DATA_FIELD(temperature_mem, (SRC)) \ - ASSIGN_DATA_FIELD(temperature_vrgfx, (SRC)) \ - ASSIGN_DATA_FIELD(temperature_vrsoc, (SRC)) \ - ASSIGN_DATA_FIELD(temperature_vrmem, (SRC)) \ - ASSIGN_DATA_FIELD(average_gfx_activity, (SRC)) \ - ASSIGN_DATA_FIELD(average_umc_activity, (SRC)) \ - ASSIGN_DATA_FIELD(average_mm_activity, (SRC)) \ - ASSIGN_DATA_FIELD(average_socket_power, (SRC)) \ - ASSIGN_DATA_FIELD(system_clock_counter, (SRC)) \ - ASSIGN_DATA_FIELD(average_gfxclk_frequency, (SRC)) \ - ASSIGN_DATA_FIELD(average_socclk_frequency, (SRC)) \ - ASSIGN_DATA_FIELD(average_uclk_frequency, (SRC)) \ - ASSIGN_DATA_FIELD(average_vclk0_frequency, (SRC)) \ - ASSIGN_DATA_FIELD(average_dclk0_frequency, (SRC)) \ - ASSIGN_DATA_FIELD(average_vclk1_frequency, (SRC)) \ - ASSIGN_DATA_FIELD(average_dclk1_frequency, (SRC)) \ - ASSIGN_DATA_FIELD(current_gfxclk, (SRC)) \ - ASSIGN_DATA_FIELD(current_socclk, (SRC)) \ - ASSIGN_DATA_FIELD(current_uclk, (SRC)) \ - ASSIGN_DATA_FIELD(current_vclk0, (SRC)) \ - ASSIGN_DATA_FIELD(current_dclk0, (SRC)) \ - ASSIGN_DATA_FIELD(current_vclk1, (SRC)) \ - ASSIGN_DATA_FIELD(current_dclk1, (SRC)) \ - ASSIGN_DATA_FIELD(throttle_status, (SRC)) \ - ASSIGN_DATA_FIELD(current_fan_speed, (SRC)) - - // Now handle differences from format 1 - if (content_v == 0) { - // First handle all data that is common to Format1 and other formats - ASSIGN_COMMON_FORMATS( - reinterpret_cast(metric_data)) - - // Then, the differences: - data->energy_accumulator = static_cast( - reinterpret_cast( - metric_data)->energy_accumulator); - data->pcie_link_width = static_cast( - reinterpret_cast( - metric_data)->pcie_link_width); - data->pcie_link_speed = static_cast( - reinterpret_cast( - metric_data)->pcie_link_speed); - - // These fields didn't exist in v0 - data->gfx_activity_acc = 0; - data->mem_activity_acc = 0; - (void)memset(data->temperature_hbm, 0, - RSMI_NUM_HBM_INSTANCES * sizeof(uint16_t)); - } // else handle other conversions to format 1 -#undef ASSIGN_DATA_FIELD -#undef ASSIGN_COMMON_FORMATS - return RSMI_STATUS_SUCCESS; -} - -// Translate gpu_metrics version 1.2 to rsmi_gpu_metrics_t. gpu_metrics -// version 1.2 provides timestamp provided by the firmware. This timestamp -// is sampled atomically along when gpu_metric information. Use this -// timestamp instead of system_clock_counter - -static void map_gpu_metrics_1_2_to_rsmi_gpu_metrics_t( - const rsmi_gpu_metrics_v_1_2 *gpu_metrics_v_1_2, - rsmi_gpu_metrics_t *rsmi_gpu_metrics) -{ - memcpy(rsmi_gpu_metrics, &gpu_metrics_v_1_2->base, - sizeof(rsmi_gpu_metrics_t)); - // firmware_timestamp is at 10ns resolution - rsmi_gpu_metrics->system_clock_counter = - gpu_metrics_v_1_2->firmware_timestamp * 10; -} - -static void map_gpu_metrics_1_3_to_rsmi_gpu_metrics_t( - const rsmi_gpu_metrics_v_1_3 *gpu_metrics_v_1_3, - rsmi_gpu_metrics_t *rsmi_gpu_metrics) -{ - memcpy(rsmi_gpu_metrics, &gpu_metrics_v_1_3->base, - sizeof(rsmi_gpu_metrics_t)); - // firmware_timestamp is at 10ns resolution - rsmi_gpu_metrics->system_clock_counter = - gpu_metrics_v_1_3->firmware_timestamp * 10; - -} - -rsmi_status_t -rsmi_dev_gpu_metrics_info_get(uint32_t dv_ind, rsmi_gpu_metrics_t *smu) { - TRY - DEVICE_MUTEX - CHK_SUPPORT_NAME_ONLY(smu) - rsmi_gpu_metrics_v_1_2 smu_v_1_2; - rsmi_gpu_metrics_v_1_3 smu_v_1_3; - rsmi_status_t ret; - - std::ostringstream ss; - if (!dev->gpu_metrics_ver().structure_size) { - ret = GetDevBinaryBlob(amd::smi::kDevGpuMetrics, dv_ind, - sizeof(struct metrics_table_header_t), &dev->gpu_metrics_ver()); - log_gpu_metrics(&dev->gpu_metrics_ver(), nullptr, nullptr, nullptr); - - if (ret != RSMI_STATUS_SUCCESS) { - ss << "Returning = " << getRSMIStatusString(ret) - << ",\ndev->gpu_metrics_ver().structure_size = " - << print_unsigned_int(dev->gpu_metrics_ver().structure_size) - << ", could not read common header"; - LOG_ERROR(ss); - return ret; - } - } - // only supports gpu_metrics_v1_x version - if (dev->gpu_metrics_ver().format_revision != 1) { - ss << "Returning = " << getRSMIStatusString(RSMI_STATUS_NOT_SUPPORTED) - << ",\ndev->gpu_metrics_ver().format_revision = " - << print_unsigned_int(dev->gpu_metrics_ver().format_revision) - << " was not equal to 1"; - LOG_ERROR(ss); - return RSMI_STATUS_NOT_SUPPORTED; - } - - // Initialize the smu fields to zero as some of them only valid in - // a specific version. - *smu = {}; - - bool isRevisionExpected = ((dev->gpu_metrics_ver().content_revision == 1) || - (dev->gpu_metrics_ver().content_revision == 2) || - (dev->gpu_metrics_ver().content_revision == 3)); - if (isRevisionExpected == false) { - ss << __PRETTY_FUNCTION__ << " | content revision was = " - << print_unsigned_hex_and_int(dev->gpu_metrics_ver().content_revision) - << ", expected version 1,2, or 3 | returning " - << getRSMIStatusString(RSMI_STATUS_NOT_SUPPORTED); - LOG_ERROR(ss); - return RSMI_STATUS_NOT_SUPPORTED; - } - if (dev->gpu_metrics_ver().content_revision == - RSMI_GPU_METRICS_API_CONTENT_VER_1) { - ret = GetDevBinaryBlob(amd::smi::kDevGpuMetrics, dv_ind, - sizeof(rsmi_gpu_metrics_t), smu); - ss << __PRETTY_FUNCTION__ << " | RSMI_GPU_METRICS_API_CONTENT_VER_1"; - LOG_DEBUG(ss); - log_gpu_metrics(nullptr, nullptr, nullptr, smu); - } else if (dev->gpu_metrics_ver().content_revision == - RSMI_GPU_METRICS_API_CONTENT_VER_2) { - ret = GetDevBinaryBlob(amd::smi::kDevGpuMetrics, dv_ind, - sizeof(rsmi_gpu_metrics_v_1_2), &smu_v_1_2); - map_gpu_metrics_1_2_to_rsmi_gpu_metrics_t(&smu_v_1_2, smu); - ss << __PRETTY_FUNCTION__ << " | RSMI_GPU_METRICS_API_CONTENT_VER_2"; - LOG_DEBUG(ss); - log_gpu_metrics(nullptr, &smu_v_1_2, nullptr, smu); - } else if (dev->gpu_metrics_ver().content_revision == - RSMI_GPU_METRICS_API_CONTENT_VER_3) { - ret = GetDevBinaryBlob(amd::smi::kDevGpuMetrics, dv_ind, - sizeof(rsmi_gpu_metrics_v_1_3), &smu_v_1_3); - map_gpu_metrics_1_3_to_rsmi_gpu_metrics_t(&smu_v_1_3, smu); - ss << __PRETTY_FUNCTION__ << " | RSMI_GPU_METRICS_API_CONTENT_VER_3"; - LOG_DEBUG(ss); - log_gpu_metrics(nullptr, nullptr, &smu_v_1_3, smu); - } else { - ret = GetGPUMetricsFormat1(dv_ind, smu, - dev->gpu_metrics_ver().content_revision); - ss << __PRETTY_FUNCTION__ << " | GetGPUMetricsFormat1"; - LOG_DEBUG(ss); - log_gpu_metrics(nullptr, nullptr, nullptr, smu); - } - - if (ret != RSMI_STATUS_SUCCESS) { - return ret; - } - - return ret; - CATCH -} - namespace amd::smi { @@ -576,24 +108,54 @@ uint64_t actual_timestamp_in_secs() return duration_cast(system_clock::now().time_since_epoch()).count(); } +auto timestamp_to_time_point(uint64_t timestamp_in_secs) +{ + using namespace std::chrono; + system_clock::time_point time_point{seconds{timestamp_in_secs}}; + std::time_t timestamp_time = system_clock::to_time_t(time_point); + return timestamp_time; +} + + std::string stringfy_metrics_header(const AMDGpuMetricsHeader_v1_t& metrics_header) { std::stringstream metrics_header_info; metrics_header_info - << "Format: " << print_unsigned_hex_and_int(metrics_header.m_format_revision) - << "." << print_unsigned_hex_and_int(metrics_header.m_content_revision) - << " Size: " << print_unsigned_hex_and_int(metrics_header.m_structure_size); + << "{Header Info: " + << print_unsigned_int(metrics_header.m_format_revision) + << "." + << print_unsigned_int(metrics_header.m_content_revision) + << " Size: " + << print_unsigned_int(metrics_header.m_structure_size) + << "} " + << "[Format: " << print_unsigned_hex_and_int(metrics_header.m_format_revision) + << " Revision: " << print_unsigned_hex_and_int(metrics_header.m_content_revision) + << " Size: " << print_unsigned_hex_and_int(metrics_header.m_structure_size) + << "]" + << "\n"; return metrics_header_info.str(); } +std::string stringfy_metric_header_version(const AMDGpuMetricsHeader_v1_t& metrics_header) +{ + std::stringstream metrics_header_info; + metrics_header_info + << print_unsigned_int(metrics_header.m_format_revision) + << "." + << print_unsigned_int(metrics_header.m_content_revision); + + return metrics_header_info.str(); +} + + // -// version 1,0: 256 -// version 1,1: 257 -// version 1,2: 258 -// version 1,3: 259 -// version 1,4: 260 -// version 1,5: 261 +// version 1.0: 256 +// version 1.1: 257 +// version 1.2: 258 +// version 1.3: 259 +// version 1.4: 260 +// version 1.5: 261 // const AMDGpuMetricVersionTranslationTbl_t amdgpu_metric_version_translation_table { @@ -612,7 +174,6 @@ const AMDGpuMetricsClassIdTranslationTbl_t amdgpu_metrics_class_id_translation_t {AMDGpuMetricsClassId_t::kGpuMetricTemperature, "Temperature"}, {AMDGpuMetricsClassId_t::kGpuMetricUtilization, "Utilization"}, {AMDGpuMetricsClassId_t::kGpuMetricPowerEnergy, "Power/Energy"}, - {AMDGpuMetricsClassId_t::kGpuMetricSystemClockCounter, "System Clock"}, {AMDGpuMetricsClassId_t::kGpuMetricAverageClock, "Average Clock"}, {AMDGpuMetricsClassId_t::kGpuMetricCurrentClock, "Current Clock"}, {AMDGpuMetricsClassId_t::kGpuMetricThrottleStatus, "Throttle"}, @@ -679,6 +240,9 @@ const AMDGpuMetricsUnitTypeTranslationTbl_t amdgpu_metrics_unit_type_translation {AMDGpuMetricsUnitType_t::kMetricXgmiLinkSpeed, "XgmiLinkSpeed"}, {AMDGpuMetricsUnitType_t::kMetricXgmiReadDataAccumulator, "XgmiReadDataAcc"}, {AMDGpuMetricsUnitType_t::kMetricXgmiWriteDataAccumulator, "XgmiWriteDataAcc"}, + {AMDGpuMetricsUnitType_t::kMetricPcieL0RecovCountAccumulator, "PcieL0RecovCountAcc"}, + {AMDGpuMetricsUnitType_t::kMetricPcieReplayCountAccumulator, "PcieReplayCountAcc"}, + {AMDGpuMetricsUnitType_t::kMetricPcieReplayRollOverCountAccumulator, "PcieReplayRollOverCountAcc"}, // kGpuMetricPowerEnergy counters {AMDGpuMetricsUnitType_t::kMetricAvgSocketPower, "AvgSocketPower"}, @@ -698,14 +262,72 @@ const AMDGpuMetricsUnitTypeTranslationTbl_t amdgpu_metrics_unit_type_translation AMDGpuMetricVersionFlags_t translate_header_to_flag_version(const AMDGpuMetricsHeader_v1_t& metrics_header) { + std::ostringstream ostrstream; + auto version_id(AMDGpuMetricVersionFlags_t::kGpuMetricNone); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + const auto flag_version = join_metrics_version(metrics_header); if (amdgpu_metric_version_translation_table.find(flag_version) != amdgpu_metric_version_translation_table.end()) { - return amdgpu_metric_version_translation_table.at(flag_version); + version_id = amdgpu_metric_version_translation_table.at(flag_version); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Translation Tbl: " << flag_version + << " | Metric Version: " << stringfy_metrics_header(metrics_header) + << " | Returning = " + << static_cast(version_id) + << " |"; + LOG_TRACE(ostrstream); + return version_id; } - return AMDGpuMetricVersionFlags_t::kGpuMetricNone; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Translation Tbl: " << flag_version + << " | Metric Version: " << stringfy_metrics_header(metrics_header) + << " | Returning = " + << static_cast(version_id) + << " |"; + LOG_ERROR(ostrstream); + return version_id; } +uint16_t translate_flag_to_metric_version(AMDGpuMetricVersionFlags_t version_flag) +{ + std::ostringstream ostrstream; + auto version_id = uint16_t(0); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + for (const auto& [key, value] : amdgpu_metric_version_translation_table) { + if (value == version_flag) { + version_id = key; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Version Flag: " << static_cast(version_flag) + << " | Unified Version: " << version_id + << " | Str. Version: " << stringfy_metric_header_version(disjoin_metrics_version(version_id)) + << " |"; + LOG_TRACE(ostrstream); + return version_id; + } + } + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Version Flag: " << static_cast(version_flag) + << " | Unified Version: " << version_id + << " | Str. Version: " << stringfy_metric_header_version(disjoin_metrics_version(version_id)) + << " |"; + LOG_TRACE(ostrstream); + return version_id; +} + + rsmi_status_t is_gpu_metrics_version_supported(const AMDGpuMetricsHeader_v1_t& metrics_header) { const auto flag_version = join_metrics_version(metrics_header); @@ -714,71 +336,65 @@ rsmi_status_t is_gpu_metrics_version_supported(const AMDGpuMetricsHeader_v1_t& m ? rsmi_status_t::RSMI_STATUS_SUCCESS : rsmi_status_t::RSMI_STATUS_NOT_SUPPORTED; } -struct AMDGpuMetricsLogInfo_t -{ - rsmi_status_t m_status_code; - std::string m_title; - std::string m_pretty_function; -}; - -class AMDGpuMetricsLogger_t -{ - public: - enum class LogInfoType_t - { - kLogError, - kLogAlarm, - kLogInfo, - kLogBuffer, - kLogTrace, - kLogDebug, - }; - - void operator()(const AMDGpuMetricsLogInfo_t& log_info) - { - m_ostrstream << log_info.m_pretty_function << log_info.m_title; - LOG_TRACE(m_ostrstream); - - m_ostrstream << log_info.m_pretty_function - << " | ======= end ======= " - << " | Fail " - << " | Device #: " - << " | Metric Version: " - << " | Cause: Couldn't get a valid metric object" - << " | Returning = " - << getRSMIStatusString(log_info.m_status_code) - << " |"; - - LOG_ERROR(m_ostrstream); - } - - private: - std::ostringstream m_ostrstream; - -}; - AMDGpuMetricFactories_t amd_gpu_metrics_factory_table { - {AMDGpuMetricVersionFlags_t::kGpuMetricV11, std::make_unique(GpuMetricsBase_v11_t{})}, - {AMDGpuMetricVersionFlags_t::kGpuMetricV12, std::make_unique(GpuMetricsBase_v12_t{})}, - {AMDGpuMetricVersionFlags_t::kGpuMetricV13, std::make_unique(GpuMetricsBase_v13_t{})}, - {AMDGpuMetricVersionFlags_t::kGpuMetricV14, std::make_unique(GpuMetricsBase_v14_t{})}, + {AMDGpuMetricVersionFlags_t::kGpuMetricV11, std::make_shared(GpuMetricsBase_v11_t{})}, + {AMDGpuMetricVersionFlags_t::kGpuMetricV12, std::make_shared(GpuMetricsBase_v12_t{})}, + {AMDGpuMetricVersionFlags_t::kGpuMetricV13, std::make_shared(GpuMetricsBase_v13_t{})}, + {AMDGpuMetricVersionFlags_t::kGpuMetricV14, std::make_shared(GpuMetricsBase_v14_t{})}, }; GpuMetricsBasePtr amdgpu_metrics_factory(AMDGpuMetricVersionFlags_t gpu_metric_version) { + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + auto contains = [](const AMDGpuMetricVersionFlags_t metric_version) { return (amd_gpu_metrics_factory_table.find(metric_version) != amd_gpu_metrics_factory_table.end()); }; if (contains(gpu_metric_version)) { - return std::move(amd_gpu_metrics_factory_table[gpu_metric_version]); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Factory Version: " << static_cast(gpu_metric_version) + << " |"; + LOG_TRACE(ostrstream); + + return (amd_gpu_metrics_factory_table[gpu_metric_version]); } + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Factory Version: " << static_cast(gpu_metric_version) + << " | Returning = " + << "No object from factory." + << " |"; + LOG_ERROR(ostrstream); return nullptr; } + +template +constexpr bool is_dependent_false_v = false; + +template +constexpr T init_max_uint_types() +{ + if constexpr ((std::is_same_v) || + (std::is_same_v) || + (std::is_same_v) || + (std::is_same_v)) { + return std::numeric_limits::max(); + } + else { + static_assert(is_dependent_false_v, "Error: Type not supported..."); + } +} + template AMDGpuDynamicMetricTblValues_t format_metric_row(const T& metric, const std::string& value_title) { @@ -787,20 +403,20 @@ AMDGpuDynamicMetricTblValues_t format_metric_row(const T& metric, const std::str auto get_data_type_info = [&]() { auto data_type(AMDGpuMetricsDataType_t::kUInt64); if constexpr (std::is_array_v) { - const uint8_t check_uint8[]={1}; - const uint16_t check_uint16[]={2}; - const uint32_t check_uint32[]={3}; - const uint64_t check_uint64[]={4}; - if constexpr (std::is_same_v) { + const uint8_t kCheckUint8[]={1}; + const uint16_t kCheckUint16[]={2}; + const uint32_t kCheckUint32[]={3}; + const uint64_t kCheckUint64[]={4}; + if constexpr (std::is_same_v) { data_type = AMDGpuMetricsDataType_t::kUInt8; } - if constexpr (std::is_same_v) { + if constexpr (std::is_same_v) { data_type = AMDGpuMetricsDataType_t::kUInt16; } - if constexpr (std::is_same_v) { + if constexpr (std::is_same_v) { data_type = AMDGpuMetricsDataType_t::kUInt32; } - if constexpr (std::is_same_v) { + if constexpr (std::is_same_v) { data_type = AMDGpuMetricsDataType_t::kUInt64; } return std::make_tuple(data_type, static_cast(std::end(metric) - std::begin(metric))); @@ -846,14 +462,141 @@ AMDGpuDynamicMetricTblValues_t format_metric_row(const T& metric, const std::str return multi_values; } +void GpuMetricsBase_v14_t::dump_internal_metrics_table() +{ + std::ostringstream ostrstream; + std::cout << __PRETTY_FUNCTION__ << " | ======= start ======= \n"; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= DEBUG ======= " + << " | Metric Version: " << stringfy_metric_header_version(m_gpu_metrics_tbl.m_common_header) + << " | Size: " << print_unsigned_int(m_gpu_metrics_tbl.m_common_header.m_structure_size) + << " |" + << "\n"; + ostrstream << " temperature_hotspot: " << m_gpu_metrics_tbl.m_temperature_hotspot << "\n" + << " temperature_mem: " << m_gpu_metrics_tbl.m_temperature_mem << "\n" + << " temperature_vrsoc: " << m_gpu_metrics_tbl.m_temperature_vrsoc << "\n" + + << " current_socket_power: " << m_gpu_metrics_tbl.m_current_socket_power << "\n" + + << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" + << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n"; + + ostrstream << " vcn_activity: " << "\n"; + auto idx = uint64_t(0); + for (const auto& temp : m_gpu_metrics_tbl.m_vcn_activity) { + ostrstream << "\t [" << idx << "]: " << temp << "\n"; + ++idx; + } + + ostrstream << " energy_accumulator: " << m_gpu_metrics_tbl.m_energy_accumulator << "\n" + << " system_clock_counter: " << m_gpu_metrics_tbl.m_system_clock_counter << "\n" + + << " throttle_status: " << m_gpu_metrics_tbl.m_throttle_status << "\n" + + << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" + << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n" + + << " gfxclk_lock_status: " << m_gpu_metrics_tbl.m_gfxclk_lock_status << "\n" + + << " pcie_link_width: " << m_gpu_metrics_tbl.m_pcie_link_width << "\n" + << " pcie_link_speed: " << m_gpu_metrics_tbl.m_pcie_link_speed << "\n" + + << " xgmi_link_width: " << m_gpu_metrics_tbl.m_xgmi_link_width << "\n" + << " xgmi_link_speed: " << m_gpu_metrics_tbl.m_xgmi_link_speed << "\n" + + << " gfx_activity_acc: " << m_gpu_metrics_tbl.m_gfx_activity_acc << "\n" + << " mem_activity_acc: " << m_gpu_metrics_tbl.m_mem_activity_acc << "\n" + + << " pcie_bandwidth_acc: " << m_gpu_metrics_tbl.m_pcie_bandwidth_acc << "\n" + << " pcie_bandwidth_inst: " << m_gpu_metrics_tbl.m_pcie_bandwidth_inst << "\n" + << " pcie_l0_to_recov_count_acc: " << m_gpu_metrics_tbl.m_pcie_l0_to_recov_count_acc << "\n" + << " pcie_replay_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_count_acc << "\n" + << " pcie_replay_rover_count_acc: " << m_gpu_metrics_tbl.m_pcie_replay_rover_count_acc << "\n"; + + ostrstream << " xgmi_read_data_acc: " << "\n"; + idx = 0; + for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_read_data_acc) { + ostrstream << "\t [" << idx << "]: " << temp << "\n"; + ++idx; + } + + ostrstream << " xgmi_write_data_acc: " << "\n"; + idx = 0; + for (const auto& temp : m_gpu_metrics_tbl.m_xgmi_write_data_acc) { + ostrstream << "\t [" << idx << "]: " << temp << "\n"; + ++idx; + } + + ostrstream << " firmware_timestamp: " << m_gpu_metrics_tbl.m_firmware_timestamp << "\n"; + + ostrstream << " current_gfxclk: " << "\n"; + idx = 0; + for (const auto& temp : m_gpu_metrics_tbl.m_current_gfxclk) { + ostrstream << "\t [" << idx << "]: " << temp << "\n"; + ++idx; + } + + ostrstream << " current_socclk: " << "\n"; + idx = 0; + for (const auto& temp : m_gpu_metrics_tbl.m_current_socclk) { + ostrstream << "\t [" << idx << "]: " << temp << "\n"; + ++idx; + } + + ostrstream << " current_vclk0: " << "\n"; + idx = 0; + for (const auto& temp : m_gpu_metrics_tbl.m_current_vclk0) { + ostrstream << "\t [" << idx << "]: " << temp << "\n"; + ++idx; + } + + ostrstream << " current_dclk0: " << "\n"; + idx = 0; + for (const auto& temp : m_gpu_metrics_tbl.m_current_dclk0) { + ostrstream << "\t [" << idx << "]: " << temp << "\n"; + ++idx; + } + + ostrstream << " padding: " << m_gpu_metrics_tbl.m_padding << "\n"; + LOG_DEBUG(ostrstream); +} + rsmi_status_t GpuMetricsBase_v14_t::populate_metrics_dynamic_tbl() { + std::ostringstream ostrstream; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + // + // Note: Any metric treatment/changes (if any) should happen before they + // get written to internal/external tables. + // + auto run_metric_adjustments_v14 = [&]() { + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + const auto gpu_metrics_version = translate_flag_to_metric_version(get_gpu_metrics_version_used()); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= info ======= " + << " | Applying adjustments " + << " | Metric Version: " << stringfy_metric_header_version( + disjoin_metrics_version(gpu_metrics_version)) + << " |"; + LOG_TRACE(ostrstream); + + // firmware_timestamp is at 10ns resolution + ostrstream << __PRETTY_FUNCTION__ + << " | ======= Changes ======= " + << " | {m_firmware_timestamp} from: " << m_gpu_metrics_tbl.m_firmware_timestamp + << " to: " << (m_gpu_metrics_tbl.m_firmware_timestamp * 10); + m_gpu_metrics_tbl.m_firmware_timestamp = (m_gpu_metrics_tbl.m_firmware_timestamp * 10); + LOG_DEBUG(ostrstream); + }; + + + // Adjustments/Changes specific to this version + run_metric_adjustments_v14(); + // Temperature Info - m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] - .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempHotspot, - format_metric_row(m_gpu_metrics_tbl.m_temperature_hotspot, - "temperature_hotspot")) - ); m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempHotspot, format_metric_row(m_gpu_metrics_tbl.m_temperature_hotspot, @@ -873,7 +616,7 @@ rsmi_status_t GpuMetricsBase_v14_t::populate_metrics_dynamic_tbl() // Power/Energy Info m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricPowerEnergy] .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrSocketPower, - format_metric_row(m_gpu_metrics_tbl.m_curr_socket_power, + format_metric_row(m_gpu_metrics_tbl.m_current_socket_power, "curr_socket_power")) ); m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricPowerEnergy] @@ -957,15 +700,30 @@ rsmi_status_t GpuMetricsBase_v14_t::populate_metrics_dynamic_tbl() "xgmi_link_speed")) ); m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] - .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieBandwidthAccumulator,\ + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieBandwidthAccumulator, format_metric_row(m_gpu_metrics_tbl.m_pcie_bandwidth_acc, "pcie_bandwidth_acc")) ); m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieBandwidthInst, - format_metric_row(m_gpu_metrics_tbl.m_pcie_bandwidth_acc, + format_metric_row(m_gpu_metrics_tbl.m_pcie_bandwidth_inst, "pcie_bandwidth_inst")) ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieL0RecovCountAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_pcie_l0_to_recov_count_acc, + "pcie_l0_recov_count_acc")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieReplayCountAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_pcie_replay_count_acc, + "pcie_replay_count_acc")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieReplayRollOverCountAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_pcie_replay_rover_count_acc, + "pcie_replay_rollover_count_acc")) + ); m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricXgmiReadDataAccumulator, format_metric_row(m_gpu_metrics_tbl.m_xgmi_read_data_acc, @@ -1004,11 +762,397 @@ rsmi_status_t GpuMetricsBase_v14_t::populate_metrics_dynamic_tbl() "current_uclk")) ); - return rsmi_status_t::RSMI_STATUS_SUCCESS; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return status_code; +} + +rsmi_status_t init_max_public_gpu_matrics(AMGpuMetricsPublicLatest_t& rsmi_gpu_metrics) +{ + std::ostringstream ostrstream; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + rsmi_gpu_metrics.temperature_edge = init_max_uint_types(); + rsmi_gpu_metrics.temperature_hotspot = init_max_uint_types(); + rsmi_gpu_metrics.temperature_mem = init_max_uint_types(); + rsmi_gpu_metrics.temperature_vrgfx = init_max_uint_types(); + rsmi_gpu_metrics.temperature_vrsoc = init_max_uint_types(); + rsmi_gpu_metrics.temperature_vrmem = init_max_uint_types(); + rsmi_gpu_metrics.average_gfx_activity = init_max_uint_types(); + rsmi_gpu_metrics.average_umc_activity = init_max_uint_types(); + rsmi_gpu_metrics.average_mm_activity = init_max_uint_types(); + rsmi_gpu_metrics.average_socket_power = init_max_uint_types(); + rsmi_gpu_metrics.energy_accumulator = init_max_uint_types(); + rsmi_gpu_metrics.system_clock_counter = init_max_uint_types(); + rsmi_gpu_metrics.average_gfxclk_frequency = init_max_uint_types(); + rsmi_gpu_metrics.average_socclk_frequency = init_max_uint_types(); + rsmi_gpu_metrics.average_uclk_frequency = init_max_uint_types(); + rsmi_gpu_metrics.average_vclk0_frequency = init_max_uint_types(); + rsmi_gpu_metrics.average_dclk0_frequency = init_max_uint_types(); + rsmi_gpu_metrics.average_vclk1_frequency = init_max_uint_types(); + rsmi_gpu_metrics.average_dclk1_frequency = init_max_uint_types(); + rsmi_gpu_metrics.current_gfxclk = init_max_uint_types(); + rsmi_gpu_metrics.current_socclk = init_max_uint_types(); + rsmi_gpu_metrics.current_uclk = init_max_uint_types(); + rsmi_gpu_metrics.current_vclk0 = init_max_uint_types(); + rsmi_gpu_metrics.current_dclk0 = init_max_uint_types(); + rsmi_gpu_metrics.current_vclk1 = init_max_uint_types(); + rsmi_gpu_metrics.current_dclk1 = init_max_uint_types(); + rsmi_gpu_metrics.throttle_status = init_max_uint_types(); + rsmi_gpu_metrics.current_fan_speed = init_max_uint_types(); + rsmi_gpu_metrics.pcie_link_width = init_max_uint_types(); + rsmi_gpu_metrics.pcie_link_speed = init_max_uint_types(); + rsmi_gpu_metrics.gfx_activity_acc = init_max_uint_types(); + rsmi_gpu_metrics.mem_activity_acc = init_max_uint_types(); + + std::fill(std::begin(rsmi_gpu_metrics.temperature_hbm), + std::end(rsmi_gpu_metrics.temperature_hbm), + init_max_uint_types()); + + rsmi_gpu_metrics.firmware_timestamp = init_max_uint_types(); + rsmi_gpu_metrics.voltage_soc = init_max_uint_types(); + rsmi_gpu_metrics.voltage_gfx = init_max_uint_types(); + rsmi_gpu_metrics.voltage_mem = init_max_uint_types(); + rsmi_gpu_metrics.indep_throttle_status = init_max_uint_types(); + rsmi_gpu_metrics.current_socket_power = init_max_uint_types(); + + std::fill(std::begin(rsmi_gpu_metrics.vcn_activity), + std::end(rsmi_gpu_metrics.vcn_activity), + init_max_uint_types()); + + rsmi_gpu_metrics.gfxclk_lock_status = init_max_uint_types(); + rsmi_gpu_metrics.xgmi_link_width = init_max_uint_types(); + rsmi_gpu_metrics.xgmi_link_speed = init_max_uint_types(); + rsmi_gpu_metrics.pcie_bandwidth_acc = init_max_uint_types(); + rsmi_gpu_metrics.pcie_bandwidth_inst = init_max_uint_types(); + rsmi_gpu_metrics.pcie_l0_to_recov_count_acc = init_max_uint_types(); + rsmi_gpu_metrics.pcie_replay_count_acc = init_max_uint_types(); + rsmi_gpu_metrics.pcie_replay_rover_count_acc = init_max_uint_types(); + + std::fill(std::begin(rsmi_gpu_metrics.xgmi_read_data_acc), + std::end(rsmi_gpu_metrics.xgmi_read_data_acc), + init_max_uint_types()); + + std::fill(std::begin(rsmi_gpu_metrics.xgmi_write_data_acc), + std::end(rsmi_gpu_metrics.xgmi_write_data_acc), + init_max_uint_types()); + + std::fill(std::begin(rsmi_gpu_metrics.current_gfxclks), + std::end(rsmi_gpu_metrics.current_gfxclks), + init_max_uint_types()); + + std::fill(std::begin(rsmi_gpu_metrics.current_socclks), + std::end(rsmi_gpu_metrics.current_socclks), + init_max_uint_types()); + + std::fill(std::begin(rsmi_gpu_metrics.current_vclk0s), + std::end(rsmi_gpu_metrics.current_vclk0s), + init_max_uint_types()); + + std::fill(std::begin(rsmi_gpu_metrics.current_dclk0s), + std::end(rsmi_gpu_metrics.current_dclk0s), + init_max_uint_types()); + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return status_code; +} + + +AMGpuMetricsPublicLatestTupl_t GpuMetricsBase_v14_t::copy_internal_to_external_metrics() +{ + std::ostringstream ostrstream; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + auto copy_data_from_internal_metrics_tbl = [&]() { + AMGpuMetricsPublicLatest_t metrics_public_init{}; + + // + // Note: Initializing data members with their max. If field is max, + // no data was assigned to it. + init_max_public_gpu_matrics(metrics_public_init); + + // Header + metrics_public_init.common_header.structure_size = m_gpu_metrics_tbl.m_common_header.m_structure_size; + metrics_public_init.common_header.format_revision = m_gpu_metrics_tbl.m_common_header.m_format_revision; + metrics_public_init.common_header.content_revision = m_gpu_metrics_tbl.m_common_header.m_content_revision; + + + // Temperature + metrics_public_init.temperature_hotspot = m_gpu_metrics_tbl.m_temperature_hotspot; + metrics_public_init.temperature_mem = m_gpu_metrics_tbl.m_temperature_mem; + metrics_public_init.temperature_vrsoc = m_gpu_metrics_tbl.m_temperature_vrsoc; + + // Power + metrics_public_init.current_socket_power = m_gpu_metrics_tbl.m_current_socket_power; + + // Utilization + metrics_public_init.average_gfx_activity = m_gpu_metrics_tbl.m_average_gfx_activity; + metrics_public_init.average_umc_activity = m_gpu_metrics_tbl.m_average_umc_activity; + + // vcn_activity + const auto vcn_activity_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_vcn_activity) - + std::begin(m_gpu_metrics_tbl.m_vcn_activity)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_vcn_activity), + vcn_activity_num_elems, + metrics_public_init.vcn_activity); + + // Power/Energy + metrics_public_init.energy_accumulator = m_gpu_metrics_tbl.m_energy_accumulator; + + // Driver attached timestamp (in ns) + metrics_public_init.system_clock_counter = m_gpu_metrics_tbl.m_system_clock_counter; + + // Throttle status + metrics_public_init.throttle_status = m_gpu_metrics_tbl.m_throttle_status; + + // Clock Lock Status. Each bit corresponds to clock instance + metrics_public_init.gfxclk_lock_status = m_gpu_metrics_tbl.m_gfxclk_lock_status; + + // Link width (number of lanes) and speed + metrics_public_init.pcie_link_width = m_gpu_metrics_tbl.m_pcie_link_width; + metrics_public_init.pcie_link_speed = m_gpu_metrics_tbl.m_pcie_link_speed; + + // XGMI bus width and bitrate + metrics_public_init.xgmi_link_width = m_gpu_metrics_tbl.m_xgmi_link_width; + metrics_public_init.xgmi_link_speed = m_gpu_metrics_tbl.m_xgmi_link_speed; + + // Utilization Accumulated + metrics_public_init.gfx_activity_acc = m_gpu_metrics_tbl.m_gfx_activity_acc; + metrics_public_init.mem_activity_acc = m_gpu_metrics_tbl.m_mem_activity_acc; + + // PCIE accumulated bandwidth + metrics_public_init.pcie_bandwidth_acc = m_gpu_metrics_tbl.m_pcie_bandwidth_acc; + + // PCIE instantaneous bandwidth + metrics_public_init.pcie_bandwidth_inst = m_gpu_metrics_tbl.m_pcie_bandwidth_inst; + + // PCIE L0 to recovery state transition accumulated count + metrics_public_init.pcie_l0_to_recov_count_acc = m_gpu_metrics_tbl.m_pcie_l0_to_recov_count_acc; + + // PCIE replay accumulated count + metrics_public_init.pcie_replay_count_acc = m_gpu_metrics_tbl.m_pcie_replay_count_acc; + + // PCIE replay rollover accumulated count + metrics_public_init.pcie_replay_rover_count_acc = m_gpu_metrics_tbl.m_pcie_replay_rover_count_acc; + + // XGMI accumulated data transfer size + // xgmi_read_data + const auto xgmi_read_data_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_xgmi_read_data_acc) - + std::begin(m_gpu_metrics_tbl.m_xgmi_read_data_acc)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_xgmi_read_data_acc), + xgmi_read_data_num_elems, + metrics_public_init.xgmi_read_data_acc); + // xgmi_write_data + const auto xgmi_write_data_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_xgmi_write_data_acc) - + std::begin(m_gpu_metrics_tbl.m_xgmi_write_data_acc)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_xgmi_write_data_acc), + xgmi_write_data_num_elems, + metrics_public_init.xgmi_write_data_acc); + + // PMFW attached timestamp (10ns resolution) + metrics_public_init.firmware_timestamp = m_gpu_metrics_tbl.m_firmware_timestamp; + + // Current clocks + // current_gfxclk + const auto curr_gfxclk_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_current_gfxclk) - + std::begin(m_gpu_metrics_tbl.m_current_gfxclk)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_current_gfxclk), + curr_gfxclk_num_elems, + metrics_public_init.current_gfxclks); + + // current_socclk + const auto curr_socclk_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_current_socclk) - + std::begin(m_gpu_metrics_tbl.m_current_socclk)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_current_socclk), + curr_socclk_num_elems, + metrics_public_init.current_socclks); + + // current_vclk0 + const auto curr_vclk0_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_current_vclk0) - + std::begin(m_gpu_metrics_tbl.m_current_vclk0)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_current_vclk0), + curr_vclk0_num_elems, + metrics_public_init.current_vclk0s); + + // current_dclk0 + const auto curr_dclk0_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_current_dclk0) - + std::begin(m_gpu_metrics_tbl.m_current_dclk0)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_current_dclk0), + curr_dclk0_num_elems, + metrics_public_init.current_dclk0s); + + metrics_public_init.current_uclk = m_gpu_metrics_tbl.m_current_uclk; + + // + // Note: Backwards compatibility -> Handling extra/exception cases + // related to earlier versions (1.3) + metrics_public_init.current_gfxclk = metrics_public_init.current_gfxclks[0]; + metrics_public_init.average_gfxclk_frequency = metrics_public_init.current_gfxclks[0]; + + metrics_public_init.current_socclk = metrics_public_init.current_socclks[0]; + metrics_public_init.average_socclk_frequency = metrics_public_init.current_socclks[0]; + + metrics_public_init.current_vclk0 = metrics_public_init.current_vclk0s[0]; + metrics_public_init.average_vclk0_frequency = metrics_public_init.current_vclk0s[0]; + + metrics_public_init.current_vclk1 = metrics_public_init.current_vclk0s[1]; + metrics_public_init.average_vclk1_frequency = metrics_public_init.current_vclk0s[1]; + + metrics_public_init.current_dclk0 = metrics_public_init.current_dclk0s[0]; + metrics_public_init.average_dclk0_frequency = metrics_public_init.current_dclk0s[0]; + + metrics_public_init.current_dclk1 = metrics_public_init.current_dclk0s[1]; + metrics_public_init.average_dclk1_frequency = metrics_public_init.current_dclk0s[1]; + + return metrics_public_init; + }(); + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return std::make_tuple(status_code, copy_data_from_internal_metrics_tbl); +} + +void GpuMetricsBase_v13_t::dump_internal_metrics_table() +{ + std::ostringstream ostrstream; + std::cout << __PRETTY_FUNCTION__ << " | ======= start ======= \n"; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= DEBUG ======= " + << " | Metric Version: " << stringfy_metric_header_version(m_gpu_metrics_tbl.m_common_header) + << " | Size: " << print_unsigned_int(m_gpu_metrics_tbl.m_common_header.m_structure_size) + << " |" + << "\n"; + ostrstream << " temperature_edge: " << m_gpu_metrics_tbl.m_temperature_edge << "\n" + << " temperature_hotspot: " << m_gpu_metrics_tbl.m_temperature_hotspot << "\n" + << " temperature_mem: " << m_gpu_metrics_tbl.m_temperature_mem << "\n" + << " temperature_vrgfx: " << m_gpu_metrics_tbl.m_temperature_vrgfx << "\n" + << " temperature_vrsoc: " << m_gpu_metrics_tbl.m_temperature_vrsoc << "\n" + << " temperature_vrmem: " << m_gpu_metrics_tbl.m_temperature_vrmem << "\n" + + << " average_gfx_activity: " << m_gpu_metrics_tbl.m_average_gfx_activity << "\n" + << " average_umc_activity: " << m_gpu_metrics_tbl.m_average_umc_activity << "\n" + << " average_mm_activity: " << m_gpu_metrics_tbl.m_average_mm_activity << "\n" + << " average_socket_power: " << m_gpu_metrics_tbl.m_average_socket_power << "\n" + + << " energy_accumulator: " << m_gpu_metrics_tbl.m_energy_accumulator << "\n" + << " system_clock_counter: " << m_gpu_metrics_tbl.m_system_clock_counter << "\n" + + << " average_gfxclk_frequency: " << m_gpu_metrics_tbl.m_average_gfxclk_frequency << "\n" + << " average_socclk_frequency: " << m_gpu_metrics_tbl.m_average_socclk_frequency << "\n" + << " average_uclk_frequency: " << m_gpu_metrics_tbl.m_average_uclk_frequency << "\n" + << " average_vclk0_frequency: " << m_gpu_metrics_tbl.m_average_vclk0_frequency << "\n" + << " average_dclk0_frequency: " << m_gpu_metrics_tbl.m_average_dclk0_frequency << "\n" + << " average_vclk1_frequency: " << m_gpu_metrics_tbl.m_average_vclk1_frequency << "\n" + << " average_dclk1_frequency: " << m_gpu_metrics_tbl.m_average_dclk1_frequency << "\n" + + << " current_gfxclk: " << m_gpu_metrics_tbl.m_current_gfxclk << "\n" + << " current_socclk: " << m_gpu_metrics_tbl.m_current_socclk << "\n" + << " current_uclk: " << m_gpu_metrics_tbl.m_current_uclk << "\n" + << " current_vclk0: " << m_gpu_metrics_tbl.m_current_vclk0 << "\n" + << " current_dclk0: " << m_gpu_metrics_tbl.m_current_dclk0 << "\n" + << " current_vclk1: " << m_gpu_metrics_tbl.m_current_vclk1 << "\n" + << " current_dclk1: " << m_gpu_metrics_tbl.m_current_dclk1 << "\n" + + << " throttle_status: " << m_gpu_metrics_tbl.m_throttle_status << "\n" + + << " current_fan_speed: " << m_gpu_metrics_tbl.m_current_fan_speed << "\n" + + << " pcie_link_width: " << m_gpu_metrics_tbl.m_pcie_link_width << "\n" + << " pcie_link_speed: " << m_gpu_metrics_tbl.m_pcie_link_speed << "\n" + + << " padding: " << m_gpu_metrics_tbl.m_padding << "\n" + + << " gfx_activity_acc: " << m_gpu_metrics_tbl.m_gfx_activity_acc << "\n" + << " mem_activity_acc: " << m_gpu_metrics_tbl.m_mem_activity_acc << "\n"; + LOG_DEBUG(ostrstream); + + ostrstream << " temperature_hbm: " << "\n"; + auto idx = uint64_t(0); + for (const auto& temp : m_gpu_metrics_tbl.m_temperature_hbm) { + ostrstream << "\t [" << idx << "]: " << temp << "\n"; + ++idx; + } + + ostrstream << " firmware_timestamp: " << m_gpu_metrics_tbl.m_firmware_timestamp << "\n" + + << " voltage_soc: " << m_gpu_metrics_tbl.m_voltage_soc << "\n" + << " voltage_gfx: " << m_gpu_metrics_tbl.m_voltage_gfx << "\n" + << " voltage_mem: " << m_gpu_metrics_tbl.m_voltage_mem << "\n" + + << " padding1: " << m_gpu_metrics_tbl.m_padding1 << "\n" + << " m_indep_throttle_status: " << m_gpu_metrics_tbl.m_indep_throttle_status << "\n"; + LOG_DEBUG(ostrstream); } rsmi_status_t GpuMetricsBase_v13_t::populate_metrics_dynamic_tbl() { + std::ostringstream ostrstream; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + // + // Note: Any metric treatment/changes (if any) should happen before they + // get written to internal/external tables. + // + auto run_metric_adjustments_v13 = [&]() { + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + const auto gpu_metrics_version = translate_flag_to_metric_version(get_gpu_metrics_version_used()); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= info ======= " + << " | Applying adjustments " + << " | Metric Version: " << stringfy_metric_header_version( + disjoin_metrics_version(gpu_metrics_version)) + << " |"; + LOG_TRACE(ostrstream); + + // firmware_timestamp is at 10ns resolution + ostrstream << __PRETTY_FUNCTION__ + << " | ======= Changes ======= " + << " | {m_firmware_timestamp} from: " << m_gpu_metrics_tbl.m_firmware_timestamp + << " to: " << (m_gpu_metrics_tbl.m_firmware_timestamp * 10); + m_gpu_metrics_tbl.m_firmware_timestamp = (m_gpu_metrics_tbl.m_firmware_timestamp * 10); + LOG_DEBUG(ostrstream); + }; + + + // Adjustments/Changes specific to this version + run_metric_adjustments_v13(); + // Temperature Info m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempEdge, @@ -1219,19 +1363,775 @@ rsmi_status_t GpuMetricsBase_v13_t::populate_metrics_dynamic_tbl() "voltage_mem")) ); - return rsmi_status_t::RSMI_STATUS_SUCCESS; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return status_code; +} + +AMGpuMetricsPublicLatestTupl_t GpuMetricsBase_v13_t::copy_internal_to_external_metrics() +{ + std::ostringstream ostrstream; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + auto copy_data_from_internal_metrics_tbl = [&]() { + AMGpuMetricsPublicLatest_t metrics_public_init{}; + + // + // Note: Initializing data members with their max. If field is max, + // no data was assigned to it. + init_max_public_gpu_matrics(metrics_public_init); + + // Header + metrics_public_init.common_header.structure_size = m_gpu_metrics_tbl.m_common_header.m_structure_size; + metrics_public_init.common_header.format_revision = m_gpu_metrics_tbl.m_common_header.m_format_revision; + metrics_public_init.common_header.content_revision = m_gpu_metrics_tbl.m_common_header.m_content_revision; + + // Temperature + metrics_public_init.temperature_edge = m_gpu_metrics_tbl.m_temperature_edge; + metrics_public_init.temperature_hotspot = m_gpu_metrics_tbl.m_temperature_hotspot; + metrics_public_init.temperature_mem = m_gpu_metrics_tbl.m_temperature_mem; + metrics_public_init.temperature_vrgfx = m_gpu_metrics_tbl.m_temperature_vrgfx; + metrics_public_init.temperature_vrsoc = m_gpu_metrics_tbl.m_temperature_vrsoc; + metrics_public_init.temperature_vrmem = m_gpu_metrics_tbl.m_temperature_vrmem; + + // Utilization + metrics_public_init.average_gfx_activity = m_gpu_metrics_tbl.m_average_gfx_activity; + metrics_public_init.average_umc_activity = m_gpu_metrics_tbl.m_average_umc_activity; + metrics_public_init.average_mm_activity = m_gpu_metrics_tbl.m_average_mm_activity; + + // Power/Energy + metrics_public_init.average_socket_power = m_gpu_metrics_tbl.m_average_socket_power; // 1.3 and 1.4 have the same value + metrics_public_init.energy_accumulator = m_gpu_metrics_tbl.m_energy_accumulator; + + // Driver attached timestamp (in ns) + metrics_public_init.system_clock_counter = m_gpu_metrics_tbl.m_system_clock_counter; + + // Average clocks + metrics_public_init.average_gfxclk_frequency = m_gpu_metrics_tbl.m_average_gfxclk_frequency; + metrics_public_init.average_socclk_frequency = m_gpu_metrics_tbl.m_average_socclk_frequency; + metrics_public_init.average_uclk_frequency = m_gpu_metrics_tbl.m_average_uclk_frequency; + metrics_public_init.average_vclk0_frequency = m_gpu_metrics_tbl.m_average_vclk0_frequency; + metrics_public_init.average_dclk0_frequency = m_gpu_metrics_tbl.m_average_dclk0_frequency; + metrics_public_init.average_vclk1_frequency = m_gpu_metrics_tbl.m_average_vclk1_frequency; + metrics_public_init.average_dclk1_frequency = m_gpu_metrics_tbl.m_average_dclk1_frequency; + + // Current clocks + metrics_public_init.current_gfxclk = m_gpu_metrics_tbl.m_current_gfxclk; + metrics_public_init.current_socclk = m_gpu_metrics_tbl.m_current_socclk; + metrics_public_init.current_vclk0 = m_gpu_metrics_tbl.m_current_vclk0; + metrics_public_init.current_dclk0 = m_gpu_metrics_tbl.m_current_dclk0; + metrics_public_init.current_uclk = m_gpu_metrics_tbl.m_current_uclk; + metrics_public_init.current_vclk1 = m_gpu_metrics_tbl.m_current_vclk1; + metrics_public_init.current_dclk1 = m_gpu_metrics_tbl.m_current_dclk1; + + // Throttle status + metrics_public_init.throttle_status = m_gpu_metrics_tbl.m_throttle_status; + + // Fans + metrics_public_init.current_fan_speed = m_gpu_metrics_tbl.m_current_fan_speed; + + // Link width/speed + metrics_public_init.pcie_link_width = m_gpu_metrics_tbl.m_pcie_link_width; + metrics_public_init.pcie_link_speed = m_gpu_metrics_tbl.m_pcie_link_speed; + + metrics_public_init.gfx_activity_acc = m_gpu_metrics_tbl.m_gfx_activity_acc; + metrics_public_init.mem_activity_acc = m_gpu_metrics_tbl.m_mem_activity_acc; + + // temperature_hbm + const auto temp_hbm_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_temperature_hbm) - + std::begin(m_gpu_metrics_tbl.m_temperature_hbm)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_temperature_hbm), + temp_hbm_num_elems, + metrics_public_init.temperature_hbm); + + // PMFW attached timestamp (10ns resolution) + metrics_public_init.firmware_timestamp = m_gpu_metrics_tbl.m_firmware_timestamp; + + // Voltage (mV) + metrics_public_init.voltage_soc = m_gpu_metrics_tbl.m_voltage_soc; + metrics_public_init.voltage_gfx = m_gpu_metrics_tbl.m_voltage_gfx; + metrics_public_init.voltage_mem = m_gpu_metrics_tbl.m_voltage_mem; + + // Throttle status + metrics_public_init.indep_throttle_status = m_gpu_metrics_tbl.m_indep_throttle_status; + + // + // Note: Backwards compatibility -> Handling extra/exception cases + // related to earlier versions (1.2) + metrics_public_init.current_socket_power = metrics_public_init.average_socket_power; + + return metrics_public_init; + }(); + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return std::make_tuple(status_code, copy_data_from_internal_metrics_tbl); } rsmi_status_t GpuMetricsBase_v12_t::populate_metrics_dynamic_tbl() { - // TODO: Implement these; - return rsmi_status_t::RSMI_STATUS_NOT_YET_IMPLEMENTED; + std::ostringstream ostrstream; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + // + // Note: Any metric treatment/changes (if any) should happen before they + // get written to internal/external tables. + // + auto run_metric_adjustments_v12 = [&]() { + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + const auto gpu_metrics_version = translate_flag_to_metric_version(get_gpu_metrics_version_used()); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= info ======= " + << " | Applying adjustments " + << " | Metric Version: " << stringfy_metric_header_version( + disjoin_metrics_version(gpu_metrics_version)) + << " |"; + LOG_TRACE(ostrstream); + + // firmware_timestamp is at 10ns resolution + ostrstream << __PRETTY_FUNCTION__ + << " | ======= Changes ======= " + << " | {m_firmware_timestamp} from: " << m_gpu_metrics_tbl.m_firmware_timestamp + << " to: " << (m_gpu_metrics_tbl.m_firmware_timestamp * 10); + m_gpu_metrics_tbl.m_firmware_timestamp = (m_gpu_metrics_tbl.m_firmware_timestamp * 10); + LOG_DEBUG(ostrstream); + }; + + + // Adjustments/Changes specific to this version + run_metric_adjustments_v12(); + + // Temperature Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempEdge, + format_metric_row(m_gpu_metrics_tbl.m_temperature_edge, + "temperature_edge")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempHotspot, + format_metric_row(m_gpu_metrics_tbl.m_temperature_hotspot, + "temperature_hotspot")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempMem, + format_metric_row(m_gpu_metrics_tbl.m_temperature_mem, + "temperature_mem")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempVrGfx, + format_metric_row(m_gpu_metrics_tbl.m_temperature_vrgfx, + "temperature_vrgfx")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempVrSoc, + format_metric_row(m_gpu_metrics_tbl.m_temperature_vrsoc, + "temperature_vrsoc")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempVrMem, + format_metric_row(m_gpu_metrics_tbl.m_temperature_vrmem, + "temperature_vrmem")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempHbm, + format_metric_row(m_gpu_metrics_tbl.m_temperature_hbm, + "[temperature_hbm]")) + ); + + // Power/Energy Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricPowerEnergy] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgSocketPower, + format_metric_row(m_gpu_metrics_tbl.m_average_socket_power, + "average_socket_power")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricPowerEnergy] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricEnergyAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_energy_accumulator, + "energy_acc")) + ); + + // Utilization Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgGfxActivity, + format_metric_row(m_gpu_metrics_tbl.m_average_gfx_activity, + "average_gfx_activity")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgUmcActivity, + format_metric_row(m_gpu_metrics_tbl.m_average_umc_activity, + "average_umc_activity")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgMmActivity, + format_metric_row(m_gpu_metrics_tbl.m_average_mm_activity, + "average_mm_activity")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxActivityAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_gfx_activity_acc, + "gfx_activity_acc")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricMemActivityAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_mem_activity_acc, + "mem_activity_acc")) + ); + + // Timestamp Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTimestamp] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTSFirmware, + format_metric_row(m_gpu_metrics_tbl.m_firmware_timestamp, + "firmware_timestamp")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTimestamp] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTSClockCounter, + format_metric_row(m_gpu_metrics_tbl.m_system_clock_counter, + "system_clock_counter")) + ); + + // Fan Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentFanSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrFanSpeed, + format_metric_row(m_gpu_metrics_tbl.m_current_fan_speed, + "current_fan_speed")) + ); + + // Throttle Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricThrottleStatus] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricThrottleStatus, + format_metric_row(m_gpu_metrics_tbl.m_throttle_status, + "throttle_status")) + ); + + // Average Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgGfxClockFrequency, + format_metric_row(m_gpu_metrics_tbl.m_average_gfxclk_frequency, + "average_gfxclk_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgSocClockFrequency, + format_metric_row(m_gpu_metrics_tbl.m_average_socclk_frequency, + "average_socclk_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgUClockFrequency, + format_metric_row(m_gpu_metrics_tbl.m_average_uclk_frequency, + "average_uclk_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgVClock0Frequency, + format_metric_row(m_gpu_metrics_tbl.m_average_vclk0_frequency, + "average_vclk0_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgDClock0Frequency, + format_metric_row(m_gpu_metrics_tbl.m_average_dclk0_frequency, + "average_dclk0_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgVClock1Frequency, + format_metric_row(m_gpu_metrics_tbl.m_average_vclk1_frequency, + "average_vclk1_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgDClock1Frequency, + format_metric_row(m_gpu_metrics_tbl.m_average_dclk1_frequency, + "average_dclk1_frequency")) + ); + + // CurrentClock Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrGfxClock, + format_metric_row(m_gpu_metrics_tbl.m_current_gfxclk, + "current_gfxclk")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrSocClock, + format_metric_row(m_gpu_metrics_tbl.m_current_socclk, + "current_socclk")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrUClock, + format_metric_row(m_gpu_metrics_tbl.m_current_uclk, + "current_uclk")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrVClock0, + format_metric_row(m_gpu_metrics_tbl.m_current_vclk0, + "current_vclk0")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrDClock0, + format_metric_row(m_gpu_metrics_tbl.m_current_dclk0, + "current_dclk0")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrVClock1, + format_metric_row(m_gpu_metrics_tbl.m_current_vclk1, + "current_vclk1")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrDClock1, + format_metric_row(m_gpu_metrics_tbl.m_current_dclk1, + "current_dclk1")) + ); + + // Link/Width/Speed Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieLinkWidth, + format_metric_row(m_gpu_metrics_tbl.m_pcie_link_width, + "pcie_link_width")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieLinkSpeed, + format_metric_row(m_gpu_metrics_tbl.m_pcie_link_speed, + "pcie_link_speed")) + ); + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return status_code; +} + +AMGpuMetricsPublicLatestTupl_t GpuMetricsBase_v12_t::copy_internal_to_external_metrics() +{ + std::ostringstream ostrstream; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + auto copy_data_from_internal_metrics_tbl = [&]() { + AMGpuMetricsPublicLatest_t metrics_public_init{}; + + // + // Note: Initializing data members with their max. If field is max, + // no data was assigned to it. + init_max_public_gpu_matrics(metrics_public_init); + + // Header + metrics_public_init.common_header.structure_size = m_gpu_metrics_tbl.m_common_header.m_structure_size; + metrics_public_init.common_header.format_revision = m_gpu_metrics_tbl.m_common_header.m_format_revision; + metrics_public_init.common_header.content_revision = m_gpu_metrics_tbl.m_common_header.m_content_revision; + + // Temperature + metrics_public_init.temperature_edge = m_gpu_metrics_tbl.m_temperature_edge; + metrics_public_init.temperature_hotspot = m_gpu_metrics_tbl.m_temperature_hotspot; + metrics_public_init.temperature_mem = m_gpu_metrics_tbl.m_temperature_mem; + metrics_public_init.temperature_vrgfx = m_gpu_metrics_tbl.m_temperature_vrgfx; + metrics_public_init.temperature_vrsoc = m_gpu_metrics_tbl.m_temperature_vrsoc; + metrics_public_init.temperature_vrmem = m_gpu_metrics_tbl.m_temperature_vrmem; + + // Utilization + metrics_public_init.average_gfx_activity = m_gpu_metrics_tbl.m_average_gfx_activity; + metrics_public_init.average_umc_activity = m_gpu_metrics_tbl.m_average_umc_activity; + metrics_public_init.average_mm_activity = m_gpu_metrics_tbl.m_average_mm_activity; + + // Power/Energy + metrics_public_init.average_socket_power = m_gpu_metrics_tbl.m_average_socket_power; + metrics_public_init.energy_accumulator = m_gpu_metrics_tbl.m_energy_accumulator; + + // Driver attached timestamp (in ns) + metrics_public_init.system_clock_counter = m_gpu_metrics_tbl.m_system_clock_counter; + + // Average clocks + metrics_public_init.average_gfxclk_frequency = m_gpu_metrics_tbl.m_average_gfxclk_frequency; + metrics_public_init.average_socclk_frequency = m_gpu_metrics_tbl.m_average_socclk_frequency; + metrics_public_init.average_uclk_frequency = m_gpu_metrics_tbl.m_average_uclk_frequency; + metrics_public_init.average_vclk0_frequency = m_gpu_metrics_tbl.m_average_vclk0_frequency; + metrics_public_init.average_dclk0_frequency = m_gpu_metrics_tbl.m_average_dclk0_frequency; + metrics_public_init.average_vclk1_frequency = m_gpu_metrics_tbl.m_average_vclk1_frequency; + metrics_public_init.average_dclk1_frequency = m_gpu_metrics_tbl.m_average_dclk1_frequency; + + // Current clocks + metrics_public_init.current_gfxclk = m_gpu_metrics_tbl.m_current_gfxclk; + metrics_public_init.current_socclk = m_gpu_metrics_tbl.m_current_socclk; + metrics_public_init.current_vclk0 = m_gpu_metrics_tbl.m_current_vclk0; + metrics_public_init.current_dclk0 = m_gpu_metrics_tbl.m_current_dclk0; + metrics_public_init.current_uclk = m_gpu_metrics_tbl.m_current_uclk; + metrics_public_init.current_vclk1 = m_gpu_metrics_tbl.m_current_vclk1; + metrics_public_init.current_dclk1 = m_gpu_metrics_tbl.m_current_dclk1; + + // Throttle status + metrics_public_init.throttle_status = m_gpu_metrics_tbl.m_throttle_status; + + // Fans + metrics_public_init.current_fan_speed = m_gpu_metrics_tbl.m_current_fan_speed; + + // Link width/speed + metrics_public_init.pcie_link_width = m_gpu_metrics_tbl.m_pcie_link_width; + metrics_public_init.pcie_link_speed = m_gpu_metrics_tbl.m_pcie_link_speed; + + metrics_public_init.gfx_activity_acc = m_gpu_metrics_tbl.m_gfx_activity_acc; + metrics_public_init.mem_activity_acc = m_gpu_metrics_tbl.m_mem_activity_acc; + + // temperature_hbm + const auto temp_hbm_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_temperature_hbm) - + std::begin(m_gpu_metrics_tbl.m_temperature_hbm)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_temperature_hbm), + temp_hbm_num_elems, + metrics_public_init.temperature_hbm); + + // PMFW attached timestamp (10ns resolution) + metrics_public_init.firmware_timestamp = m_gpu_metrics_tbl.m_firmware_timestamp; + + // + // Note: Backwards compatibility -> Handling extra/exception cases + // related to earlier versions (1.1) + + + return metrics_public_init; + }(); + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return std::make_tuple(status_code, copy_data_from_internal_metrics_tbl); } rsmi_status_t GpuMetricsBase_v11_t::populate_metrics_dynamic_tbl() { - // TODO: Implement these; - return rsmi_status_t::RSMI_STATUS_NOT_YET_IMPLEMENTED; + std::ostringstream ostrstream; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + // + // Note: Any metric treatment/changes (if any) should happen before they + // get written to internal/external tables. + // + auto run_metric_adjustments_v11 = [&]() { + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + const auto gpu_metrics_version = translate_flag_to_metric_version(get_gpu_metrics_version_used()); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= info ======= " + << " | Applying adjustments " + << " | Metric Version: " << stringfy_metric_header_version( + disjoin_metrics_version(gpu_metrics_version)) + << " |"; + LOG_TRACE(ostrstream); + }; + + + // Adjustments/Changes specific to this version + run_metric_adjustments_v11(); + + // Temperature Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempEdge, + format_metric_row(m_gpu_metrics_tbl.m_temperature_edge, + "temperature_edge")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempHotspot, + format_metric_row(m_gpu_metrics_tbl.m_temperature_hotspot, + "temperature_hotspot")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempMem, + format_metric_row(m_gpu_metrics_tbl.m_temperature_mem, + "temperature_mem")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempVrGfx, + format_metric_row(m_gpu_metrics_tbl.m_temperature_vrgfx, + "temperature_vrgfx")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempVrSoc, + format_metric_row(m_gpu_metrics_tbl.m_temperature_vrsoc, + "temperature_vrsoc")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempVrMem, + format_metric_row(m_gpu_metrics_tbl.m_temperature_vrmem, + "temperature_vrmem")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTemperature] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTempHbm, + format_metric_row(m_gpu_metrics_tbl.m_temperature_hbm, + "[temperature_hbm]")) + ); + + // Power/Energy Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricPowerEnergy] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgSocketPower, + format_metric_row(m_gpu_metrics_tbl.m_average_socket_power, + "average_socket_power")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricPowerEnergy] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricEnergyAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_energy_accumulator, + "energy_acc")) + ); + + // Utilization Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgGfxActivity, + format_metric_row(m_gpu_metrics_tbl.m_average_gfx_activity, + "average_gfx_activity")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgUmcActivity, + format_metric_row(m_gpu_metrics_tbl.m_average_umc_activity, + "average_umc_activity")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgMmActivity, + format_metric_row(m_gpu_metrics_tbl.m_average_mm_activity, + "average_mm_activity")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricGfxActivityAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_gfx_activity_acc, + "gfx_activity_acc")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricUtilization] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricMemActivityAccumulator, + format_metric_row(m_gpu_metrics_tbl.m_mem_activity_acc, + "mem_activity_acc")) + ); + + // Timestamp Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricTimestamp] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricTSClockCounter, + format_metric_row(m_gpu_metrics_tbl.m_system_clock_counter, + "system_clock_counter")) + ); + + // Fan Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentFanSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrFanSpeed, + format_metric_row(m_gpu_metrics_tbl.m_current_fan_speed, + "current_fan_speed")) + ); + + // Throttle Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricThrottleStatus] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricThrottleStatus, + format_metric_row(m_gpu_metrics_tbl.m_throttle_status, + "throttle_status")) + ); + + // Average Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgGfxClockFrequency, + format_metric_row(m_gpu_metrics_tbl.m_average_gfxclk_frequency, + "average_gfxclk_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgSocClockFrequency, + format_metric_row(m_gpu_metrics_tbl.m_average_socclk_frequency, + "average_socclk_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgUClockFrequency, + format_metric_row(m_gpu_metrics_tbl.m_average_uclk_frequency, + "average_uclk_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgVClock0Frequency, + format_metric_row(m_gpu_metrics_tbl.m_average_vclk0_frequency, + "average_vclk0_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgDClock0Frequency, + format_metric_row(m_gpu_metrics_tbl.m_average_dclk0_frequency, + "average_dclk0_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgVClock1Frequency, + format_metric_row(m_gpu_metrics_tbl.m_average_vclk1_frequency, + "average_vclk1_frequency")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricAverageClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricAvgDClock1Frequency, + format_metric_row(m_gpu_metrics_tbl.m_average_dclk1_frequency, + "average_dclk1_frequency")) + ); + + // CurrentClock Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrGfxClock, + format_metric_row(m_gpu_metrics_tbl.m_current_gfxclk, + "current_gfxclk")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrSocClock, + format_metric_row(m_gpu_metrics_tbl.m_current_socclk, + "current_socclk")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrUClock, + format_metric_row(m_gpu_metrics_tbl.m_current_uclk, + "current_uclk")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrVClock0, + format_metric_row(m_gpu_metrics_tbl.m_current_vclk0, + "current_vclk0")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrDClock0, + format_metric_row(m_gpu_metrics_tbl.m_current_dclk0, + "current_dclk0")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrVClock1, + format_metric_row(m_gpu_metrics_tbl.m_current_vclk1, + "current_vclk1")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricCurrentClock] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricCurrDClock1, + format_metric_row(m_gpu_metrics_tbl.m_current_dclk1, + "current_dclk1")) + ); + + // Link/Width/Speed Info + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieLinkWidth, + format_metric_row(m_gpu_metrics_tbl.m_pcie_link_width, + "pcie_link_width")) + ); + m_metrics_dynamic_tbl[AMDGpuMetricsClassId_t::kGpuMetricLinkWidthSpeed] + .insert(std::make_pair(AMDGpuMetricsUnitType_t::kMetricPcieLinkSpeed, + format_metric_row(m_gpu_metrics_tbl.m_pcie_link_speed, + "pcie_link_speed")) + ); + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return status_code; +} + +AMGpuMetricsPublicLatestTupl_t GpuMetricsBase_v11_t::copy_internal_to_external_metrics() +{ + std::ostringstream ostrstream; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + auto copy_data_from_internal_metrics_tbl = [&]() { + AMGpuMetricsPublicLatest_t metrics_public_init{}; + + // + // Note: Initializing data members with their max. If field is max, + // no data was assigned to it. + init_max_public_gpu_matrics(metrics_public_init); + + // Header + metrics_public_init.common_header.structure_size = m_gpu_metrics_tbl.m_common_header.m_structure_size; + metrics_public_init.common_header.format_revision = m_gpu_metrics_tbl.m_common_header.m_format_revision; + metrics_public_init.common_header.content_revision = m_gpu_metrics_tbl.m_common_header.m_content_revision; + + // Temperature + metrics_public_init.temperature_edge = m_gpu_metrics_tbl.m_temperature_edge; + metrics_public_init.temperature_hotspot = m_gpu_metrics_tbl.m_temperature_hotspot; + metrics_public_init.temperature_mem = m_gpu_metrics_tbl.m_temperature_mem; + metrics_public_init.temperature_vrgfx = m_gpu_metrics_tbl.m_temperature_vrgfx; + metrics_public_init.temperature_vrsoc = m_gpu_metrics_tbl.m_temperature_vrsoc; + metrics_public_init.temperature_vrmem = m_gpu_metrics_tbl.m_temperature_vrmem; + + // Utilization + metrics_public_init.average_gfx_activity = m_gpu_metrics_tbl.m_average_gfx_activity; + metrics_public_init.average_umc_activity = m_gpu_metrics_tbl.m_average_umc_activity; + metrics_public_init.average_mm_activity = m_gpu_metrics_tbl.m_average_mm_activity; + + // Power/Energy + metrics_public_init.average_socket_power = m_gpu_metrics_tbl.m_average_socket_power; + metrics_public_init.energy_accumulator = m_gpu_metrics_tbl.m_energy_accumulator; + + // Driver attached timestamp (in ns) + metrics_public_init.system_clock_counter = m_gpu_metrics_tbl.m_system_clock_counter; + + // Average clocks + metrics_public_init.average_gfxclk_frequency = m_gpu_metrics_tbl.m_average_gfxclk_frequency; + metrics_public_init.average_socclk_frequency = m_gpu_metrics_tbl.m_average_socclk_frequency; + metrics_public_init.average_uclk_frequency = m_gpu_metrics_tbl.m_average_uclk_frequency; + metrics_public_init.average_vclk0_frequency = m_gpu_metrics_tbl.m_average_vclk0_frequency; + metrics_public_init.average_dclk0_frequency = m_gpu_metrics_tbl.m_average_dclk0_frequency; + metrics_public_init.average_vclk1_frequency = m_gpu_metrics_tbl.m_average_vclk1_frequency; + metrics_public_init.average_dclk1_frequency = m_gpu_metrics_tbl.m_average_dclk1_frequency; + + // Current clocks + metrics_public_init.current_gfxclk = m_gpu_metrics_tbl.m_current_gfxclk; + metrics_public_init.current_socclk = m_gpu_metrics_tbl.m_current_socclk; + metrics_public_init.current_vclk0 = m_gpu_metrics_tbl.m_current_vclk0; + metrics_public_init.current_dclk0 = m_gpu_metrics_tbl.m_current_dclk0; + metrics_public_init.current_uclk = m_gpu_metrics_tbl.m_current_uclk; + metrics_public_init.current_vclk1 = m_gpu_metrics_tbl.m_current_vclk1; + metrics_public_init.current_dclk1 = m_gpu_metrics_tbl.m_current_dclk1; + + // Throttle status + metrics_public_init.throttle_status = m_gpu_metrics_tbl.m_throttle_status; + + // Fans + metrics_public_init.current_fan_speed = m_gpu_metrics_tbl.m_current_fan_speed; + + // Link width/speed + metrics_public_init.pcie_link_width = m_gpu_metrics_tbl.m_pcie_link_width; + metrics_public_init.pcie_link_speed = m_gpu_metrics_tbl.m_pcie_link_speed; + + metrics_public_init.gfx_activity_acc = m_gpu_metrics_tbl.m_gfx_activity_acc; + metrics_public_init.mem_activity_acc = m_gpu_metrics_tbl.m_mem_activity_acc; + + // temperature_hbm + const auto temp_hbm_num_elems = + static_cast( + std::end(m_gpu_metrics_tbl.m_temperature_hbm) - + std::begin(m_gpu_metrics_tbl.m_temperature_hbm)); + std::copy_n(std::begin(m_gpu_metrics_tbl.m_temperature_hbm), + temp_hbm_num_elems, + metrics_public_init.temperature_hbm); + + // + // Note: Backwards compatibility -> Handling extra/exception cases + // related to earlier versions (1.0) + + + return metrics_public_init; + }(); + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Returning = " << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return std::make_tuple(status_code, copy_data_from_internal_metrics_tbl); } @@ -1308,15 +2208,19 @@ rsmi_status_t Device::dev_read_gpu_metrics_all_data() ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; LOG_TRACE(ostrstream); - // At this point we should have a valid gpu_metrics pointer. - if (!m_gpu_metrics_ptr) { - status_code = rsmi_status_t::RSMI_STATUS_UNEXPECTED_DATA; + // At this point we should have a valid gpu_metrics pointer, and + // we already read the header; setup_gpu_metrics_reading() + if ((!m_gpu_metrics_ptr) || + ((!m_gpu_metrics_header.m_structure_size) || + (!m_gpu_metrics_header.m_format_revision) || + (!m_gpu_metrics_header.m_content_revision))) { + status_code = rsmi_status_t::RSMI_STATUS_SETTING_UNAVAILABLE; ostrstream << __PRETTY_FUNCTION__ << " | ======= end ======= " << " | Fail " << " | Device #: " << index() << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) - << " | Cause: Couldn't get a valid metric object" + << " | Cause: Couldn't get a valid metric object. setup_gpu_metrics_reading()" << " | Returning = " << getRSMIStatusString(status_code) << " |"; @@ -1325,8 +2229,8 @@ rsmi_status_t Device::dev_read_gpu_metrics_all_data() } auto op_result = readDevInfo(DevInfoTypes::kDevGpuMetrics, - m_gpu_metrics_ptr->sizeof_metric_table(), - &m_gpu_metrics_ptr->get_metrics_table()); + m_gpu_metrics_header.m_structure_size, + m_gpu_metrics_ptr->get_metrics_table().get()); if ((status_code = ErrnoToRsmiStatus(op_result)) != rsmi_status_t::RSMI_STATUS_SUCCESS) { ostrstream << __PRETTY_FUNCTION__ @@ -1344,6 +2248,21 @@ rsmi_status_t Device::dev_read_gpu_metrics_all_data() return status_code; } + // All metric units are pushed in. + status_code = m_gpu_metrics_ptr->populate_metrics_dynamic_tbl(); + if (status_code != rsmi_status_t::RSMI_STATUS_SUCCESS) { + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(m_gpu_metrics_header) + << " | Update Timestamp: " << m_gpu_metrics_updated_timestamp + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_ERROR(ostrstream); + } + m_gpu_metrics_updated_timestamp = actual_timestamp_in_secs(); ostrstream << __PRETTY_FUNCTION__ << " | ======= end ======= " @@ -1388,24 +2307,28 @@ rsmi_status_t Device::setup_gpu_metrics_reading() return status_code; } - auto gpu_metrics_ptr = amdgpu_metrics_factory(gpu_metrics_flag_version); - if (!gpu_metrics_ptr) { - status_code = rsmi_status_t::RSMI_STATUS_UNEXPECTED_DATA; - ostrstream << __PRETTY_FUNCTION__ - << " | ======= end ======= " - << " | Fail " - << " | Device #: " << index() - << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) - << " | Cause: amdgpu_metrics_factory() couldn't get a valid metric object" - << " | Returning = " - << getRSMIStatusString(status_code) - << " |"; - LOG_ERROR(ostrstream); - return status_code; + // + // if/in case setup_gpu_metrics_reading() was called already use the same pointer + if (!m_gpu_metrics_ptr) { + m_gpu_metrics_ptr = amdgpu_metrics_factory(gpu_metrics_flag_version); + if (!m_gpu_metrics_ptr) { + status_code = rsmi_status_t::RSMI_STATUS_UNEXPECTED_DATA; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Cause: amdgpu_metrics_factory() couldn't get a valid metric object" + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_ERROR(ostrstream); + return status_code; + } } - /// gpu_metrics_ptr has the pointer to the proper object type/version. - dev_set_gpu_metric(gpu_metrics_ptr); + // + // m_gpu_metrics_ptr has the pointer to the proper object type/version. status_code = dev_read_gpu_metrics_all_data(); if (status_code != rsmi_status_t::RSMI_STATUS_SUCCESS) { ostrstream << __PRETTY_FUNCTION__ @@ -1421,139 +2344,312 @@ rsmi_status_t Device::setup_gpu_metrics_reading() return status_code; } + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Fabric: [" << &m_gpu_metrics_ptr + << " ]" + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); return status_code; } -rsmi_status_t Device::dev_log_gpu_metrics() + +template +struct MetricValueCast_t; + +template<> +struct MetricValueCast_t +{ + using value_type = std::uint8_t; +}; +template<> +struct MetricValueCast_t +{ + using value_type = std::uint16_t; +}; +template<> +struct MetricValueCast_t +{ + using value_type = std::uint32_t; +}; + +template<> +struct MetricValueCast_t +{ + using value_type = std::uint64_t; +}; + +template +auto get_casted_value(const AMDGpuDynamicMetricsValue_t& metrics_value) +{ + using ValueType_t = typename MetricValueCast_t
::value_type; + return static_cast(metrics_value.m_value); +} + + +rsmi_status_t Device::dev_log_gpu_metrics(std::ostringstream& outstream_metrics) { std::ostringstream ostrstream; + std::ostringstream tmp_outstream_metrics; auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; LOG_TRACE(ostrstream); - // At this point we should have a valid gpu_metrics pointer. + // If we still don't have a valid gpu_metrics pointer; + // meaning, we didn't run any queries, and just want to + // print all the gpu metrics content, we need to setup + // the environment first. if (!m_gpu_metrics_ptr) { - status_code = rsmi_status_t::RSMI_STATUS_UNEXPECTED_DATA; - ostrstream << __PRETTY_FUNCTION__ - << " | ======= end ======= " - << " | Fail " - << " | Device #: " << index() - << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) - << " | Cause: Couldn't get a valid metric object" - << " | Returning = " - << getRSMIStatusString(status_code) - << " |"; - LOG_ERROR(ostrstream); - return status_code; + status_code = setup_gpu_metrics_reading(); + if ((status_code != rsmi_status_t::RSMI_STATUS_SUCCESS) || (!m_gpu_metrics_ptr)) { + // At this point we should have a valid gpu_metrics pointer. + status_code = rsmi_status_t::RSMI_STATUS_UNEXPECTED_DATA; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Cause: Couldn't get a valid metric object" + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_ERROR(ostrstream); + return status_code; + } } // Header info + const auto kDoubleLine = std::string("+==============================+"); + const auto kSingleLine = std::string("+------------------------------+"); auto header_output = [&]() { const auto gpu_metrics_header = dev_get_metrics_header(); - ostrstream << "GPU Metrics Header: \n"; - ostrstream << "Timestamp: " << m_gpu_metrics_updated_timestamp << "\n"; - ostrstream << "Based on: " << static_cast(m_gpu_metrics_ptr->get_gpu_metrics_version_used()) << "\n"; - ostrstream << print_unsigned_hex_and_int(gpu_metrics_header.m_structure_size, " ->structure_size "); - ostrstream << print_unsigned_hex_and_int(gpu_metrics_header.m_format_revision, " ->format_revision "); - ostrstream << print_unsigned_hex_and_int(gpu_metrics_header.m_content_revision, " ->content_revision "); - LOG_DEBUG(ostrstream); + const auto timestamp_time = timestamp_to_time_point(m_gpu_metrics_updated_timestamp); + tmp_outstream_metrics << "\n" << kDoubleLine << "\n"; + tmp_outstream_metrics << "*** GPU Metrics Header: ***"; + tmp_outstream_metrics << "\n"; + tmp_outstream_metrics << "Timestamp: " + << " [" + << m_gpu_metrics_updated_timestamp + << "] " + << std::ctime(×tamp_time); + tmp_outstream_metrics << "Version: " + << print_unsigned_int(gpu_metrics_header.m_format_revision) + << "." + << print_unsigned_int(gpu_metrics_header.m_content_revision) + << " [Flag: " + << static_cast(m_gpu_metrics_ptr->get_gpu_metrics_version_used()) + << "] " + << "\n"; + tmp_outstream_metrics << " ->Device #: " << index() << "\n"; + tmp_outstream_metrics << print_unsigned_hex_and_int(gpu_metrics_header.m_structure_size, " ->structure_size "); + tmp_outstream_metrics << print_unsigned_hex_and_int(gpu_metrics_header.m_format_revision, " ->format_revision "); + tmp_outstream_metrics << print_unsigned_hex_and_int(gpu_metrics_header.m_content_revision, " ->content_revision "); + tmp_outstream_metrics << "\n" << kSingleLine << "\n"; return; }; + // Metrics info auto table_content_output = [&]() { const auto gpu_metrics_tbl = m_gpu_metrics_ptr->get_metrics_dynamic_tbl(); - - ostrstream << "GPU Metrics Data: \n"; + tmp_outstream_metrics << "\n"; + tmp_outstream_metrics << "*** GPU Metrics Data: *** \n"; for (const auto& [metric_class, metric_data] : gpu_metrics_tbl) { - ostrstream << amdgpu_metrics_class_id_translation_table.at(metric_class) << "\n"; + tmp_outstream_metrics << "\n"; + tmp_outstream_metrics << "[ " << amdgpu_metrics_class_id_translation_table.at(metric_class) << " ]" << "\n"; for (const auto& [metric_unit, metric_values] : metric_data) { + auto tmp_metric_info = ("[ " + amdgpu_metrics_unit_type_translation_table.at(metric_unit) + " ]"); for (const auto& metric_value : metric_values) { - ostrstream << print_unsigned_hex_and_int(metric_value.m_value, metric_value.m_info); + switch (metric_value.m_original_type) { + case (AMDGpuMetricsDataType_t::kUInt16): + { + auto value = get_casted_value(metric_value); + tmp_outstream_metrics << print_unsigned_hex_and_int((value), metric_value.m_info) << " -> " << tmp_metric_info; + } + break; + + case (AMDGpuMetricsDataType_t::kUInt32): + { + auto value = get_casted_value(metric_value); + tmp_outstream_metrics << print_unsigned_hex_and_int((value), metric_value.m_info) << " -> " << tmp_metric_info; + } + break; + + case (AMDGpuMetricsDataType_t::kUInt64): + { + auto value = get_casted_value(metric_value); + tmp_outstream_metrics << print_unsigned_hex_and_int((value), metric_value.m_info) << " -> " << tmp_metric_info; + } + break; + + default: + tmp_outstream_metrics << "Error: No data type conversion for original type: " << static_cast(metric_value.m_original_type) << "\n"; + break; + } } } + tmp_outstream_metrics << "\n\n"; } + tmp_outstream_metrics << "\n" << kDoubleLine << "\n"; return; }; // header_output(); table_content_output(); + outstream_metrics << tmp_outstream_metrics.rdbuf(); + LOG_DEBUG(tmp_outstream_metrics); + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Fabric: [" << &m_gpu_metrics_ptr + << " ]" + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); return status_code; } +AMGpuMetricsPublicLatestTupl_t Device::dev_copy_internal_to_external_metrics() +{ + std::ostringstream ostrstream; + std::ostringstream tmp_outstream_metrics; + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; + LOG_TRACE(ostrstream); + + if (!m_gpu_metrics_ptr) { + // At this point we should have a valid gpu_metrics pointer. + status_code = rsmi_status_t::RSMI_STATUS_UNEXPECTED_DATA; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Cause: Couldn't get a valid metric object" + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_ERROR(ostrstream); + return std::make_tuple(status_code, AMGpuMetricsPublicLatest_t()); + } + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Fabric: [" << &m_gpu_metrics_ptr + << " ]" + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return m_gpu_metrics_ptr->copy_internal_to_external_metrics(); +} + + rsmi_status_t Device::run_internal_gpu_metrics_query(AMDGpuMetricsUnitType_t metric_counter, AMDGpuDynamicMetricTblValues_t& values) { std::ostringstream ostrstream; - auto status_code(rsmi_status_t::RSMI_STATUS_NOT_FOUND); + auto status_code(rsmi_status_t::RSMI_STATUS_NOT_SUPPORTED); ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; LOG_TRACE(ostrstream); - status_code = setup_gpu_metrics_reading(); - if (status_code != rsmi_status_t::RSMI_STATUS_SUCCESS) { - return status_code; - } - if (!m_gpu_metrics_ptr) { - status_code = rsmi_status_t::RSMI_STATUS_UNEXPECTED_DATA; - ostrstream << __PRETTY_FUNCTION__ - << " | ======= end ======= " - << " | Fail " - << " | Device #: " << index() - << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) - << " | Cause: Couldn't get a valid metric object" - << " | Returning = " - << getRSMIStatusString(status_code) - << " |"; - LOG_ERROR(ostrstream); - return status_code; + status_code = setup_gpu_metrics_reading(); + if ((status_code != rsmi_status_t::RSMI_STATUS_SUCCESS) || (!m_gpu_metrics_ptr)) { + status_code = rsmi_status_t::RSMI_STATUS_UNEXPECTED_DATA; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Cause: Couldn't get a valid metric object" + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_ERROR(ostrstream); + return status_code; + } } // Lookup the dynamic table + ostrstream << __PRETTY_FUNCTION__ + << " | ======= info ======= " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Metric Unit: " << static_cast(metric_counter) + << " |"; + LOG_INFO(ostrstream); const auto gpu_metrics_tbl = m_gpu_metrics_ptr->get_metrics_dynamic_tbl(); for (const auto& [metric_class, metric_data] : gpu_metrics_tbl) { for (const auto& [metric_unit, metric_values] : metric_data) { if (metric_unit == metric_counter) { values = metric_values; - return rsmi_status_t::RSMI_STATUS_SUCCESS; + status_code = rsmi_status_t::RSMI_STATUS_SUCCESS; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Metric Unit: " << static_cast(metric_counter) + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_ERROR(ostrstream); + return status_code; } } } + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Device #: " << index() + << " | Metric Version: " << stringfy_metrics_header(dev_get_metrics_header()) + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_ERROR(ostrstream); return status_code; } -template struct is_vector : std::false_type {}; -template struct is_vector> : std::true_type {}; -template inline constexpr bool is_vector_v = is_vector::value; +template +constexpr inline bool is_metric_data_type_supported_v = + ((std::is_same_v) || (std::is_same_v) || + (std::is_same_v) || (std::is_same_v) || + (std::is_same_v) || (std::is_same_v)); -template struct is_array : std::false_type {}; -template struct is_array> : std::true_type {}; +template +struct is_std_vector : std::false_type {}; -template struct is_bounded_uint8_array : std::false_type {}; -template struct is_bounded_uint16_array : std::false_type {}; -template struct is_bounded_uint32_array : std::false_type {}; -template struct is_bounded_uint64_array : std::false_type {}; +template +struct is_std_vector> : std::true_type {}; -template -struct is_bounded_uint8_array : std::true_type {}; - -template -struct is_bounded_uint16_array : std::true_type {}; - -template -struct is_bounded_uint32_array : std::true_type {}; - -template -struct is_bounded_uint64_array : std::true_type {}; - -template struct is_bounded_array : std::false_type {}; - -template -struct is_bounded_array : std::true_type {}; +template +inline constexpr bool is_std_vector_v = is_std_vector::value; +template +constexpr bool is_std_vector_type_supported_v() +{ + if constexpr (is_std_vector_v) { + using ValueType_t = typename T::value_type; + return (is_metric_data_type_supported_v); + } + return false; +}; template rsmi_status_t rsmi_dev_gpu_metrics_info_query(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, T& metric_value) @@ -1563,79 +2659,173 @@ rsmi_status_t rsmi_dev_gpu_metrics_info_query(uint32_t dv_ind, AMDGpuMetricsUnit ostrstream << __PRETTY_FUNCTION__ << " | ======= start ======="; LOG_TRACE(ostrstream); - AMDGpuDynamicMetricTblValues_t tmp_values{}; - GET_DEV_FROM_INDX - status_code = dev->run_internal_gpu_metrics_query(metric_counter, tmp_values); - if ((status_code != rsmi_status_t::RSMI_STATUS_SUCCESS) || tmp_values.empty()) { - ostrstream << __PRETTY_FUNCTION__ - << " | ======= end ======= " - << " | Fail " - << " | Device #: " << dv_ind - << " | Metric Version: " << stringfy_metrics_header(dev->dev_get_metrics_header()) - << " | Cause: Couldn't find metric/counter requested" - << " | Metric Type: " << static_cast(metric_counter) - << " " << amdgpu_metrics_unit_type_translation_table.at(metric_counter) - << " | Values: " << tmp_values.size() - << " | Returning = " - << getRSMIStatusString(status_code) - << " |"; - LOG_ERROR(ostrstream); - return status_code; - } - - const auto num_stored_elems = (std::end(tmp_values) - std::begin(tmp_values)); - if constexpr (std::is_array_v) { - std::variant tmp_value; - auto idx = uint16_t(0); - for (const auto& value : tmp_values) { - tmp_value = value.m_value; - idx++; - switch (value.m_original_type) { - case AMDGpuMetricsDataType_t::kUInt8: - metric_value[idx] = std::get(tmp_value); - break; - - case AMDGpuMetricsDataType_t::kUInt16: - metric_value[idx] = std::get(tmp_value); - break; - - case AMDGpuMetricsDataType_t::kUInt32: - metric_value[idx] = std::get(tmp_value); - break; - - case AMDGpuMetricsDataType_t::kUInt64: - metric_value[idx] = std::get(tmp_value); - break; - - default: - break; + static constexpr bool is_supported_vector_type = [&]() { + if constexpr (is_std_vector_v) { + if (is_std_vector_type_supported_v()) { + return true; } + } + return false; + }(); - metric_value[idx++] = tmp_value; + + if constexpr ((is_supported_vector_type) || (is_metric_data_type_supported_v)) { + // Get all stored values for the metric unit/counter + AMDGpuDynamicMetricTblValues_t tmp_values{}; + GET_DEV_FROM_INDX + status_code = dev->run_internal_gpu_metrics_query(metric_counter, tmp_values); + if ((status_code != rsmi_status_t::RSMI_STATUS_SUCCESS) || tmp_values.empty()) { + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Device #: " << dv_ind + << " | Metric Version: " << stringfy_metrics_header(dev->dev_get_metrics_header()) + << " | Cause: Couldn't find metric/counter requested" + << " | Metric Type: " << static_cast(metric_counter) + << " " << amdgpu_metrics_unit_type_translation_table.at(metric_counter) + << " | Values: " << tmp_values.size() + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_ERROR(ostrstream); + return status_code; + } + + if constexpr (is_std_vector_v) { + using ValueType_t = typename T::value_type; + ValueType_t tmp_value; + + for (const auto& value : tmp_values) { + tmp_value = static_cast(value.m_value); + metric_value.push_back(tmp_value); + } + } + else if constexpr (is_metric_data_type_supported_v) { + T tmp_value(0); + tmp_value = static_cast(tmp_values[0].m_value); + metric_value = tmp_value; } } - if constexpr ((std::is_same_v) || (std::is_same_v) || - (std::is_same_v) || (std::is_same_v)) { - T tmp_value(0); - tmp_value = static_cast(tmp_values[0].m_value); - metric_value = tmp_value; + else { + static_assert(is_dependent_false_v, "Error: Data Type not supported..."); } + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Device #: " << dv_ind + << " | Metric Type: " << static_cast(metric_counter) + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_ERROR(ostrstream); return status_code; } template -rsmi_status_t rsmi_dev_gpu_metrics_info_query(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, uint8_t& metric_value); +rsmi_status_t rsmi_dev_gpu_metrics_info_query +(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, uint16_t& metric_value); template -rsmi_status_t rsmi_dev_gpu_metrics_info_query(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, uint16_t& metric_value); +rsmi_status_t rsmi_dev_gpu_metrics_info_query +(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, uint32_t& metric_value); template -rsmi_status_t rsmi_dev_gpu_metrics_info_query(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, uint32_t& metric_value); +rsmi_status_t rsmi_dev_gpu_metrics_info_query +(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, uint64_t& metric_value); template -rsmi_status_t rsmi_dev_gpu_metrics_info_query(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, uint64_t& metric_value); +rsmi_status_t rsmi_dev_gpu_metrics_info_query +(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, GpuMetricU16Tbl_t& metric_value); +template +rsmi_status_t rsmi_dev_gpu_metrics_info_query +(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, GpuMetricU32Tbl_t& metric_value); + +template +rsmi_status_t rsmi_dev_gpu_metrics_info_query +(uint32_t dv_ind, AMDGpuMetricsUnitType_t metric_counter, GpuMetricU64Tbl_t& metric_value); } //namespace amd::smi + +rsmi_status_t +rsmi_dev_gpu_metrics_header_info_get(uint32_t dv_ind, metrics_table_header_t& header_value) +{ + TRY + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + GET_DEV_FROM_INDX + status_code = dev->dev_read_gpu_metrics_header_data(); + if (status_code == rsmi_status_t::RSMI_STATUS_SUCCESS) { + auto tmp_header_info = dev->dev_get_metrics_header(); + std::memcpy(&header_value, &tmp_header_info, sizeof(metrics_table_header_t)); + } + + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Device #: " << dv_ind + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return status_code; + CATCH +} + +//dev_read_gpu_metrics_header_data + +/** + * Note: These keep backwards compatibility with previous GPU metrics work + */ +// log current gpu_metrics file content read +// any metrics value can be a nullptr +rsmi_status_t +rsmi_dev_gpu_metrics_info_get(uint32_t dv_ind, rsmi_gpu_metrics_t* smu) { + TRY + DEVICE_MUTEX + CHK_SUPPORT_NAME_ONLY(smu) + + auto status_code(rsmi_status_t::RSMI_STATUS_SUCCESS); + std::ostringstream ostrstream; + ostrstream << __PRETTY_FUNCTION__ << "| ======= start ======="; + LOG_TRACE(ostrstream); + + assert(smu != nullptr); + if (smu == nullptr) { + status_code = rsmi_status_t::RSMI_STATUS_INVALID_ARGS; + return status_code; + } + + dev->dev_log_gpu_metrics(ostrstream); + const auto [error_code, external_metrics] = dev->dev_copy_internal_to_external_metrics(); + if (error_code != rsmi_status_t::RSMI_STATUS_SUCCESS) { + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Fail " + << " | Device #: " << dv_ind + << " | Returning = " + << getRSMIStatusString(error_code) + << " |"; + LOG_ERROR(ostrstream); + return error_code; + } + + *smu = external_metrics; + ostrstream << __PRETTY_FUNCTION__ + << " | ======= end ======= " + << " | Success " + << " | Device #: " << dv_ind + << " | Returning = " + << getRSMIStatusString(status_code) + << " |"; + LOG_TRACE(ostrstream); + + return status_code; + CATCH +} + diff --git a/rocm_smi/src/rocm_smi_main.cc b/rocm_smi/src/rocm_smi_main.cc index 98fae2a663..7365fe9cfc 100755 --- a/rocm_smi/src/rocm_smi_main.cc +++ b/rocm_smi/src/rocm_smi_main.cc @@ -154,6 +154,8 @@ amd::smi::RocmSMI::devInfoTypesStrings = { {amd::smi::kDevMemPageBad, amdSMI + "kDevMemPageBad"}, {amd::smi::kDevNumaNode, amdSMI + "kDevNumaNode"}, {amd::smi::kDevGpuMetrics, amdSMI + "kDevGpuMetrics"}, + {amd::smi::kDevPmMetrics, amdSMI + "kDevPmMetrics"}, + {amd::smi::kDevRegMetrics, amdSMI + "kDevRegMetrics"}, {amd::smi::kDevGpuReset, amdSMI + "kDevGpuReset"}, {amd::smi::kDevAvailableComputePartition, amdSMI + "kDevAvailableComputePartition"}, diff --git a/src/amd_smi/amd_smi.cc b/src/amd_smi/amd_smi.cc index 1153416c66..f92e28c224 100644 --- a/src/amd_smi/amd_smi.cc +++ b/src/amd_smi/amd_smi.cc @@ -1019,7 +1019,7 @@ amdsmi_is_P2P_accessible(amdsmi_processor_handle processor_handle_src, // Compute Partition functions amdsmi_status_t -amdsmi_dev_compute_partition_get(amdsmi_processor_handle processor_handle, +amdsmi_get_gpu_compute_partition(amdsmi_processor_handle processor_handle, char *compute_partition, uint32_t len) { AMDSMI_CHECK_INIT(); return rsmi_wrapper(rsmi_dev_compute_partition_get, processor_handle, @@ -1027,7 +1027,7 @@ amdsmi_dev_compute_partition_get(amdsmi_processor_handle processor_handle, } amdsmi_status_t -amdsmi_dev_compute_partition_set(amdsmi_processor_handle processor_handle, +amdsmi_set_gpu_compute_partition(amdsmi_processor_handle processor_handle, amdsmi_compute_partition_type_t compute_partition) { AMDSMI_CHECK_INIT(); return rsmi_wrapper(rsmi_dev_compute_partition_set, processor_handle, @@ -1035,14 +1035,14 @@ amdsmi_dev_compute_partition_set(amdsmi_processor_handle processor_handle, } amdsmi_status_t -amdsmi_dev_compute_partition_reset(amdsmi_processor_handle processor_handle) { +amdsmi_reset_gpu_compute_partition(amdsmi_processor_handle processor_handle) { AMDSMI_CHECK_INIT(); return rsmi_wrapper(rsmi_dev_compute_partition_reset, processor_handle); } // Memory Partition functions amdsmi_status_t -amdsmi_dev_memory_partition_get(amdsmi_processor_handle processor_handle, +amdsmi_get_gpu_memory_partition(amdsmi_processor_handle processor_handle, char *memory_partition, uint32_t len) { AMDSMI_CHECK_INIT(); return rsmi_wrapper(rsmi_dev_memory_partition_get, processor_handle, @@ -1050,7 +1050,7 @@ amdsmi_dev_memory_partition_get(amdsmi_processor_handle processor_handle, } amdsmi_status_t -amdsmi_dev_memory_partition_set(amdsmi_processor_handle processor_handle, +amdsmi_set_gpu_memory_partition(amdsmi_processor_handle processor_handle, amdsmi_memory_partition_type_t memory_partition) { AMDSMI_CHECK_INIT(); return rsmi_wrapper(rsmi_dev_memory_partition_set, processor_handle, @@ -1058,7 +1058,7 @@ amdsmi_dev_memory_partition_set(amdsmi_processor_handle processor_handle, } amdsmi_status_t -amdsmi_dev_memory_partition_reset(amdsmi_processor_handle processor_handle) { +amdsmi_reset_gpu_memory_partition(amdsmi_processor_handle processor_handle) { AMDSMI_CHECK_INIT(); return rsmi_wrapper(rsmi_dev_memory_partition_reset, processor_handle); } @@ -1157,6 +1157,31 @@ amdsmi_status_t amdsmi_get_gpu_metrics_info( reinterpret_cast(pgpu_metrics)); } + +amdsmi_status_t amdsmi_get_gpu_pm_metrics_info( + amdsmi_processor_handle processor_handle, + amdsmi_name_value_t** pm_metrics, + uint32_t *num_of_metrics) { + AMDSMI_CHECK_INIT(); + + return rsmi_wrapper(rsmi_dev_pm_metrics_info_get, processor_handle, + reinterpret_cast(pm_metrics), + num_of_metrics); +} + +amdsmi_status_t amdsmi_get_gpu_reg_table_info( + amdsmi_processor_handle processor_handle, + amdsmi_reg_type_t reg_type, + amdsmi_name_value_t** reg_metrics, + uint32_t *num_of_metrics) { + AMDSMI_CHECK_INIT(); + + return rsmi_wrapper(rsmi_dev_reg_table_info_get, processor_handle, + static_cast(reg_type), + reinterpret_cast(reg_metrics), + num_of_metrics); +} + amdsmi_status_t amdsmi_get_power_cap_info(amdsmi_processor_handle processor_handle, uint32_t sensor_ind, @@ -1834,22 +1859,21 @@ amdsmi_get_power_info(amdsmi_processor_handle processor_handle, amdsmi_power_inf if (status != AMDSMI_STATUS_SUCCESS) return status; - info->average_socket_power = 0xFFFFFFFF; - info->gfx_voltage = 0xFFFFFFFF; - info->soc_voltage = 0xFFFFFFFF; // Not implmented yet - info->mem_voltage = 0xFFFFFFFF; // Not implmented yet - info->power_limit = 0xFFFFFFFF; + info->current_socket_power = 0xFFFF; + info->average_socket_power = 0xFFFF; + info->gfx_voltage = 0xFFFF; + info->soc_voltage = 0xFFFF; + info->mem_voltage = 0xFFFF; + info->power_limit = 0xFFFF; amdsmi_gpu_metrics_t metrics = {}; status = amdsmi_get_gpu_metrics_info(processor_handle, &metrics); if (status == AMDSMI_STATUS_SUCCESS) { + info->current_socket_power = metrics.current_socket_power; info->average_socket_power = metrics.average_socket_power; - } - - int64_t voltage_read = 0; - status = amdsmi_get_gpu_volt_metric(processor_handle, AMDSMI_VOLT_TYPE_VDDGFX, AMDSMI_VOLT_CURRENT, &voltage_read); - if (status == AMDSMI_STATUS_SUCCESS) { - info->gfx_voltage = voltage_read; + info->gfx_voltage = metrics.voltage_gfx; + info->soc_voltage = metrics.voltage_soc; + info->mem_voltage = metrics.voltage_mem; } int power_limit = 0; @@ -2130,6 +2154,589 @@ amdsmi_status_t amdsmi_get_processor_handle_from_bdf(amdsmi_bdf_t bdf, return AMDSMI_STATUS_API_FAILED; } +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_hotspot(amdsmi_processor_handle processor_handle, + uint16_t *hotspot_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_temp_hotspot_get, processor_handle, + hotspot_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_mem(amdsmi_processor_handle processor_handle, + uint16_t *mem_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_temp_mem_get, processor_handle, + mem_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_vrsoc(amdsmi_processor_handle processor_handle, + uint16_t *vrsoc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_temp_vrsoc_get, processor_handle, + vrsoc_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_socket_power(amdsmi_processor_handle processor_handle, + uint16_t *socket_power_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_curr_socket_power_get, processor_handle, + socket_power_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_gfx_activity(amdsmi_processor_handle processor_handle, + uint16_t *gfx_activity_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_gfx_activity_get, processor_handle, + gfx_activity_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_umc_activity(amdsmi_processor_handle processor_handle, + uint16_t *umc_activity_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_umc_activity_get, processor_handle, + umc_activity_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_energy_acc(amdsmi_processor_handle processor_handle, + uint64_t *energy_acc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_energy_acc_get, processor_handle, + energy_acc_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_system_clock_counter(amdsmi_processor_handle processor_handle, + uint64_t *system_clock_counter_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_system_clock_counter_get, processor_handle, + system_clock_counter_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_firmware_timestamp(amdsmi_processor_handle processor_handle, + uint64_t *firmware_timestamp_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_firmware_timestamp_get, processor_handle, + firmware_timestamp_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_throttle_status(amdsmi_processor_handle processor_handle, + uint32_t *throttle_status_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_throttle_status_get, processor_handle, + throttle_status_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_link_width(amdsmi_processor_handle processor_handle, + uint16_t *pcie_link_width_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_pcie_link_width_get, processor_handle, + pcie_link_width_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_link_speed(amdsmi_processor_handle processor_handle, + uint16_t *pcie_link_speed_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_pcie_link_speed_get, processor_handle, + pcie_link_speed_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_link_width(amdsmi_processor_handle processor_handle, + uint16_t *xgmi_link_width_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_xgmi_link_width_get, processor_handle, + xgmi_link_width_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_link_speed(amdsmi_processor_handle processor_handle, + uint16_t *xgmi_link_speed_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_xgmi_link_speed_get, processor_handle, + xgmi_link_speed_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_gfxclk_lock_status(amdsmi_processor_handle processor_handle, + uint32_t *gfxclk_lock_status_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_gfxclk_lock_status_get, processor_handle, + gfxclk_lock_status_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_gfx_activity_acc(amdsmi_processor_handle processor_handle, + uint32_t *gfx_activity_acc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_gfx_activity_acc_get, processor_handle, + gfx_activity_acc_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_mem_activity_acc(amdsmi_processor_handle processor_handle, + uint32_t *mem_activity_acc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_mem_activity_acc_get, processor_handle, + mem_activity_acc_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_bandwidth_acc(amdsmi_processor_handle processor_handle, + uint64_t *pcie_bandwidth_acc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_pcie_bandwidth_acc_get, processor_handle, + pcie_bandwidth_acc_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_bandwidth_inst(amdsmi_processor_handle processor_handle, + uint64_t *pcie_bandwidth_inst_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_pcie_bandwidth_inst_get, processor_handle, + pcie_bandwidth_inst_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc(amdsmi_processor_handle processor_handle, + uint64_t *pcie_count_acc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_pcie_l0_recov_count_acc_get, processor_handle, + pcie_count_acc_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_replay_count_acc(amdsmi_processor_handle processor_handle, + uint64_t *pcie_count_acc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_pcie_replay_count_acc_get, processor_handle, + pcie_count_acc_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc(amdsmi_processor_handle processor_handle, + uint64_t *pcie_count_acc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_pcie_replay_rover_count_acc_get, processor_handle, + pcie_count_acc_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_uclk(amdsmi_processor_handle processor_handle, + uint16_t *uclk_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_curr_uclk_get, processor_handle, + uclk_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_hbm(amdsmi_processor_handle processor_handle, + gpu_metric_temp_hbm_t *temp_hbm_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_temp_hbm_get, processor_handle, + reinterpret_cast(temp_hbm_value)); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_vcn_activity(amdsmi_processor_handle processor_handle, + gpu_metric_vcn_activity_t *vcn_activity_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_vcn_activity_get, processor_handle, + reinterpret_cast(vcn_activity_value)); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_read_data(amdsmi_processor_handle processor_handle, + gpu_metric_xgmi_read_data_acc_t *xgmi_read_data_acc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_xgmi_read_data_get, processor_handle, + reinterpret_cast(xgmi_read_data_acc_value)); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_xgmi_write_data(amdsmi_processor_handle processor_handle, + gpu_metric_xgmi_write_data_acc_t *xgmi_write_data_acc_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_xgmi_write_data_get, processor_handle, + reinterpret_cast(xgmi_write_data_acc_value)); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_gfxclk(amdsmi_processor_handle processor_handle, + gpu_metric_curr_gfxclk_t *curr_gfxclk_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_curr_gfxclk_get, processor_handle, + reinterpret_cast(curr_gfxclk_value)); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_socclk(amdsmi_processor_handle processor_handle, + gpu_metric_curr_socclk_t *current_socclk_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_curr_socclk_get, processor_handle, + reinterpret_cast(current_socclk_value)); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_vclk0(amdsmi_processor_handle processor_handle, + gpu_metric_curr_vclk0_t *current_vclk_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_curr_vclk0_get, processor_handle, + reinterpret_cast(current_vclk_value)); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_dclk0(amdsmi_processor_handle processor_handle, + gpu_metric_curr_dclk0_t *current_dclk_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_curr_dclk0_get, processor_handle, + reinterpret_cast(current_dclk_value)); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_edge(amdsmi_processor_handle processor_handle, + uint16_t *edge_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_temp_edge_get, processor_handle, + edge_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_vrgfx(amdsmi_processor_handle processor_handle, + uint16_t *vrgfx_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_temp_vrgfx_get, processor_handle, + vrgfx_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_temp_vrmem(amdsmi_processor_handle processor_handle, + uint16_t *vrmem_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_temp_vrmem_get, processor_handle, + vrmem_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_mm_activity(amdsmi_processor_handle processor_handle, + uint16_t *mm_activity_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_mm_activity_get, processor_handle, + mm_activity_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_vclk1(amdsmi_processor_handle processor_handle, + uint16_t *current_vclk_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_curr_vclk1_get, processor_handle, + current_vclk_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_dclk1(amdsmi_processor_handle processor_handle, + uint16_t *current_dclk_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_curr_dclk1_get, processor_handle, + current_dclk_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_indep_throttle_status(amdsmi_processor_handle processor_handle, + uint64_t *throttle_status_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_indep_throttle_status_get, processor_handle, + throttle_status_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_socket_power(amdsmi_processor_handle processor_handle, + uint16_t *socket_power_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_socket_power_get, processor_handle, + socket_power_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_curr_fan_speed(amdsmi_processor_handle processor_handle, + uint16_t *fan_speed_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_curr_fan_speed_get, processor_handle, + fan_speed_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_gfx_clock_frequency(amdsmi_processor_handle processor_handle, + uint16_t *clock_frequency_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_gfx_clock_frequency_get, processor_handle, + clock_frequency_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_soc_clock_frequency(amdsmi_processor_handle processor_handle, + uint16_t *clock_frequency_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_soc_clock_frequency_get, processor_handle, + clock_frequency_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_uclock_frequency(amdsmi_processor_handle processor_handle, + uint16_t *clock_frequency_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_uclock_frequency_get, processor_handle, + clock_frequency_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_vclock0_frequency(amdsmi_processor_handle processor_handle, + uint16_t *clock_frequency_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_vclock0_frequency_get, processor_handle, + clock_frequency_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_dclock0_frequency(amdsmi_processor_handle processor_handle, + uint16_t *clock_frequency_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_dclock0_frequency_get, processor_handle, + clock_frequency_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_vclock1_frequency(amdsmi_processor_handle processor_handle, + uint16_t *clock_frequency_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_vclock1_frequency_get, processor_handle, + clock_frequency_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_avg_dclock1_frequency(amdsmi_processor_handle processor_handle, + uint16_t *clock_frequency_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_avg_dclock1_frequency_get, processor_handle, + clock_frequency_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_volt_soc(amdsmi_processor_handle processor_handle, + uint16_t *voltage_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_volt_soc_get, processor_handle, + voltage_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_volt_gfx(amdsmi_processor_handle processor_handle, + uint16_t *voltage_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_volt_gfx_get, processor_handle, + voltage_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_volt_mem(amdsmi_processor_handle processor_handle, + uint16_t *voltage_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_volt_mem_get, processor_handle, + voltage_value); +} + + +amdsmi_status_t +amdsmi_get_gpu_metrics_header_info(amdsmi_processor_handle processor_handle, + amd_metrics_table_header_t *header_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_header_info_get, processor_handle, + reinterpret_cast(header_value)); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_xcd_counter(amdsmi_processor_handle processor_handle, + uint16_t *xcd_counter_value) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_xcd_counter_get, processor_handle, + xcd_counter_value); +} + +amdsmi_status_t +amdsmi_get_gpu_metrics_log(amdsmi_processor_handle processor_handle) +{ + AMDSMI_CHECK_INIT(); + // nullptr api supported + + return rsmi_wrapper(rsmi_dev_metrics_log_get, processor_handle); +} + + #ifdef ENABLE_ESMI_LIB amdsmi_status_t amdsmi_get_cpu_hsmp_proto_ver(amdsmi_cpusocket_handle socket_handle, uint32_t *proto_ver) diff --git a/tests/amd_smi_test/functional/gpu_metrics_read.cc b/tests/amd_smi_test/functional/gpu_metrics_read.cc index a5e69fdedd..571bb30585 100644 --- a/tests/amd_smi_test/functional/gpu_metrics_read.cc +++ b/tests/amd_smi_test/functional/gpu_metrics_read.cc @@ -100,7 +100,7 @@ void TestGpuMetricsRead::Run(void) { PrintDeviceHeader(processor_handles_[i]); IF_VERB(STANDARD) { - std::cout << "\t**GPU METRICS:\n"; + std::cout << "\t**GPU METRICS: Using static struct (Backwards Compatibility):\n"; } amdsmi_gpu_metrics_t smu; err = amdsmi_get_gpu_metrics_info(processor_handles_[i], &smu); @@ -191,4 +191,381 @@ void TestGpuMetricsRead::Run(void) { err = amdsmi_get_gpu_metrics_info(processor_handles_[i], nullptr); ASSERT_EQ(err, AMDSMI_STATUS_INVAL); } + + + // + auto val_ui16 = uint16_t(0); + auto val_ui32 = uint32_t(0); + auto val_ui64 = uint64_t(0); + auto status_code(amdsmi_status_t::AMDSMI_STATUS_SUCCESS); + for (uint32_t i = 0; i < num_monitor_devs(); ++i) { + PrintDeviceHeader(processor_handles_[i]); + + auto temp_edge_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_temp_edge(processor_handles_[i], &temp_edge_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_hotspot_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_temp_hotspot(processor_handles_[i], &temp_hotspot_value); + CHK_ERR_ASRT(status_code); + + auto temp_mem_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_temp_mem(processor_handles_[i], &temp_mem_value); + CHK_ERR_ASRT(status_code); + + auto temp_vrgfx_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_temp_vrgfx(processor_handles_[i], &temp_vrgfx_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_vrsoc_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_temp_vrsoc(processor_handles_[i], &temp_vrsoc_value); + CHK_ERR_ASRT(status_code); + + auto temp_vrmem_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_temp_vrmem(processor_handles_[i], &temp_vrmem_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + gpu_metric_temp_hbm_t temp_hbm_values; + status_code = amdsmi_get_gpu_metrics_temp_hbm(processor_handles_[i], &temp_hbm_values); + CHK_ERR_ASRT(status_code); + + auto temp_curr_socket_power_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_curr_socket_power(processor_handles_[i], &temp_curr_socket_power_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_energy_accum_value = val_ui64; + status_code = amdsmi_get_gpu_metrics_energy_acc(processor_handles_[i], &temp_energy_accum_value); + CHK_ERR_ASRT(status_code); + + auto temp_avg_socket_power_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_socket_power(processor_handles_[i], &temp_avg_socket_power_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_avg_gfx_activity_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_gfx_activity(processor_handles_[i], &temp_avg_gfx_activity_value); + CHK_ERR_ASRT(status_code); + + auto temp_avg_umc_activity_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_umc_activity(processor_handles_[i], &temp_avg_umc_activity_value); + CHK_ERR_ASRT(status_code); + + auto temp_avg_mm_activity_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_mm_activity(processor_handles_[i], &temp_avg_mm_activity_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + gpu_metric_vcn_activity_t temp_vcn_values; + status_code = amdsmi_get_gpu_metrics_vcn_activity(processor_handles_[i], &temp_vcn_values); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_mem_activity_accum_value = val_ui32; + status_code = amdsmi_get_gpu_metrics_mem_activity_acc(processor_handles_[i], &temp_mem_activity_accum_value); + CHK_ERR_ASRT(status_code); + + auto temp_gfx_activity_accum_value = val_ui32; + status_code = amdsmi_get_gpu_metrics_gfx_activity_acc(processor_handles_[i], &temp_gfx_activity_accum_value); + CHK_ERR_ASRT(status_code); + + auto temp_avg_gfx_clock_freq_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_gfx_clock_frequency(processor_handles_[i], &temp_avg_gfx_clock_freq_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_avg_soc_clock_freq_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_soc_clock_frequency(processor_handles_[i], &temp_avg_soc_clock_freq_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_avg_uclock_freq_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_uclock_frequency(processor_handles_[i], &temp_avg_uclock_freq_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_avg_vclock0_freq_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_vclock0_frequency(processor_handles_[i], &temp_avg_vclock0_freq_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_avg_dclock0_freq_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_dclock0_frequency(processor_handles_[i], &temp_avg_dclock0_freq_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_avg_vclock1_freq_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_vclock1_frequency(processor_handles_[i], &temp_avg_vclock1_freq_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_avg_dclock1_freq_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_avg_dclock1_frequency(processor_handles_[i], &temp_avg_dclock1_freq_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_curr_vclk1_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_curr_vclk1(processor_handles_[i], &temp_curr_vclk1_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_curr_dclk1_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_curr_dclk1(processor_handles_[i], &temp_curr_dclk1_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_curr_uclk_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_curr_uclk(processor_handles_[i], &temp_curr_uclk_value); + CHK_ERR_ASRT(status_code); + + gpu_metric_curr_dclk0_t temp_curr_dclk0_values; + status_code = amdsmi_get_gpu_metrics_curr_dclk0(processor_handles_[i], &temp_curr_dclk0_values); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + gpu_metric_curr_gfxclk_t temp_curr_gfxclk_values; + status_code = amdsmi_get_gpu_metrics_curr_gfxclk(processor_handles_[i], &temp_curr_gfxclk_values); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + gpu_metric_curr_socclk_t temp_curr_socclk_values; + status_code = amdsmi_get_gpu_metrics_curr_socclk(processor_handles_[i], &temp_curr_socclk_values); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + gpu_metric_curr_vclk0_t temp_curr_vclk0_values; + status_code = amdsmi_get_gpu_metrics_curr_vclk0(processor_handles_[i], &temp_curr_vclk0_values); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_indep_throttle_status_value = val_ui64; + status_code = amdsmi_get_gpu_metrics_indep_throttle_status(processor_handles_[i], &temp_indep_throttle_status_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_throttle_status_value = val_ui32; + status_code = amdsmi_get_gpu_metrics_throttle_status(processor_handles_[i], &temp_throttle_status_value); + CHK_ERR_ASRT(status_code); + + auto temp_gfxclk_lock_status_value = val_ui32; + status_code = amdsmi_get_gpu_metrics_gfxclk_lock_status(processor_handles_[i], &temp_gfxclk_lock_status_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_curr_fan_speed_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_curr_fan_speed(processor_handles_[i], &temp_curr_fan_speed_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_pcie_link_width_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_pcie_link_width(processor_handles_[i], &temp_pcie_link_width_value); + CHK_ERR_ASRT(status_code); + + auto temp_pcie_link_speed_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_pcie_link_speed(processor_handles_[i], &temp_pcie_link_speed_value); + CHK_ERR_ASRT(status_code); + + auto temp_pcie_bandwidth_accum_value = val_ui64; + status_code = amdsmi_get_gpu_metrics_pcie_bandwidth_acc(processor_handles_[i], &temp_pcie_bandwidth_accum_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_pcie_bandwidth_inst_value = val_ui64; + status_code = amdsmi_get_gpu_metrics_pcie_bandwidth_inst(processor_handles_[i], &temp_pcie_bandwidth_inst_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_pcie_l0_recov_count_accum_value = val_ui64; + status_code = amdsmi_get_gpu_metrics_pcie_l0_recov_count_acc(processor_handles_[i], &temp_pcie_l0_recov_count_accum_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_pcie_replay_count_accum_value = val_ui64; + status_code = amdsmi_get_gpu_metrics_pcie_replay_count_acc(processor_handles_[i], &temp_pcie_replay_count_accum_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_pcie_replay_rover_count_accum_value = val_ui64; + status_code = amdsmi_get_gpu_metrics_pcie_replay_rover_count_acc(processor_handles_[i], &temp_pcie_replay_rover_count_accum_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_xgmi_link_width_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_xgmi_link_width(processor_handles_[i], &temp_xgmi_link_width_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_xgmi_link_speed_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_xgmi_link_speed(processor_handles_[i], &temp_xgmi_link_speed_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + gpu_metric_xgmi_read_data_acc_t temp_xgmi_read_values; + status_code = amdsmi_get_gpu_metrics_xgmi_read_data(processor_handles_[i], &temp_xgmi_read_values); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + gpu_metric_xgmi_write_data_acc_t temp_xgmi_write_values; + status_code = amdsmi_get_gpu_metrics_xgmi_write_data(processor_handles_[i], &temp_xgmi_write_values); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_voltage_soc_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_volt_soc(processor_handles_[i], &temp_voltage_soc_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_voltage_gfx_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_volt_gfx(processor_handles_[i], &temp_voltage_gfx_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_voltage_mem_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_volt_mem(processor_handles_[i], &temp_voltage_mem_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + auto temp_system_clock_counter_value = val_ui64; + status_code = amdsmi_get_gpu_metrics_system_clock_counter(processor_handles_[i], &temp_system_clock_counter_value); + CHK_ERR_ASRT(status_code); + + auto temp_firmware_timestamp_value = val_ui64; + status_code = amdsmi_get_gpu_metrics_firmware_timestamp(processor_handles_[i], &temp_firmware_timestamp_value); + CHK_ERR_ASRT(status_code); + + auto temp_xcd_counter_value = val_ui16; + status_code = amdsmi_get_gpu_metrics_xcd_counter(processor_handles_[i], &temp_xcd_counter_value); + if (status_code != AMDSMI_STATUS_NOT_SUPPORTED) { + CHK_ERR_ASRT(status_code); + } + + IF_VERB(STANDARD) { + std::cout << "\n"; + std::cout << "\t[Temperature]" << "\n"; + std::cout << "\t -> temp_edge(): " << temp_edge_value << "\n"; + std::cout << "\t -> temp_hotspot(): " << temp_hotspot_value << "\n"; + std::cout << "\t -> temp_mem(): " << temp_mem_value << "\n"; + std::cout << "\t -> temp_vrgfx(): " << temp_vrgfx_value << "\n"; + std::cout << "\t -> temp_vrsoc(): " << temp_vrsoc_value << "\n"; + std::cout << "\t -> temp_vrmem(): " << temp_vrmem_value << "\n"; + std::cout << "\t -> temp_hbm(): " << temp_hbm_values << "\n"; + + std::cout << "\n"; + std::cout << "\t[Power/Energy]" << "\n"; + std::cout << "\t -> current_socket_power(): " << temp_curr_socket_power_value << "\n"; + std::cout << "\t -> energy_accum(): " << temp_energy_accum_value << "\n"; + std::cout << "\t -> average_socket_power(): " << temp_avg_socket_power_value << "\n"; + + std::cout << "\n"; + std::cout << "\t[Utilization]" << "\n"; + std::cout << "\t -> average_gfx_activity(): " << temp_avg_gfx_activity_value << "\n"; + std::cout << "\t -> average_umc_activity(): " << temp_avg_umc_activity_value << "\n"; + std::cout << "\t -> average_mm_activity(): " << temp_avg_mm_activity_value << "\n"; + std::cout << "\t -> vcn_activity(): " << temp_vcn_values << "\n"; + std::cout << "\t -> mem_activity_accum(): " << temp_mem_activity_accum_value << "\n"; + std::cout << "\t -> gfx_activity_accum(): " << temp_gfx_activity_accum_value << "\n"; + + std::cout << "\n"; + std::cout << "\t[Average Clock]" << "\n"; + std::cout << "\t -> average_gfx_clock_frequency(): " << temp_avg_gfx_clock_freq_value << "\n"; + std::cout << "\t -> average_soc_clock_frequency(): " << temp_avg_soc_clock_freq_value << "\n"; + std::cout << "\t -> average_uclock_frequency(): " << temp_avg_uclock_freq_value << "\n"; + std::cout << "\t -> average_vclock0_frequency(): " << temp_avg_vclock0_freq_value << "\n"; + std::cout << "\t -> average_dclock0_frequency(): " << temp_avg_dclock0_freq_value << "\n"; + std::cout << "\t -> average_vclock1_frequency(): " << temp_avg_vclock1_freq_value << "\n"; + std::cout << "\t -> average_dclock1_frequency(): " << temp_avg_dclock1_freq_value << "\n"; + + std::cout << "\n"; + std::cout << "\t[Current Clock]" << "\n"; + std::cout << "\t -> current_vclock1(): " << temp_curr_vclk1_value << "\n"; + std::cout << "\t -> current_dclock1(): " << temp_curr_dclk1_value << "\n"; + std::cout << "\t -> current_uclock(): " << temp_curr_uclk_value << "\n"; + std::cout << "\t -> current_dclk0(): " << temp_curr_dclk0_values << "\n"; + std::cout << "\t -> current_gfxclk(): " << temp_curr_gfxclk_values << "\n"; + std::cout << "\t -> current_soc_clock(): " << temp_curr_socclk_values << "\n"; + std::cout << "\t -> current_vclk0(): " << temp_curr_vclk0_values << "\n"; + + std::cout << "\n"; + std::cout << "\t[Throttle]" << "\n"; + std::cout << "\t -> indep_throttle_status(): " << temp_indep_throttle_status_value << "\n"; + std::cout << "\t -> throttle_status(): " << temp_throttle_status_value << "\n"; + + std::cout << "\n"; + std::cout << "\t[Gfx Clock Lock]" << "\n"; + std::cout << "\t -> gfxclk_lock_status(): " << temp_gfxclk_lock_status_value << "\n"; + + std::cout << "\n"; + std::cout << "\t[Current Fan Speed]" << "\n"; + std::cout << "\t -> current_fan_speed(): " << temp_curr_fan_speed_value << "\n"; + + std::cout << "\n"; + std::cout << "\t[Link/Bandwidth/Speed]" << "\n"; + std::cout << "\t -> pcie_link_width(): " << temp_pcie_link_width_value << "\n"; + std::cout << "\t -> pcie_link_speed(): " << temp_pcie_link_speed_value << "\n"; + std::cout << "\t -> pcie_bandwidth_accum(): " << temp_pcie_bandwidth_accum_value << "\n"; + std::cout << "\t -> pcie_bandwidth_inst(): " << temp_pcie_bandwidth_inst_value << "\n"; + std::cout << "\t -> pcie_l0_recov_count_accum(): " << temp_pcie_l0_recov_count_accum_value << "\n"; + std::cout << "\t -> pcie_replay_count_accum(): " << temp_pcie_replay_count_accum_value << "\n"; + std::cout << "\t -> pcie_replay_rollover_count_accum(): " << temp_pcie_replay_rover_count_accum_value << "\n"; + std::cout << "\t -> xgmi_link_width(): " << temp_xgmi_link_width_value << "\n"; + std::cout << "\t -> xgmi_link_speed(): " << temp_xgmi_link_speed_value << "\n"; + std::cout << "\t -> xgmi_read_data(): " << temp_xgmi_read_values << "\n"; + std::cout << "\t -> xgmi_write_data(): " << temp_xgmi_write_values << "\n"; + + std::cout << "\n"; + std::cout << "\t[Voltage]" << "\n"; + std::cout << "\t -> voltage_soc(): " << temp_voltage_soc_value << "\n"; + std::cout << "\t -> voltage_gfx(): " << temp_voltage_gfx_value << "\n"; + std::cout << "\t -> voltage_mem(): " << temp_voltage_mem_value << "\n"; + + std::cout << "\n"; + std::cout << "\t[Timestamp]" << "\n"; + std::cout << "\t -> system_clock_counter(): " << temp_system_clock_counter_value << "\n"; + std::cout << "\t -> firmware_timestamp(): " << temp_firmware_timestamp_value << "\n"; + + std::cout << "\n"; + std::cout << "\t[XCD CounterVoltage]" << "\n"; + std::cout << "\t -> xcd_counter(): " << temp_xcd_counter_value << "\n"; + std::cout << "\n\n"; + } + } + } diff --git a/tests/amd_smi_test/functional/temp_read.cc b/tests/amd_smi_test/functional/temp_read.cc index ded598910a..fea3b4e5d0 100755 --- a/tests/amd_smi_test/functional/temp_read.cc +++ b/tests/amd_smi_test/functional/temp_read.cc @@ -108,7 +108,7 @@ void TestTempRead::Run(void) { return; } - uint32_t type; + uint32_t type(0); for (uint32_t x = 0; x < num_iterations(); ++x) { for (uint32_t i = 0; i < num_monitor_devs(); ++i) { PrintDeviceHeader(processor_handles_[i]);