Get CPU Information with Pure Golang Code
Package cpuid provides information about the CPU running the current program. You can access the CPU information by accessing the shared CPU variable with this library.
CPU features are detected on startup, and kept for fast access through the life of the application. Currently x86 / x64 (AMD64/i386) and ARM (ARM64) is supported, and no external C (cgo) code is used, which should make the library very easy to use.
installing
go get -u github.com/klauspost/cpuid/v2 using modules.
Drop v2
for others.
Usage
The cpuid.CPU
provides access to CPU features. Use cpuid.CPU.Supports()
to check for CPU features. A faster cpuid.CPU.Has()
is provided which will usually be inlined by the gc compiler.
Note that for some cpu/os combinations some features will not be detected. amd64
has rather good support and should work reliably on all platforms.
Note that hypervisors may not pass through all CPU features.
Example
package main
import (
"fmt"
"strings"
. "github.com/klauspost/cpuid/v2"
)
func main() {
// Print basic CPU information:
fmt.Println("Name:", CPU.BrandName)
fmt.Println("PhysicalCores:", CPU.PhysicalCores)
fmt.Println("ThreadsPerCore:", CPU.ThreadsPerCore)
fmt.Println("LogicalCores:", CPU.LogicalCores)
fmt.Println("Family", CPU.Family, "Model:", CPU.Model, "Vendor ID:", CPU.VendorID)
fmt.Println("Features:", strings.Join(CPU.FeatureSet(), ","))
fmt.Println("Cacheline bytes:", CPU.CacheLine)
fmt.Println("L1 Data Cache:", CPU.Cache.L1D, "bytes")
fmt.Println("L1 Instruction Cache:", CPU.Cache.L1I, "bytes")
fmt.Println("L2 Cache:", CPU.Cache.L2, "bytes")
fmt.Println("L3 Cache:", CPU.Cache.L3, "bytes")
fmt.Println("Frequency", CPU.Hz, "hz")
// Test if we have these specific features:
if CPU.Supports(SSE, SSE2) {
fmt.Println("We have Streaming SIMD 2 Extensions")
}
}
Sample output:
Name: AMD EPYC 7B12
PhysicalCores: 4
ThreadsPerCore: 2
LogicalCores: 8
Family 23 Model: 49 Vendor ID: AMD
Features: ADX,AESNI,AVX,AVX2,BMI1,BMI2,CLMUL,CLZERO,CMOV,CMPXCHG8,CX16,F16C,FMA3,FXSR,FXSROPT,HTT,HYPERVISOR,LAHF,LZCNT,MMX,MMXEXT,MOVBE,NX,OSXSAVE,POPCNT,RDRAND,RDSEED,RDTSCP,SCE,SHA,SSE,SSE2,SSE3,SSE4,SSE42,SSE4A,SSSE3,X87,XGETBV1,XSAVE,XSAVEC,XSAVEOPT
Cacheline bytes: 64
L1 Data Cache: 32768 bytes
L1 Instruction Cache: 32768 bytes
L2 Cache: 524288 bytes
L3 Cache: 16777216 bytes
Frequency 0 hz
We have Streaming SIMD 2 Extensions
View cpuid at github https://github.com/klauspost/cpuid
See Also
- Generate User's Avatars with Pure Golang
- The way Convert an integer to a byte array with golang
- Do net.Conn unit test using net.Pipe in Golang
- Deal with sticky tcp/socket packet in Golang
- Golang upnp/ssdp DiscoverDevices example