From ed8f865341da542d46a8d4166f7a6db7675cb5c0 Mon Sep 17 00:00:00 2001 From: Dalibor Stanisavljevic Date: Thu, 19 Jan 2023 15:33:01 +0100 Subject: [PATCH] Revert "Adjusted folder naming and moved amdsmi_cli into amdsmi project folder" This reverts commit 3eadf3a2163604dab63db235dc5d64033f7e7d6e because build failed Change-Id: Id9efa22f3e1167e1b1bb235b449aef60256c0e24 Signed-off-by: Dalibor Stanisavljevic --- .gitignore | 5 - CMakeLists.txt | 4 +- {amdsmi/amdsmi_cli => amd_smi_cli}/BDF.py | 0 {amdsmi => amd_smi_cli}/_version.py | 0 .../amdsmi.py => amd_smi_cli/amd_smi.py | 5 +- .../amd_smi_commands.py | 14 ++- .../amd_smi_helpers.py | 2 +- .../amd_smi_init.py | 29 ++++-- .../amd_smi_logger.py | 0 amd_smi_cli/amd_smi_modules.py | 97 +++++++++++++++++++ .../amd_smi_parser.py | 4 +- .../amdsmiBindings.py | 0 amdsmi/setup.py | 21 ---- {amdsmi => py-interface}/README.md | 0 {amdsmi => py-interface}/__init__.py | 3 +- {amdsmi => py-interface}/amdsmi_exception.py | 2 +- {amdsmi => py-interface}/amdsmi_interface.py | 19 ++-- {amdsmi => py-interface}/amdsmi_wrapper.py | 7 +- {amdsmi => py-interface}/rocm_smi_tool.py | 0 py-interface/setup.py | 16 +++ 20 files changed, 163 insertions(+), 65 deletions(-) rename {amdsmi/amdsmi_cli => amd_smi_cli}/BDF.py (100%) rename {amdsmi => amd_smi_cli}/_version.py (100%) rename amdsmi/amdsmi_cli/amdsmi.py => amd_smi_cli/amd_smi.py (93%) mode change 100755 => 100644 rename amdsmi/amdsmi_cli/amdsmi_commands.py => amd_smi_cli/amd_smi_commands.py (77%) rename amdsmi/amdsmi_cli/amdsmi_helpers.py => amd_smi_cli/amd_smi_helpers.py (99%) rename amdsmi/amdsmi_cli/amdsmi_init.py => amd_smi_cli/amd_smi_init.py (55%) rename amdsmi/amdsmi_cli/amdsmi_logger.py => amd_smi_cli/amd_smi_logger.py (100%) create mode 100644 amd_smi_cli/amd_smi_modules.py rename amdsmi/amdsmi_cli/amdsmi_parser.py => amd_smi_cli/amd_smi_parser.py (99%) rename {amdsmi/amdsmi_cli => amd_smi_cli}/amdsmiBindings.py (100%) delete mode 100644 amdsmi/setup.py rename {amdsmi => py-interface}/README.md (100%) rename {amdsmi => py-interface}/__init__.py (99%) rename {amdsmi => py-interface}/amdsmi_exception.py (99%) rename {amdsmi => py-interface}/amdsmi_interface.py (99%) rename {amdsmi => py-interface}/amdsmi_wrapper.py (99%) rename {amdsmi => py-interface}/rocm_smi_tool.py (100%) create mode 100644 py-interface/setup.py diff --git a/.gitignore b/.gitignore index 5b157b6f4b..d87e07ee63 100644 --- a/.gitignore +++ b/.gitignore @@ -12,8 +12,3 @@ DEBIAN/postinst DEBIAN/prerm RPM/ docs/*.pdf - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*.egg-* diff --git a/CMakeLists.txt b/CMakeLists.txt index e00040d309..31aa11d5dc 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -155,10 +155,10 @@ if(PYTHON3 AND PIP3) python3 ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/generator.py -o ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/amdsmi_wrapper.py -i ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/amdsmi.h -l ${CMAKE_CURRENT_BINARY_DIR}/src/libamd_smi.so COMMAND cp ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper/amdsmi_wrapper.py - ${CMAKE_CURRENT_SOURCE_DIR}/py_interface/ + ${CMAKE_CURRENT_SOURCE_DIR}/py-interface/ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/amdsmi_wrapper) - set(PY_INTERFACE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/py_interface") + set(PY_INTERFACE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/py-interface") set(PACKAGE_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/python_package/amdsmi") add_custom_target( diff --git a/amdsmi/amdsmi_cli/BDF.py b/amd_smi_cli/BDF.py similarity index 100% rename from amdsmi/amdsmi_cli/BDF.py rename to amd_smi_cli/BDF.py diff --git a/amdsmi/_version.py b/amd_smi_cli/_version.py similarity index 100% rename from amdsmi/_version.py rename to amd_smi_cli/_version.py diff --git a/amdsmi/amdsmi_cli/amdsmi.py b/amd_smi_cli/amd_smi.py old mode 100755 new mode 100644 similarity index 93% rename from amdsmi/amdsmi_cli/amdsmi.py rename to amd_smi_cli/amd_smi.py index 9bc25f5fb9..88c9d9c3c3 --- a/amdsmi/amdsmi_cli/amdsmi.py +++ b/amd_smi_cli/amd_smi.py @@ -2,8 +2,9 @@ # from amd_smi_init import * -from amdsmi_commands import AMD_SMI_Commands -from amdsmi_parser import AMD_SMI_Parser +from amd_smi_commands import AMD_SMI_Commands +from amd_smi_parser import AMD_SMI_Parser + # sudo /src/out/ubuntu-20.04/20.04/bin/rocm-smi -bc --json | python -m json.tool diff --git a/amdsmi/amdsmi_cli/amdsmi_commands.py b/amd_smi_cli/amd_smi_commands.py similarity index 77% rename from amdsmi/amdsmi_cli/amdsmi_commands.py rename to amd_smi_cli/amd_smi_commands.py index a6a8cbc16e..e5ea6b8478 100644 --- a/amdsmi/amdsmi_cli/amdsmi_commands.py +++ b/amd_smi_cli/amd_smi_commands.py @@ -13,8 +13,9 @@ from pathlib import Path from BDF import BDF from _version import __version__ -from amdsmi_logger import AMD_SMI_Logger -from amdsmi_helpers import * +from amd_smi_logger import AMD_SMI_Logger + + class AMD_SMI_Commands(object): # def __init__(self, amd_smi_logger) -> None: @@ -29,10 +30,8 @@ class AMD_SMI_Commands(object): def version(self, args): kernel_version = 123 - amdsmi_lib_version = amdsmi_interface.amdsmi_get_version() - {'major': 1, 'minor': 0, 'patch': 0, 'build': '0'} - amdsmi_lib_version_str = f'{amdsmi_lib_version["major"]}.{amdsmi_lib_version["minor"]}.{amdsmi_lib_version["patch"]}' - print(f'AMD-SMI Tool: {__version__} | AMD-SMI Library version: {amdsmi_lib_version_str} | Kernel version: {kernel_version}') + print(f'AMD-SMI version: {__version__} | Kernel version: {kernel_version}') + def discovery(self, args): print('discovery test') @@ -47,8 +46,7 @@ class AMD_SMI_Commands(object): def firmware(self, args): - for elem in range(100000): - time.sleep(1) + print('firmware test') def bad_pages(self, args): diff --git a/amdsmi/amdsmi_cli/amdsmi_helpers.py b/amd_smi_cli/amd_smi_helpers.py similarity index 99% rename from amdsmi/amdsmi_cli/amdsmi_helpers.py rename to amd_smi_cli/amd_smi_helpers.py index 21c5f8104f..e23c792a19 100644 --- a/amdsmi/amdsmi_cli/amdsmi_helpers.py +++ b/amd_smi_cli/amd_smi_helpers.py @@ -12,7 +12,7 @@ import logging from pathlib import Path from BDF import BDF -from amdsmi_init import * +from amd_smi_init import * class AMD_SMI_Helpers(object): diff --git a/amdsmi/amdsmi_cli/amdsmi_init.py b/amd_smi_cli/amd_smi_init.py similarity index 55% rename from amdsmi/amdsmi_cli/amdsmi_init.py rename to amd_smi_cli/amd_smi_init.py index ef64e5a3cd..b6daa1abc0 100644 --- a/amdsmi/amdsmi_cli/amdsmi_init.py +++ b/amd_smi_cli/amd_smi_init.py @@ -11,8 +11,7 @@ import sys from pathlib import Path # Handle bindings for windows, Hyper-v and KVM seperately -import amdsmi_interface - +from amdsmiBindings import * # Using basic python logging for user errors and development # logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.DEBUG) # Logging for Development @@ -21,6 +20,11 @@ logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.ERROR) # # On initial import set initialized variable amd_smi_initialized = False +def check_return(return_code, error_statment): #@TODO would raising an exception be better? + if return_code != amdsmi_status.AMDSMI_STATUS_SUCCESS: + logging.error(error_statment) + sys.exit(return_code) + def check_amdgpu_driver(): #@TODO Handle KVM logic """ Returns true if amdgpu is found in the list of initialized modules """ @@ -33,20 +37,29 @@ def check_amdgpu_driver(): #@TODO Handle KVM logic return False -def init_amd_smi(flag=amdsmi_interface.AmdSmiInitFlags.AMD_GPUS): +def init_amd_smi(flag=amdsmi_init_flags.AMD_SMI_INIT_AMD_GPUS): """ Initializes AMD-SMI """ - # Check if amdgpu driver is up & Handle error gracefully + # Check if amdgpu driver is up if check_amdgpu_driver(): # Only init AMD GPUs for now, waiting for future support for AMD CPUs - amdsmi_interface.amdsmi_init(flag) - logging.info('amd-smi initialized successfully') # without errors really + init_status = amdsmi.amdsmi_init(flag) + check_return(return_code=init_status, error_statment=f'AMD SMI initialization returned {init_status} (the expected value is {amdsmi_status_t.AMDSMI_STATUS_SUCCESS})') + logging.info('amd-smi initialized successfully') else: logging.error('Driver not initialized (amdgpu not found in modules)') exit(-1) +def amdsmi_shut_down(): + """ Shutdown AMD-SMI """ + # Only init AMD GPUs for now, waiting for future support for AMD CPUs + shut_down_status = amdsmi.amdsmi_shut_down() + check_return(return_code=shut_down_status, error_statment=f'AMD SMI Shutdown code returned {shut_down_status} (the expected value is {amdsmi_status_t.AMDSMI_STATUS_SUCCESS})') + logging.debug('amd-smi shutdown successfully') + + def signal_handler(sig, frame): - logging.info(f'Handling signal: {sig}') + logging.debug(f'Handling signal: {sig}') sys.exit(0) @@ -55,4 +68,4 @@ if not amd_smi_initialized: amd_smi_initialized = True signal.signal(signal.SIGINT, signal_handler) signal.signal(signal.SIGTERM, signal_handler) - atexit.register(amdsmi_interface.amdsmi_shut_down) + atexit.register(amdsmi_shut_down) diff --git a/amdsmi/amdsmi_cli/amdsmi_logger.py b/amd_smi_cli/amd_smi_logger.py similarity index 100% rename from amdsmi/amdsmi_cli/amdsmi_logger.py rename to amd_smi_cli/amd_smi_logger.py diff --git a/amd_smi_cli/amd_smi_modules.py b/amd_smi_cli/amd_smi_modules.py new file mode 100644 index 0000000000..97556b9d14 --- /dev/null +++ b/amd_smi_cli/amd_smi_modules.py @@ -0,0 +1,97 @@ +#!/usr/bin/python3 + +import argparse +import platform +import signal +import subprocess +import sys +import time +import traceback + +from pathlib import Path + +import BDF +from amd_smi_init import * + +class AMD_SMI_Modules(object): + def __init__(self) -> None: + pass + + + def get_socket_handles(self): + ### Returns tuple of (int, list of ctypes: socket_handles) + socket_count = c_uint32(0) + return_code = amdsmi.amdsmi_get_socket_handles(byref(socket_count), None) + check_return(return_code=return_code, error_statment="Invalid get_socket_handles request") + + sockets = [0] * socket_count.value # 1 + socket_handles = (c_void_p * socket_count.value)(*sockets) # That is a pointer, not a multiplication + return_code = amdsmi.amdsmi_get_socket_handles(byref(socket_count), socket_handles) + check_return(return_code=return_code, error_statment=f"Invalid get_socket_handles with {socket_count.value} sockets") + return (socket_count.value, socket_handles) + + + def get_device_handles(self, socket_handle): + """Gets the Device Handles that are in the current socket""" + ### Returns tuple of (int, list of ctypes: device_handles) + device_count = c_uint32(0) + return_code = amdsmi.amdsmi_get_device_handles(socket_handle, byref(device_count), None) + check_return(return_code=return_code, error_statment="Invalid get_device_handles request") + + devices = [0] * device_count.value + device_handles = (c_void_p * len(devices))(*devices) + return_code = amdsmi.amdsmi_get_device_handles(socket_handle, byref(device_count), byref(device_handles)) + check_return(return_code=return_code, error_statment=f"Invalid get_device_handles with {device_count.value} devices") + return (device_count.value, device_handles) + + + def get_socket_info(self, socket_handle): + """ Given a socket_handle, return the socket_info, which is just a BDF object""" + socket_info = create_string_buffer(128) # createstringbuffer or something??? c_char_p + return_code = amdsmi.amdsmi_get_socket_info(socket_handle, byref(socket_info), c_size_t(128)) + check_return(return_code=return_code, error_statment="Invalid get_socket_info request") + socket_bdf = BDF.BDF(socket_info.value.decode()) + return(socket_bdf) + + + def get_device_type(self, device_handle, format=True): + # format: True for string; False for int + # Returns device_type string for the given device_handle + dev_type = c_int(0) + return_code = amdsmi.amdsmi_get_device_type(device_handle, byref(dev_type)) + check_return(return_code=return_code, error_statment="Invalid get_device_type request") + + if format == True: # Return string + return device_type__enumvalues[dev_type.value] + + return dev_type.value # Return int + + + def get_device_bdf(self, device_handle): + + # class amdsmi_bdf_t (Union): + # _fields_ = [ + # ('bdf_submodule', bdf_submodule), + # ('as_uint', c_uint64) + # ] + bdf = amdsmi_bdf_t() + # bdf.bdf_submodule + + + + return_code = amdsmi.amdsmi_get_device_bdf(device_handle, bdf) + check_return(return_code=return_code, error_statment="Invalid amdsmi_get_device_bdf request") + return (bdf) + + + def get_device_handle_from_bdf(self, bdf): + pass + + + def get_fan_speed(self, bdf): + pass + + def show_retired_pages(self): + # num_pages = c_uint32() + # records = rsmi_retired_page_record_t() + pass \ No newline at end of file diff --git a/amdsmi/amdsmi_cli/amdsmi_parser.py b/amd_smi_cli/amd_smi_parser.py similarity index 99% rename from amdsmi/amdsmi_cli/amdsmi_parser.py rename to amd_smi_cli/amd_smi_parser.py index d5bd4b4186..0edf07417f 100644 --- a/amdsmi/amdsmi_cli/amdsmi_parser.py +++ b/amd_smi_cli/amd_smi_parser.py @@ -4,7 +4,7 @@ import argparse import platform from _version import __version__ -from amdsmi_helpers import AMD_SMI_Helpers +from amd_smi_helpers import AMD_SMI_Helpers # sudo /src/out/ubuntu-20.04/20.04/bin/rocm-smi -bc --json | python -m json.tool @@ -50,7 +50,7 @@ class AMD_SMI_Parser(argparse.ArgumentParser): # self.add_set_value_parser(subparsers, set_value) self.add_reset_parser(subparsers, reset) self.add_misc_parser(subparsers, misc) - # self.add_gpu_v_parser(subparsers, misc) + self.add_gpu_v_parser(subparsers, misc) def add_version_parser(self, subparsers, func): diff --git a/amdsmi/amdsmi_cli/amdsmiBindings.py b/amd_smi_cli/amdsmiBindings.py similarity index 100% rename from amdsmi/amdsmi_cli/amdsmiBindings.py rename to amd_smi_cli/amdsmiBindings.py diff --git a/amdsmi/setup.py b/amdsmi/setup.py deleted file mode 100644 index ee28d92576..0000000000 --- a/amdsmi/setup.py +++ /dev/null @@ -1,21 +0,0 @@ -from setuptools import setup, find_packages -from _version import __version__ - -with open("README.md", "r", encoding="utf-8") as fh: - long_description = fh.read() - -setup( - name='amdsmi', - version=__version__, - description="SMI LIB - AMD GPU Monitoring Library", - long_description=long_description, - long_description_content_type="text/markdown", - packages=find_packages(), # can be customized later, but works for now - package_data={'': ['LICENSE']}, - include_package_data=True, - python_requires=">=3.6", -) - -# To build wheel -# python3 -m pip install -U wheel -# python3 setup.py bdist_wheel \ No newline at end of file diff --git a/amdsmi/README.md b/py-interface/README.md similarity index 100% rename from amdsmi/README.md rename to py-interface/README.md diff --git a/amdsmi/__init__.py b/py-interface/__init__.py similarity index 99% rename from amdsmi/__init__.py rename to py-interface/__init__.py index 18531e0128..82c8dd1d8c 100644 --- a/amdsmi/__init__.py +++ b/py-interface/__init__.py @@ -177,6 +177,7 @@ from .amdsmi_interface import amdsmi_is_P2P_accessible from .amdsmi_interface import amdsmi_get_xgmi_info # # Enums + from .amdsmi_interface import AmdSmiInitFlags from .amdsmi_interface import AmdSmiContainerTypes from .amdsmi_interface import AmdSmiDeviceType @@ -204,8 +205,8 @@ from .amdsmi_interface import AmdSmiIoLinkType from .amdsmi_interface import AmdSmiUtilizationCounterType from .amdsmi_interface import AmdSmiSwComponent from .amdsmi_interface import AmdSmiIoLinkType - # Exceptions + from .amdsmi_exception import AmdSmiLibraryException from .amdsmi_exception import AmdSmiRetryException from .amdsmi_exception import AmdSmiParameterException diff --git a/amdsmi/amdsmi_exception.py b/py-interface/amdsmi_exception.py similarity index 99% rename from amdsmi/amdsmi_exception.py rename to py-interface/amdsmi_exception.py index 4e23060c13..2659a44fe0 100644 --- a/amdsmi/amdsmi_exception.py +++ b/py-interface/amdsmi_exception.py @@ -20,7 +20,7 @@ # from enum import IntEnum -import amdsmi_wrapper +from . import amdsmi_wrapper class AmdSmiRetCode(IntEnum): diff --git a/amdsmi/amdsmi_interface.py b/py-interface/amdsmi_interface.py similarity index 99% rename from amdsmi/amdsmi_interface.py rename to py-interface/amdsmi_interface.py index 1473579566..14f26a7617 100644 --- a/amdsmi/amdsmi_interface.py +++ b/py-interface/amdsmi_interface.py @@ -25,8 +25,8 @@ from typing import Union, Any, Dict, List, Tuple from enum import IntEnum from collections.abc import Iterable -import amdsmi_wrapper -from amdsmi_exception import * +from . import amdsmi_wrapper +from .amdsmi_exception import * class AmdSmiInitFlags(IntEnum): @@ -498,7 +498,8 @@ def amdsmi_get_socket_handles() -> List[amdsmi_wrapper.amdsmi_socket_handle]: socket_count.value)() _check_res( amdsmi_wrapper.amdsmi_get_socket_handles( - ctypes.byref(socket_count), socket_handles) + ctypes.byref(socket_count), socket_handles + ) ) sockets = [ amdsmi_wrapper.amdsmi_socket_handle(socket_handles[sock_idx]) @@ -512,16 +513,12 @@ def amdsmi_get_socket_info(socket_handle): if not isinstance(socket_handle, amdsmi_wrapper.amdsmi_socket_handle): raise AmdSmiParameterException( socket_handle, amdsmi_wrapper.amdsmi_socket_handle) - socket_info = ctypes.create_string_buffer(128) - - _check_res( - amdsmi_wrapper.get_socket_info( - socket_handle, ctypes.byref(socket_info), ctypes.c_size_t(128)) - ) - return socket_info.value.decode() + return { + "name": "" + } + -# This input is different, also this List defintion doesn't really work because you never return that, you return a list of lists def amdsmi_get_device_handles() -> List[amdsmi_wrapper.amdsmi_device_handle]: socket_handles = amdsmi_get_socket_handles() devices = [] diff --git a/amdsmi/amdsmi_wrapper.py b/py-interface/amdsmi_wrapper.py similarity index 99% rename from amdsmi/amdsmi_wrapper.py rename to py-interface/amdsmi_wrapper.py index 20eb758661..6e88431c22 100644 --- a/amdsmi/amdsmi_wrapper.py +++ b/py-interface/amdsmi_wrapper.py @@ -165,10 +165,11 @@ def char_pointer_cast(string, encoding='utf-8'): return ctypes.cast(string, ctypes.POINTER(ctypes.c_char)) -# Change this to more dynamic later or in /opt/rocm/lib/libamd_smi64.so + _libraries = {} -amd_smi_lib_so_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../build/src/libamd_smi.so')) -_libraries['libamd_smi.so'] = ctypes.CDLL(amd_smi_lib_so_path) +_libraries['libamd_smi.so'] = ctypes.CDLL(os.path.join(os.path.dirname(__file__), 'libamd_smi.so')) + + # values for enumeration 'c__EA_amdsmi_init_flags_t' c__EA_amdsmi_init_flags_t__enumvalues = { diff --git a/amdsmi/rocm_smi_tool.py b/py-interface/rocm_smi_tool.py similarity index 100% rename from amdsmi/rocm_smi_tool.py rename to py-interface/rocm_smi_tool.py diff --git a/py-interface/setup.py b/py-interface/setup.py new file mode 100644 index 0000000000..6a4bc6480f --- /dev/null +++ b/py-interface/setup.py @@ -0,0 +1,16 @@ +from setuptools import setup + +with open("amdsmi/README.md", "r", encoding="utf-8") as fh: + long_description = fh.read() + +setup( + name='amdsmi', + version='0.1', + description="SMI LIB - AMD GPU Monitoring Library", + long_description=long_description, + long_description_content_type="text/markdown", + packages=['amdsmi'], + package_data={'': ['LICENSE']}, + include_package_data=True, + python_requires=">=3.6", +)