AMD System Management Interface (AMD SMI) Go library for unified GPU and CPU management and monitoring
pkg:github/radeonopencompute/amdsmi@6.4.x
npx @tessl/cli install tessl/go-amdsmi@6.4.0The 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 failure