AMD System Management Interface (AMD SMI) Go library for unified GPU and CPU management and monitoring
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
The AMD System Management Interface (AMD SMI) Go package provides Go bindings for AMD GPU and CPU monitoring and management in high-performance computing environments. This package offers unified access to GPU performance metrics, power monitoring, thermal sensors, and CPU management through a native Go interface.
import "path/to/goamdsmi"Note: This is a CGO package that requires the AMD SMI C library to be installed and accessible during compilation.
package main
import (
"fmt"
"log"
)
func main() {
// Initialize GPU monitoring
if !goamdsmi.GO_gpu_init() {
log.Fatal("Failed to initialize AMD SMI for GPU")
}
defer func() {
if !goamdsmi.GO_gpu_shutdown() {
log.Println("Warning: Failed to shutdown GPU monitoring")
}
}()
// Get number of monitor devices
numGPUs := goamdsmi.GO_gpu_num_monitor_devices()
fmt.Printf("Found %d GPU(s)\n", numGPUs)
if numGPUs > 0 {
// Get device information for first GPU
deviceName := goamdsmi.GO_gpu_dev_name_get(0)
fmt.Printf("Device 0: %s\n", C.GoString(deviceName))
// Get power consumption
power := goamdsmi.GO_gpu_dev_power_get(0)
fmt.Printf("Power: %d mW\n", power)
// Get GPU utilization
utilization := goamdsmi.GO_gpu_dev_gpu_busy_percent_get(0)
fmt.Printf("GPU utilization: %d%%\n", utilization)
}
// Initialize CPU monitoring if needed
if goamdsmi.GO_cpu_init() {
defer func() {
// CPU shutdown function may not be explicitly available
}()
numSockets := goamdsmi.GO_cpu_number_of_sockets_get()
fmt.Printf("Found %d CPU socket(s)\n", numSockets)
}
}The Go AMD SMI package follows a CGO-based architecture:
GO_gpu_ for GPU monitoring and controlGO_cpu_ for CPU monitoring (ESMI)The package provides a direct Go interface to AMD hardware without complex abstractions, optimized for performance monitoring applications.
Core system initialization and device enumeration for AMD GPUs and CPUs.
func GO_gpu_init() bool
func GO_gpu_shutdown() bool
func GO_gpu_num_monitor_devices() uint
func GO_cpu_init() bool
func GO_cpu_number_of_sockets_get() uint
func GO_cpu_number_of_threads_get() uint
func GO_cpu_threads_per_core_get() uintReal-time monitoring of GPU utilization, clock frequencies, memory usage, and performance metrics.
func GO_gpu_dev_gpu_busy_percent_get(i int) C.uint32_t
func GO_gpu_dev_gpu_memory_busy_percent_get(i int) C.uint64_t
func GO_gpu_dev_gpu_clk_freq_get_sclk(i int) C.uint64_t
func GO_gpu_dev_gpu_clk_freq_get_mclk(i int) C.uint64_t
func GO_gpu_dev_perf_level_get(i int) C.uint32_t
func GO_gpu_dev_overdrive_level_get(i int) C.uint32_t
func GO_gpu_dev_mem_overdrive_level_get(i int) C.uint32_tPower consumption monitoring and thermal sensors for GPU devices.
func GO_gpu_dev_power_get(i int) C.uint64_t
func GO_gpu_dev_power_cap_get(i int) C.uint64_t
func GO_gpu_dev_temp_metric_get(i int, sensor int, metric int) C.uint64_tHardware identification and device properties for GPU devices.
func GO_gpu_dev_name_get(i int) *C.char
func GO_gpu_dev_id_get(i int) C.uint16_t
func GO_gpu_dev_pci_id_get(i int) C.uint64_t
func GO_gpu_dev_vbios_version_get(i int) *C.char
func GO_gpu_dev_vendor_name_get(i int) *C.charGPU memory usage monitoring and memory statistics.
func GO_gpu_dev_gpu_memory_usage_get(i int) C.uint64_t
func GO_gpu_dev_gpu_memory_total_get(i int) C.uint64_tGPU frequency ranges and performance level monitoring.
func GO_gpu_od_volt_freq_range_min_get_sclk(i int) C.uint64_t
func GO_gpu_od_volt_freq_range_min_get_mclk(i int) C.uint64_t
func GO_gpu_od_volt_freq_range_max_get_sclk(i int) C.uint64_t
func GO_gpu_od_volt_freq_range_max_get_mclk(i int) C.uint64_tNote: Advanced topology and RAS features are not exposed in the Go interface. This capability is primarily available through the C++ API.
Note: Event and notification features are not exposed in the Go interface. This capability is primarily available through the C++ API.
CPU socket and core monitoring for energy, power, and frequency limits.
func GO_cpu_core_energy_get(i int) C.uint64_t
func GO_cpu_core_boostlimit_get(i int) C.uint32_t
func GO_cpu_socket_energy_get(i int) C.uint64_t
func GO_cpu_socket_power_get(i int) C.uint32_t
func GO_cpu_socket_power_cap_get(i int) C.uint32_t
func GO_cpu_prochot_status_get(i int) C.uint32_tThe Go interface uses simple error handling patterns:
bool (true for success, false for failure)0xFFFF for uint16 functions on failure0xFFFFFFFF for uint32 functions on failure0xFFFFFFFFFFFFFFFF for uint64 functions on failure"NA" string for char* functions on failureInstall with Tessl CLI
npx tessl i tessl/go-amdsmipkg:github/radeonopencompute/amdsmi@6.4.x