Python library for monitoring and managing AMD GPUs and CPUs with programmatic hardware metrics access
Monitoring functions for AMD CPU hardware metrics including power consumption, temperature, energy usage, frequency limits, and system information. These functions provide comprehensive visibility into CPU performance and health status.
Note: Most CPU monitoring functions require the ESMI (Embedded System Management Interface) library to be installed and supported by the CPU. Functions that don't require ESMI are noted in their descriptions.
Get handles for CPU sockets and cores to use with monitoring functions.
def amdsmi_get_cpusocket_handles() -> List[processor_handle]:
"""
Get list of CPU socket handles.
Returns handles for all CPU sockets in the system. These handles are used
with other CPU monitoring functions.
Requires: ESMI library support
Parameters:
- None
Returns:
- List[processor_handle]: List of CPU socket handles
Raises:
- AmdSmiLibraryException: On query failure or if ESMI is not available
Example:
```python
import amdsmi
# Initialize for CPU monitoring
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
sockets = amdsmi.amdsmi_get_cpusocket_handles()
print(f"Found {len(sockets)} CPU socket(s)")
for i, socket in enumerate(sockets):
print(f"Socket {i}: {socket}")
finally:
amdsmi.amdsmi_shut_down()
```
"""def amdsmi_get_cpucore_handles(socket_handle: processor_handle) -> List[processor_handle]:
"""
Get list of CPU core handles for a specific socket.
Returns handles for all CPU cores within the specified socket. Core handles
are used for per-core monitoring functions.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- List[processor_handle]: List of CPU core handles for the socket
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
sockets = amdsmi.amdsmi_get_cpusocket_handles()
for socket in sockets:
cores = amdsmi.amdsmi_get_cpucore_handles(socket)
print(f"Socket {socket} has {len(cores)} cores")
finally:
amdsmi.amdsmi_shut_down()
```
"""def amdsmi_get_processor_info(processor_handle: processor_handle) -> str:
"""
Get processor information string.
Returns a descriptive string containing information about the processor
(CPU socket or core).
Requires: ESMI library support
Parameters:
- processor_handle: Handle for the target CPU socket or core
Returns:
- str: Processor information string
Raises:
- AmdSmiParameterException: If processor_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
sockets = amdsmi.amdsmi_get_cpusocket_handles()
for socket in sockets:
info = amdsmi.amdsmi_get_processor_info(socket)
print(f"Processor Info: {info}")
finally:
amdsmi.amdsmi_shut_down()
```
"""Monitor CPU socket power consumption and manage power limits.
def amdsmi_get_cpu_socket_power(socket_handle: processor_handle) -> str:
"""
Get current power consumption for a CPU socket.
Returns the current power draw for the specified CPU socket in milliwatts.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- str: Power consumption formatted as "{value} mW" (e.g., "45000 mW")
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
sockets = amdsmi.amdsmi_get_cpusocket_handles()
for socket in sockets:
power_str = amdsmi.amdsmi_get_cpu_socket_power(socket)
# Parse the value (e.g., "45000 mW")
power_mw = int(power_str.split()[0])
power_w = power_mw / 1000
print(f"Socket Power: {power_w:.2f} W")
finally:
amdsmi.amdsmi_shut_down()
```
"""def amdsmi_get_cpu_socket_power_cap(socket_handle: processor_handle) -> str:
"""
Get power cap (limit) for a CPU socket.
Returns the current power cap setting for the specified CPU socket. The power
cap limits the maximum power the socket can consume.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- str: Power cap formatted as "{value} mW" (e.g., "65000 mW")
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
cap_str = amdsmi.amdsmi_get_cpu_socket_power_cap(socket)
cap_mw = int(cap_str.split()[0])
cap_w = cap_mw / 1000
print(f"Power Cap: {cap_w:.2f} W")
finally:
amdsmi.amdsmi_shut_down()
```
"""def amdsmi_get_cpu_socket_power_cap_max(socket_handle: processor_handle) -> str:
"""
Get maximum power cap limit for a CPU socket.
Returns the maximum allowed power cap value for the specified CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- str: Maximum power cap formatted as "{value} mW"
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
max_cap_str = amdsmi.amdsmi_get_cpu_socket_power_cap_max(socket)
max_cap_mw = int(max_cap_str.split()[0])
print(f"Maximum power cap: {max_cap_mw / 1000:.2f} W")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_set_cpu_socket_power_cap(socket_handle: processor_handle, power_cap: int) -> None:
"""
Set power cap (limit) for a CPU socket.
Sets the maximum power consumption limit for the specified CPU socket. This can
be used to constrain power usage for thermal or power budget reasons.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
- power_cap (int): Power cap value in milliwatts (mW)
Returns:
- None
Raises:
- AmdSmiParameterException: If socket_handle or power_cap is invalid
- AmdSmiLibraryException: On operation failure (may require root privileges)
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Set power cap to 65W (65000 mW)
new_cap_mw = 65000
amdsmi.amdsmi_set_cpu_socket_power_cap(socket, new_cap_mw)
print(f"Power cap set to {new_cap_mw / 1000:.2f} W")
# Verify the new setting
cap_str = amdsmi.amdsmi_get_cpu_socket_power_cap(socket)
print(f"Current power cap: {cap_str}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_pwr_svi_telemetry_all_rails(socket_handle: processor_handle) -> Dict[str, int]:
"""
Get SVI-based telemetry for all power rails.
Returns power telemetry data from the Serial VID Interface (SVI) for all voltage
rails on the CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- Dict[str, int]: Dictionary containing power rail telemetry with power values in milliwatts
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
telemetry = amdsmi.amdsmi_get_cpu_pwr_svi_telemetry_all_rails(socket)
print("Power Rail Telemetry:")
for rail, power in telemetry.items():
print(f" {rail}: {power / 1000:.2f} W")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_set_cpu_pwr_efficiency_mode(socket_handle: processor_handle, mode: int) -> None:
"""
Set power efficiency mode for a CPU socket.
Configures the power efficiency mode to optimize power consumption characteristics.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
- mode (int): Power efficiency mode value
Returns:
- None
Raises:
- AmdSmiParameterException: If socket_handle or mode is invalid
- AmdSmiLibraryException: On operation failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
amdsmi.amdsmi_set_cpu_pwr_efficiency_mode(socket, 1)
print("Power efficiency mode set")
finally:
amdsmi.amdsmi_shut_down()
```
"""Monitor CPU socket temperature and PROCHOT status.
def amdsmi_get_cpu_socket_temperature(socket_handle: processor_handle) -> str:
"""
Get temperature for a CPU socket.
Returns the current temperature reading for the specified CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- str: Temperature formatted as "{value} Degrees C" (e.g., "45 Degrees C")
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
sockets = amdsmi.amdsmi_get_cpusocket_handles()
for i, socket in enumerate(sockets):
temp_str = amdsmi.amdsmi_get_cpu_socket_temperature(socket)
# Parse the value (e.g., "45 Degrees C")
temp_c = int(temp_str.split()[0])
print(f"Socket {i} Temperature: {temp_c}°C")
# Warning check
if temp_c > 80:
print(f" WARNING: High temperature!")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_prochot_status(socket_handle: processor_handle) -> int:
"""
Get PROCHOT status for a CPU socket.
Returns the current PROCHOT (processor hot) status, which indicates thermal
throttling conditions. PROCHOT is asserted when the processor reaches thermal limits.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- int: PROCHOT status value (0 = not asserted, non-zero = asserted)
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
prochot = amdsmi.amdsmi_get_cpu_prochot_status(socket)
if prochot:
print("WARNING: PROCHOT asserted - CPU is thermal throttling!")
else:
print("CPU temperature within normal range")
finally:
amdsmi.amdsmi_shut_down()
```
"""Monitor energy consumption for CPU sockets and cores.
def amdsmi_get_cpu_core_energy(core_handle: processor_handle) -> str:
"""
Get energy consumption for a CPU core.
Returns the accumulated energy consumption for the specified CPU core. This
counter accumulates over time and can be used to calculate energy usage over
intervals by taking multiple readings.
Requires: ESMI library support
Parameters:
- core_handle: Handle for the target CPU core
Returns:
- str: Energy consumption formatted as "{value} J" (joules)
Raises:
- AmdSmiParameterException: If core_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
import time
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
cores = amdsmi.amdsmi_get_cpucore_handles(socket)
core = cores[0]
# Take initial reading
energy1_str = amdsmi.amdsmi_get_cpu_core_energy(core)
energy1_j = float(energy1_str.split()[0])
time.sleep(1)
# Take second reading
energy2_str = amdsmi.amdsmi_get_cpu_core_energy(core)
energy2_j = float(energy2_str.split()[0])
# Calculate energy consumed in 1 second
energy_consumed = energy2_j - energy1_j
print(f"Core energy consumed: {energy_consumed:.4f} J")
print(f"Core average power: {energy_consumed:.4f} W")
finally:
amdsmi.amdsmi_shut_down()
```
"""def amdsmi_get_cpu_socket_energy(socket_handle: processor_handle) -> str:
"""
Get energy consumption for a CPU socket.
Returns the accumulated energy consumption for the specified CPU socket,
representing the total energy used by all cores and components in the socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- str: Energy consumption formatted as "{value} J" (joules)
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
import time
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Monitor socket energy over 5 seconds
energy1_str = amdsmi.amdsmi_get_cpu_socket_energy(socket)
energy1_j = float(energy1_str.split()[0])
time.sleep(5)
energy2_str = amdsmi.amdsmi_get_cpu_socket_energy(socket)
energy2_j = float(energy2_str.split()[0])
# Calculate consumption
energy_consumed = energy2_j - energy1_j
avg_power = energy_consumed / 5.0
print(f"Socket energy consumed: {energy_consumed:.2f} J over 5 seconds")
print(f"Average socket power: {avg_power:.2f} W")
finally:
amdsmi.amdsmi_shut_down()
```
"""Monitor and control CPU core and socket frequency limits.
def amdsmi_get_cpu_fclk_mclk(socket_handle: processor_handle) -> Dict[str, str]:
"""
Get fabric clock (FCLK) and memory clock (MCLK) frequencies.
Returns the current FCLK and MCLK frequencies for the CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- Dict[str, str]: Dictionary with 'fclk' and 'mclk' keys, values formatted as "{value} MHz"
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
clocks = amdsmi.amdsmi_get_cpu_fclk_mclk(socket)
print(f"Fabric Clock: {clocks['fclk']}")
print(f"Memory Clock: {clocks['mclk']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_cclk_limit(socket_handle: processor_handle) -> str:
"""
Get core clock (CCLK) frequency limit.
Returns the current core clock frequency limit for the CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- str: Core clock limit formatted as "{value} MHz"
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
cclk = amdsmi.amdsmi_get_cpu_cclk_limit(socket)
print(f"Core Clock Limit: {cclk}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_socket_current_active_freq_limit(socket_handle: processor_handle) -> Dict[str, str]:
"""
Get currently active frequency limit and source.
Returns the current active frequency limit for the socket along with information
about what is causing the limit (thermal, power, etc.).
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- Dict[str, str]: Dictionary with 'freq' and 'freq_src' keys
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
freq_info = amdsmi.amdsmi_get_cpu_socket_current_active_freq_limit(socket)
print(f"Active Frequency Limit: {freq_info['freq']}")
print(f"Limit Source: {freq_info['freq_src']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_socket_freq_range(socket_handle: processor_handle) -> Dict[str, str]:
"""
Get frequency range for a CPU socket.
Returns the minimum and maximum frequency range for the socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- Dict[str, str]: Dictionary with 'max_socket_freq' and 'min_socket_freq' keys
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
freq_range = amdsmi.amdsmi_get_cpu_socket_freq_range(socket)
print(f"Max Frequency: {freq_range['max_socket_freq']}")
print(f"Min Frequency: {freq_range['min_socket_freq']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_core_current_freq_limit(core_handle: processor_handle) -> str:
"""
Get current frequency limit for a CPU core.
Returns the current frequency limit for the specified core.
Requires: ESMI library support
Parameters:
- core_handle: Handle for the target CPU core
Returns:
- str: Frequency limit formatted as "{value} MHz"
Raises:
- AmdSmiParameterException: If core_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
cores = amdsmi.amdsmi_get_cpucore_handles(socket)
core = cores[0]
freq_limit = amdsmi.amdsmi_get_cpu_core_current_freq_limit(core)
print(f"Core Frequency Limit: {freq_limit}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_core_boostlimit(core_handle: processor_handle) -> str:
"""
Get boost frequency limit for a CPU core.
Returns the maximum boost frequency the specified CPU core can reach. This
represents the highest clock speed the core can achieve under boost conditions.
Requires: ESMI library support
Parameters:
- core_handle: Handle for the target CPU core
Returns:
- str: Boost limit formatted as "{value} MHz" (megahertz)
Raises:
- AmdSmiParameterException: If core_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
cores = amdsmi.amdsmi_get_cpucore_handles(socket)
print("Core Boost Limits:")
for i, core in enumerate(cores):
boost_str = amdsmi.amdsmi_get_cpu_core_boostlimit(core)
boost_mhz = int(boost_str.split()[0])
boost_ghz = boost_mhz / 1000
print(f" Core {i}: {boost_ghz:.2f} GHz")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_set_cpu_core_boostlimit(
core_handle: processor_handle,
boostlimit: int
) -> None:
"""
Set boost frequency limit for a CPU core.
Configures the maximum boost frequency limit for the specified CPU core.
Requires: ESMI library support and appropriate privileges
Parameters:
- core_handle: Handle for the target CPU core
- boostlimit: Boost frequency limit in MHz
Raises:
- AmdSmiParameterException: If core_handle or boostlimit are invalid
- AmdSmiLibraryException: On configuration failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
cores = amdsmi.amdsmi_get_cpucore_handles(socket)
# Set core boost limit to 4000 MHz
amdsmi.amdsmi_set_cpu_core_boostlimit(cores[0], 4000)
print("Core boost limit set to 4000 MHz")
finally:
amdsmi.amdsmi_shut_down()
```
"""Access comprehensive CPU metrics via the HSMP (Host System Management Port) interface.
def amdsmi_get_hsmp_metrics_table(socket_handle: processor_handle) -> Dict[str, Any]:
"""
Get HSMP metrics table for a CPU socket.
Returns a comprehensive dictionary of CPU metrics from the HSMP metrics table.
This provides detailed information about power, temperatures, frequencies, and
other performance metrics in a single query.
The metrics table contains numerous fields including accumulator values, power
consumption, clock frequencies, temperature readings, C-state residency, and
various performance metrics. Available fields depend on the CPU model and HSMP
version.
Requires: ESMI library support with HSMP protocol
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- dict: Dictionary containing HSMP metrics including:
- accumulation_counter (int): Metrics accumulation counter
- max_socket_temperature (float): Maximum socket temperature in °C
- max_vr_temperature (float): Maximum voltage regulator temperature in °C
- max_hbm_temperature (float): Maximum HBM temperature in °C
- socket_power_limit (float): Socket power limit in watts
- max_socket_power_limit (float): Maximum socket power limit in watts
- socket_power (float): Current socket power in watts
- timestamp (int): Timestamp of metrics
- socket_energy_acc (float): Accumulated socket energy
- ccd_energy_acc (float): Accumulated CCD energy
- xcd_energy_acc (float): Accumulated XCD energy
- aid_energy_acc (float): Accumulated AID energy
- hbm_energy_acc (float): Accumulated HBM energy
- cclk_frequency_limit (int): Core clock frequency limit in MHz
- gfxclk_frequency_limit (int): Graphics clock frequency limit in MHz
- fclk_frequency (int): Fabric clock frequency in MHz
- uclk_frequency (int): Memory clock frequency in MHz
- socclk_frequency (List[int]): SoC clock frequencies in MHz
- vclk_frequency (List[int]): Video clock frequencies in MHz
- dclk_frequency (List[int]): Display clock frequencies in MHz
- lclk_frequency (List[int]): Link clock frequencies in MHz
- gfxclk_frequency_acc (List[int]): Graphics clock frequency accumulators
- cclk_frequency_acc (int): Core clock frequency accumulator
- max_cclk_frequency (int): Maximum core clock frequency in MHz
- min_cclk_frequency (int): Minimum core clock frequency in MHz
- max_gfxclk_frequency (int): Maximum graphics clock frequency in MHz
- min_gfxclk_frequency (int): Minimum graphics clock frequency in MHz
- fclk_frequency_table (List[int]): Fabric clock frequency table in MHz
- uclk_frequency_table (List[int]): Memory clock frequency table in MHz
- socclk_frequency_table (List[int]): SoC clock frequency table in MHz
- vclk_frequency_table (List[int]): Video clock frequency table in MHz
- dclk_frequency_table (List[int]): Display clock frequency table in MHz
- lclk_frequency_table (List[int]): Link clock frequency table in MHz
- max_lclk_dpm_range (int): Maximum LCLK DPM range
- min_lclk_dpm_range (int): Minimum LCLK DPM range
- xgmi_width (int): XGMI link width
- xgmi_bitrate (int): XGMI bitrate
- xgmi_read_bandwidth_acc (List[int]): XGMI read bandwidth accumulators
- xgmi_write_bandwidth_acc (List[int]): XGMI write bandwidth accumulators
- socket_c0_residency (int): Socket C0 residency percentage
- socket_gfx_busy (int): Socket graphics busy percentage
- dram_bandwidth_utilization (int): DRAM bandwidth utilization
- socket_c0_residency_acc (int): Socket C0 residency accumulator
- cpu_set_limits (int): CPU set limits
- max_cpu_set_limits (int): Maximum CPU set limits
- cpu_cur_temp (int): Current CPU temperature
- cpu_cur_power (int): Current CPU power
- cpu_cur_freqlimit (int): Current CPU frequency limit
- cpu_sock_freqlimit (int): Socket frequency limit
- prochot_residency_acc (int): PROCHOT residency accumulator
- ppt_residency_acc (int): PPT residency accumulator
- socket_thm_residency_acc (int): Socket thermal residency accumulator
- vr_thm_residency_acc (int): VR thermal residency accumulator
- hbm_thm_residency_acc (int): HBM thermal residency accumulator
- spare (int): Spare field
- Note: Not all fields are available on all CPU models
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
metrics = amdsmi.amdsmi_get_hsmp_metrics_table(socket)
print("HSMP Metrics Table:")
print(f" Max Socket Temperature: {metrics['max_socket_temperature']:.1f}°C")
print(f" Socket Power: {metrics['socket_power']:.2f} W")
print(f" Socket Power Limit: {metrics['socket_power_limit']:.2f} W")
print(f" Core Clock Limit: {metrics['cclk_frequency_limit']} MHz")
print(f" Fabric Clock: {metrics['fclk_frequency']} MHz")
print(f" Memory Clock: {metrics['uclk_frequency']} MHz")
print(f" Socket C0 Residency: {metrics['socket_c0_residency']}%")
finally:
amdsmi.amdsmi_shut_down()
```
"""Monitor DDR bandwidth, I/O bandwidth, and XGMI link metrics.
def amdsmi_get_cpu_ddr_bw(socket_handle: processor_handle) -> Dict[str, str]:
"""
Get DDR bandwidth metrics for a CPU socket.
Returns DDR bandwidth utilization including maximum bandwidth, utilized bandwidth,
and utilization percentage.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- Dict[str, str]: Dictionary containing:
- 'ddr_bw_max_bw' (str): Maximum DDR bandwidth formatted as "{value} Gbps"
- 'ddr_bw_utilized_bw' (str): Utilized DDR bandwidth formatted as "{value} Gbps"
- 'ddr_bw_utilized_pct' (str): Utilization percentage formatted as "{value} %"
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
ddr_bw = amdsmi.amdsmi_get_cpu_ddr_bw(socket)
print(f"DDR Bandwidth:")
print(f" Max: {ddr_bw['ddr_bw_max_bw']}")
print(f" Utilized: {ddr_bw['ddr_bw_utilized_bw']}")
print(f" Utilization: {ddr_bw['ddr_bw_utilized_pct']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_current_io_bandwidth(
socket_handle: processor_handle,
encoding: int,
link_name: str
) -> str:
"""
Get current I/O bandwidth for a specific link.
Returns the current I/O bandwidth utilization for the specified link on the CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
- encoding (int): Bandwidth encoding type
- link_name (str): Name of the I/O link to query
Returns:
- str: I/O bandwidth formatted as "{value} Mbps"
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Query I/O bandwidth for a specific link
io_bw = amdsmi.amdsmi_get_cpu_current_io_bandwidth(socket, 0, "P2")
print(f"I/O Bandwidth: {io_bw}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_current_xgmi_bw(
socket_handle: processor_handle,
encoding: int,
link_name: str
) -> str:
"""
Get current XGMI bandwidth for a specific link.
Returns the current XGMI (AMD Infinity Fabric) bandwidth utilization for the
specified link on the CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
- encoding (int): Bandwidth encoding type
- link_name (str): Name of the XGMI link to query
Returns:
- str: XGMI bandwidth formatted as "{value} Mbps"
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Query XGMI bandwidth
xgmi_bw = amdsmi.amdsmi_get_cpu_current_xgmi_bw(socket, 0, "P2")
print(f"XGMI Bandwidth: {xgmi_bw}")
finally:
amdsmi.amdsmi_shut_down()
```
"""Query DIMM (memory module) temperature, power consumption, and thermal sensors.
def amdsmi_get_cpu_dimm_temp_range_and_refresh_rate(
socket_handle: processor_handle,
dimm_addr: int
) -> Dict[str, int]:
"""
Get DIMM temperature range and refresh rate.
Returns the temperature range and refresh rate for the specified DIMM on the CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
- dimm_addr (int): DIMM address identifier
Returns:
- Dict[str, int]: Dictionary containing:
- 'dimm_temperature_range' (int): Temperature range value
- 'dimm_refresh_rate' (int): Refresh rate value
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Query DIMM 0 temperature range and refresh rate
dimm_info = amdsmi.amdsmi_get_cpu_dimm_temp_range_and_refresh_rate(socket, 0)
print(f"DIMM 0 Temperature Range: {dimm_info['dimm_temperature_range']}")
print(f"DIMM 0 Refresh Rate: {dimm_info['dimm_refresh_rate']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_dimm_power_consumption(
socket_handle: processor_handle,
dimm_addr: int
) -> Dict[str, str]:
"""
Get DIMM power consumption.
Returns power consumption and update rate for the specified DIMM.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
- dimm_addr (int): DIMM address identifier
Returns:
- Dict[str, str]: Dictionary containing:
- 'dimm_power_consumed' (str): Power consumption formatted as "{value} mW"
- 'dimm_power_update_rate' (str): Update rate formatted as "{value} ms"
- 'dimm_dimm_addr' (int): DIMM address
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Query DIMM 0 power consumption
dimm_power = amdsmi.amdsmi_get_cpu_dimm_power_consumption(socket, 0)
print(f"DIMM Power: {dimm_power['dimm_power_consumed']}")
print(f"Update Rate: {dimm_power['dimm_power_update_rate']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_dimm_thermal_sensor(
socket_handle: processor_handle,
dimm_addr: int
) -> Dict[str, str]:
"""
Get DIMM thermal sensor reading.
Returns thermal sensor value, update rate, and temperature for the specified DIMM.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
- dimm_addr (int): DIMM address identifier
Returns:
- Dict[str, str]: Dictionary containing:
- 'dimm_thermal_sensor_value' (int): Thermal sensor value
- 'dimm_thermal_update_rate' (str): Update rate formatted as "{value} ms"
- 'dimm_thermal_dimm_addr' (int): DIMM address
- 'dimm_thermal_temperature' (str): Temperature formatted as "{value} Degrees C"
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Query DIMM 0 thermal sensor
dimm_thermal = amdsmi.amdsmi_get_cpu_dimm_thermal_sensor(socket, 0)
print(f"DIMM Temperature: {dimm_thermal['dimm_thermal_temperature']}")
print(f"Sensor Value: {dimm_thermal['dimm_thermal_sensor_value']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""Configure advanced CPU settings including boost limits, link widths, DPM levels, and APB modes.
def amdsmi_set_cpu_socket_boostlimit(
socket_handle: processor_handle,
boostlimit: int
) -> None:
"""
Set boost frequency limit for a CPU socket.
Configures the maximum boost frequency limit for all cores in the specified socket.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
- boostlimit (int): Boost limit value in MHz
Returns:
- None
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On operation failure (may require root privileges)
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Set socket boost limit to 4000 MHz
amdsmi.amdsmi_set_cpu_socket_boostlimit(socket, 4000)
print("Socket boost limit set to 4000 MHz")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_set_cpu_xgmi_width(
socket_handle: processor_handle,
min_width: int,
max_width: int
) -> None:
"""
Set XGMI link width range for a CPU socket.
Configures the minimum and maximum XGMI link width for the socket.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
- min_width (int): Minimum XGMI link width
- max_width (int): Maximum XGMI link width
Returns:
- None
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On operation failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Set XGMI width range
amdsmi.amdsmi_set_cpu_xgmi_width(socket, 8, 16)
print("XGMI width range set to 8-16")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_set_cpu_gmi3_link_width_range(
socket_handle: processor_handle,
min_link_width: int,
max_link_width: int
) -> None:
"""
Set GMI3 link width range for a CPU socket.
Configures the minimum and maximum GMI3 (Global Memory Interconnect 3) link width.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
- min_link_width (int): Minimum GMI3 link width
- max_link_width (int): Maximum GMI3 link width
Returns:
- None
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On operation failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Set GMI3 link width range
amdsmi.amdsmi_set_cpu_gmi3_link_width_range(socket, 8, 16)
print("GMI3 link width range set to 8-16")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_cpu_apb_enable(socket_handle: processor_handle) -> None:
"""
Enable APB (All-core Performance Boost) for a CPU socket.
Enables the APB feature which allows all cores to boost simultaneously.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- None
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On operation failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Enable APB
amdsmi.amdsmi_cpu_apb_enable(socket)
print("APB enabled")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_cpu_apb_disable(
socket_handle: processor_handle,
pstate: int
) -> None:
"""
Disable APB (All-core Performance Boost) for a CPU socket.
Disables the APB feature and sets the specified P-state.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
- pstate (int): P-state value to set
Returns:
- None
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On operation failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Disable APB with P-state 0
amdsmi.amdsmi_cpu_apb_disable(socket, 0)
print("APB disabled")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_set_cpu_socket_lclk_dpm_level(
socket_handle: processor_handle,
nbio_id: int,
min_val: int,
max_val: int
) -> None:
"""
Set LCLK DPM (Dynamic Power Management) level range for a CPU socket.
Configures the minimum and maximum LCLK DPM levels for the specified NBIO.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
- nbio_id (int): NBIO (North Bridge I/O) identifier
- min_val (int): Minimum DPM level
- max_val (int): Maximum DPM level
Returns:
- None
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On operation failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Set LCLK DPM level range for NBIO 0
amdsmi.amdsmi_set_cpu_socket_lclk_dpm_level(socket, 0, 0, 3)
print("LCLK DPM level range set to 0-3")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_socket_lclk_dpm_level(
socket_handle: processor_handle,
nbio_id: int
) -> Dict[str, int]:
"""
Get LCLK DPM (Dynamic Power Management) level range for a CPU socket.
Returns the current minimum and maximum LCLK DPM levels for the specified NBIO.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
- nbio_id (int): NBIO (North Bridge I/O) identifier
Returns:
- Dict[str, int]: Dictionary containing:
- 'nbio_max_dpm_level' (int): Maximum DPM level
- 'nbio_min_dpm_level' (int): Minimum DPM level
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Get LCLK DPM level for NBIO 0
dpm_level = amdsmi.amdsmi_get_cpu_socket_lclk_dpm_level(socket, 0)
print(f"DPM Level Range: {dpm_level['nbio_min_dpm_level']}-{dpm_level['nbio_max_dpm_level']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_set_cpu_pcie_link_rate(
socket_handle: processor_handle,
rate_ctrl: int
) -> str:
"""
Set PCIe link rate control for a CPU socket.
Configures the PCIe link rate control setting and returns the previous mode.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
- rate_ctrl (int): PCIe rate control value
Returns:
- str: Previous rate control mode value
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On operation failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Set PCIe link rate control
prev_mode = amdsmi.amdsmi_set_cpu_pcie_link_rate(socket, 1)
print(f"PCIe link rate set, previous mode: {prev_mode}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_set_cpu_df_pstate_range(
socket_handle: processor_handle,
max_pstate: int,
min_pstate: int
) -> None:
"""
Set data fabric P-state range for a CPU socket.
Configures the minimum and maximum P-state values for the data fabric.
Requires: ESMI library support and appropriate privileges
Parameters:
- socket_handle: Handle for the target CPU socket
- max_pstate (int): Maximum P-state value
- min_pstate (int): Minimum P-state value
Returns:
- None
Raises:
- AmdSmiParameterException: If parameters are invalid
- AmdSmiLibraryException: On operation failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Set DF P-state range
amdsmi.amdsmi_set_cpu_df_pstate_range(socket, 3, 0)
print("Data fabric P-state range set to 0-3")
finally:
amdsmi.amdsmi_shut_down()
```
"""Monitor C-state residency for power management analysis.
def amdsmi_get_cpu_socket_c0_residency(socket_handle: processor_handle) -> str:
"""
Get C0 residency percentage for a CPU socket.
Returns the percentage of time the CPU socket has spent in C0 (active) state.
C0 residency indicates how much time the CPU is actively executing instructions
versus being in power-saving states.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- str: C0 residency formatted as "{value} %"
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Get C0 residency
c0_residency = amdsmi.amdsmi_get_cpu_socket_c0_residency(socket)
print(f"C0 Residency: {c0_residency}")
# High C0 residency indicates heavy CPU utilization
residency_value = float(c0_residency.split()[0])
if residency_value > 80:
print("CPU is heavily utilized")
elif residency_value < 20:
print("CPU is mostly idle")
finally:
amdsmi.amdsmi_shut_down()
```
"""Query CPU family, model, and system topology information.
def amdsmi_get_cpu_hsmp_proto_ver(socket_handle: processor_handle) -> int:
"""
Get HSMP (Host System Management Port) protocol version.
Returns the HSMP protocol version supported by the CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- int: HSMP protocol version number
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
proto_ver = amdsmi.amdsmi_get_cpu_hsmp_proto_ver(socket)
print(f"HSMP Protocol Version: {proto_ver}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_smu_fw_version(socket_handle: processor_handle) -> Dict[str, int]:
"""
Get SMU (System Management Unit) firmware version.
Returns the SMU firmware version including major, minor, and debug version numbers.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- Dict[str, int]: Dictionary containing:
- 'smu_fw_debug_ver_num' (int): Debug version number
- 'smu_fw_minor_ver_num' (int): Minor version number
- 'smu_fw_major_ver_num' (int): Major version number
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
smu_fw = amdsmi.amdsmi_get_cpu_smu_fw_version(socket)
print(f"SMU FW Version: {smu_fw['smu_fw_major_ver_num']}."
f"{smu_fw['smu_fw_minor_ver_num']}."
f"{smu_fw['smu_fw_debug_ver_num']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_hsmp_driver_version(socket_handle: processor_handle) -> Dict[str, int]:
"""
Get HSMP driver version.
Returns the HSMP driver version including major and minor version numbers.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- Dict[str, int]: Dictionary containing:
- 'hsmp_driver_major_ver_num' (int): Major version number
- 'hsmp_driver_minor_ver_num' (int): Minor version number
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
driver_ver = amdsmi.amdsmi_get_cpu_hsmp_driver_version(socket)
print(f"HSMP Driver Version: {driver_ver['hsmp_driver_major_ver_num']}."
f"{driver_ver['hsmp_driver_minor_ver_num']}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_threads_per_core() -> int:
"""
Get the number of threads per CPU core.
Returns the number of hardware threads (SMT/hyperthreading) per physical core.
For example, returns 2 for CPUs with 2-way SMT.
Does not require ESMI library support.
Parameters:
- None
Returns:
- int: Number of threads per core
Raises:
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
threads_per_core = amdsmi.amdsmi_get_threads_per_core()
print(f"Threads per core: {threads_per_core}")
if threads_per_core == 2:
print("SMT (Simultaneous Multithreading) is enabled")
elif threads_per_core == 1:
print("SMT is disabled or not supported")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_hsmp_metrics_table_version(socket_handle: processor_handle) -> int:
"""
Get HSMP metrics table version.
Returns the version number of the HSMP metrics table format used by the CPU socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- int: HSMP metrics table version number
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
metrics_ver = amdsmi.amdsmi_get_hsmp_metrics_table_version(socket)
print(f"HSMP Metrics Table Version: {metrics_ver}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_first_online_core_on_cpu_socket(socket_handle: processor_handle) -> int:
"""
Get the first online core index for a CPU socket.
Returns the index of the first online (active) core on the specified CPU socket.
Useful for identifying which core to use for per-socket operations.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- int: Index of the first online core
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
first_core = amdsmi.amdsmi_first_online_core_on_cpu_socket(socket)
print(f"First online core on socket: {first_core}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_model_name(socket_handle: processor_handle) -> str:
"""
Get CPU model name string.
Returns the human-readable CPU model name for the specified socket.
Requires: ESMI library support
Parameters:
- socket_handle: Handle for the target CPU socket
Returns:
- str: CPU model name string (e.g., "AMD EPYC 7763 64-Core Processor")
Raises:
- AmdSmiParameterException: If socket_handle is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
model_name = amdsmi.amdsmi_get_cpu_model_name(socket)
print(f"CPU Model: {model_name}")
finally:
amdsmi.amdsmi_shut_down()
```
"""
def amdsmi_get_cpu_family() -> int:
"""
Get CPU family ID.
Returns the AMD CPU family identifier, which indicates the processor architecture
generation.
Requires: ESMI library support
Parameters:
- None
Returns:
- int: CPU family ID (e.g., 25 for Zen 3, 26 for Zen 4)
Raises:
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
family = amdsmi.amdsmi_get_cpu_family()
print(f"CPU Family: {family} (0x{family:x})")
# Identify architecture
if family == 25:
print("Architecture: Zen 3")
elif family == 26:
print("Architecture: Zen 4")
finally:
amdsmi.amdsmi_shut_down()
```
"""def amdsmi_get_cpu_model() -> int:
"""
Get CPU model ID.
Returns the AMD CPU model identifier, which provides more specific information
about the processor variant within a family.
Requires: ESMI library support
Parameters:
- None
Returns:
- int: CPU model ID
Raises:
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
family = amdsmi.amdsmi_get_cpu_family()
model = amdsmi.amdsmi_get_cpu_model()
print(f"CPU Family: {family}, Model: {model}")
print(f"Full ID: Family 0x{family:x}, Model 0x{model:x}")
finally:
amdsmi.amdsmi_shut_down()
```
"""def amdsmi_get_cpu_socket_count() -> int:
"""
Get number of CPU sockets in the system.
Returns the total number of physical CPU sockets present in the system.
Does not require ESMI library support.
Parameters:
- None
Returns:
- int: Number of CPU sockets
Raises:
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket_count = amdsmi.amdsmi_get_cpu_socket_count()
print(f"System has {socket_count} CPU socket(s)")
finally:
amdsmi.amdsmi_shut_down()
```
"""def amdsmi_get_cpu_cores_per_socket(socket_index: int) -> Dict[str, int]:
"""
Get number of CPU cores per socket.
Returns information about the number of cores in a specific socket.
Does not require ESMI library support.
Parameters:
- socket_index (int): Index of the socket to query (0-based)
Returns:
- dict: Dictionary containing:
- socket_id (int): Socket identifier
- cores_per_socket (int): Number of cores in the socket
Raises:
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket_count = amdsmi.amdsmi_get_cpu_socket_count()
for i in range(socket_count):
info = amdsmi.amdsmi_get_cpu_cores_per_socket(i)
print(f"Socket {info['socket_id']}: {info['cores_per_socket']} cores")
finally:
amdsmi.amdsmi_shut_down()
```
"""def amdsmi_get_cpu_affinity_with_scope(
processor_handle: processor_handle,
scope: AmdSmiAffinityScope
) -> List[int]:
"""
Get CPU affinity for a processor with specified scope.
Returns a list of logical CPU IDs that represent the affinity mask for the
specified processor handle at the given scope level (NUMA node or socket).
Does not require ESMI library support.
Parameters:
- processor_handle: Handle for the target processor (GPU or CPU)
- scope (AmdSmiAffinityScope): Affinity scope level:
- AmdSmiAffinityScope.NUMA_SCOPE: NUMA node scope
- AmdSmiAffinityScope.SOCKET_SCOPE: Socket scope
Returns:
- List[int]: List of logical CPU IDs in the affinity set
Raises:
- AmdSmiParameterException: If processor_handle or scope is invalid
- AmdSmiLibraryException: On query failure
Example:
```python
import amdsmi
from amdsmi import AmdSmiAffinityScope
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
sockets = amdsmi.amdsmi_get_cpusocket_handles()
for socket in sockets:
# Get NUMA-scoped affinity
numa_cpus = amdsmi.amdsmi_get_cpu_affinity_with_scope(
socket, AmdSmiAffinityScope.NUMA_SCOPE
)
print(f"Socket NUMA affinity: CPUs {numa_cpus}")
# Get socket-scoped affinity
socket_cpus = amdsmi.amdsmi_get_cpu_affinity_with_scope(
socket, AmdSmiAffinityScope.SOCKET_SCOPE
)
print(f"Socket affinity: CPUs {socket_cpus}")
finally:
amdsmi.amdsmi_shut_down()
```
"""Monitor power, temperature, and energy for all CPU sockets:
import amdsmi
import time
# Initialize for CPU monitoring
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
sockets = amdsmi.amdsmi_get_cpusocket_handles()
print(f"Found {len(sockets)} CPU socket(s)\n")
for i, socket in enumerate(sockets):
print(f"=== Socket {i} ===")
# Power
power_str = amdsmi.amdsmi_get_cpu_socket_power(socket)
power_mw = int(power_str.split()[0])
power_w = power_mw / 1000
print(f"Power: {power_w:.2f} W")
# Power cap
cap_str = amdsmi.amdsmi_get_cpu_socket_power_cap(socket)
cap_mw = int(cap_str.split()[0])
cap_w = cap_mw / 1000
print(f"Power Cap: {cap_w:.2f} W")
# Temperature
temp_str = amdsmi.amdsmi_get_cpu_socket_temperature(socket)
temp_c = int(temp_str.split()[0])
print(f"Temperature: {temp_c}°C")
# Socket energy
energy_str = amdsmi.amdsmi_get_cpu_socket_energy(socket)
energy_j = float(energy_str.split()[0])
print(f"Energy Counter: {energy_j:.2f} J\n")
finally:
amdsmi.amdsmi_shut_down()Monitor boost limits for all cores:
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
sockets = amdsmi.amdsmi_get_cpusocket_handles()
for sock_idx, socket in enumerate(sockets):
print(f"\n=== Socket {sock_idx} ===")
cores = amdsmi.amdsmi_get_cpucore_handles(socket)
print(f"Cores: {len(cores)}")
print("\nCore Boost Limits:")
for core_idx, core in enumerate(cores):
boost_str = amdsmi.amdsmi_get_cpu_core_boostlimit(core)
boost_mhz = int(boost_str.split()[0])
boost_ghz = boost_mhz / 1000
print(f" Core {core_idx:2d}: {boost_ghz:.2f} GHz")
finally:
amdsmi.amdsmi_shut_down()Calculate power consumption over time:
import amdsmi
import time
def measure_socket_power(socket, duration=5):
"""Measure average power consumption over time."""
# Initial reading
energy1_str = amdsmi.amdsmi_get_cpu_socket_energy(socket)
energy1_j = float(energy1_str.split()[0])
time1 = time.time()
# Wait
time.sleep(duration)
# Final reading
energy2_str = amdsmi.amdsmi_get_cpu_socket_energy(socket)
energy2_j = float(energy2_str.split()[0])
time2 = time.time()
# Calculate
energy_consumed = energy2_j - energy1_j
actual_duration = time2 - time1
avg_power = energy_consumed / actual_duration
return {
'energy_j': energy_consumed,
'duration_s': actual_duration,
'avg_power_w': avg_power
}
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
print("Measuring power consumption for 5 seconds...")
result = measure_socket_power(socket, 5)
print(f"Energy consumed: {result['energy_j']:.2f} J")
print(f"Duration: {result['duration_s']:.2f} s")
print(f"Average power: {result['avg_power_w']:.2f} W")
finally:
amdsmi.amdsmi_shut_down()Display comprehensive CPU metrics:
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Get comprehensive metrics
metrics = amdsmi.amdsmi_get_hsmp_metrics_table(socket)
print("=== HSMP Metrics ===\n")
# Temperature
print("Temperature:")
print(f" Max Socket: {metrics['max_socket_temperature']:.1f}°C")
print(f" Max VR: {metrics['max_vr_temperature']:.1f}°C")
print(f" Max HBM: {metrics['max_hbm_temperature']:.1f}°C")
# Power
print("\nPower:")
print(f" Current: {metrics['socket_power']:.2f} W")
print(f" Limit: {metrics['socket_power_limit']:.2f} W")
print(f" Max Limit: {metrics['max_socket_power_limit']:.2f} W")
# Frequencies
print("\nFrequencies:")
print(f" Core Clock Limit: {metrics['cclk_frequency_limit']} MHz")
print(f" GFX Clock Limit: {metrics['gfx_frequency_limit']} MHz")
print(f" Fabric Clock: {metrics['fclk_frequency']} MHz")
print(f" Memory Clock: {metrics['uclk_frequency']} MHz")
# Utilization
print("\nUtilization:")
print(f" Socket C0 Residency: {metrics['socket_c0_residency']}%")
print(f" GFX Busy: {metrics['socket_gfx_busy']}%")
print(f" DRAM Bandwidth: {metrics['dram_bandwidth_utilization']}%")
# Energy accumulators
print("\nEnergy Accumulators:")
print(f" Socket: {metrics['socket_energy_acc']:.2f}")
print(f" CCD: {metrics['ccd_energy_acc']:.2f}")
print(f" HBM: {metrics['hbm_energy_acc']:.2f}")
finally:
amdsmi.amdsmi_shut_down()Display CPU system configuration:
import amdsmi
from amdsmi import AmdSmiAffinityScope
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
# System info
family = amdsmi.amdsmi_get_cpu_family()
model = amdsmi.amdsmi_get_cpu_model()
socket_count = amdsmi.amdsmi_get_cpu_socket_count()
print("=== System Configuration ===\n")
print(f"CPU Family: {family} (0x{family:x})")
print(f"CPU Model: {model} (0x{model:x})")
print(f"Sockets: {socket_count}")
# Per-socket info
for i in range(socket_count):
info = amdsmi.amdsmi_get_cpu_cores_per_socket(i)
print(f"\nSocket {info['socket_id']}:")
print(f" Cores: {info['cores_per_socket']}")
# Get socket handle and affinity
sockets = amdsmi.amdsmi_get_cpusocket_handles()
if i < len(sockets):
socket = sockets[i]
# CPU affinity
numa_cpus = amdsmi.amdsmi_get_cpu_affinity_with_scope(
socket, AmdSmiAffinityScope.NUMA_SCOPE
)
print(f" NUMA CPUs: {numa_cpus[:4]}..." if len(numa_cpus) > 4 else numa_cpus)
finally:
amdsmi.amdsmi_shut_down()Set and monitor CPU power limits:
import amdsmi
amdsmi.amdsmi_init(amdsmi.AmdSmiInitFlags.INIT_AMD_CPUS)
try:
socket = amdsmi.amdsmi_get_cpusocket_handles()[0]
# Get current settings
current_cap_str = amdsmi.amdsmi_get_cpu_socket_power_cap(socket)
current_cap_mw = int(current_cap_str.split()[0])
current_cap_w = current_cap_mw / 1000
print(f"Current power cap: {current_cap_w:.2f} W")
# Set new power cap (example: 65W)
# NOTE: This requires appropriate privileges
new_cap_w = 65.0
new_cap_mw = int(new_cap_w * 1000)
try:
amdsmi.amdsmi_set_cpu_socket_power_cap(socket, new_cap_mw)
print(f"Power cap set to: {new_cap_w:.2f} W")
# Verify
verify_cap_str = amdsmi.amdsmi_get_cpu_socket_power_cap(socket)
verify_cap_mw = int(verify_cap_str.split()[0])
verify_cap_w = verify_cap_mw / 1000
print(f"Verified power cap: {verify_cap_w:.2f} W")
except Exception as e:
print(f"Failed to set power cap (may require root): {e}")
finally:
amdsmi.amdsmi_shut_down()CPU affinity scope enumeration:
class AmdSmiAffinityScope(IntEnum):
"""
CPU affinity scope levels for querying processor affinity.
"""
NUMA_SCOPE = ... # NUMA node scope affinity
SOCKET_SCOPE = ... # Socket scope affinityamdsmi_get_cpu_socket_count, amdsmi_get_cpu_cores_per_socket, amdsmi_get_cpu_affinity_with_scopeINIT_AMD_CPUS or INIT_ALL_PROCESSORS flag for CPU monitoringamdsmi_shut_down() to properly release resources