cpuid
cpuid 包提供了有关当前程序运行的 CPU 的信息。
CPU 特性在启动时被检测,并在应用程序的整个生命周期中保持快速访问。目前支持 x86 / x64 (AMD64/i386) 和 ARM (ARM64),且不使用外部 C (cgo) 代码,这使得该库非常易于使用。
你可以通过访问 cpuid 库的共享 CPU 变量来获取 CPU 信息。
包主页: https://github.com/klauspost/cpuid
安装
使用模块时执行 go get -u github.com/klauspost/cpuid/v2
。
其他情况下去掉 v2
。
安装二进制文件:
go install github.com/klauspost/cpuid/v2/cmd/cpuid@latest
或从发布页面下载二进制文件: https://github.com/klauspost/cpuid/releases
Homebrew
对于 macOS/Linux 用户,可以通过 brew 安装
$ brew install cpuid
示例
package main
import (
"fmt"
"strings"
. "github.com/klauspost/cpuid/v2"
)
func main() {
// 打印基本的 CPU 信息:
fmt.Println("名称:", CPU.BrandName)
fmt.Println("物理核心数:", CPU.PhysicalCores)
fmt.Println("每核心线程数:", CPU.ThreadsPerCore)
fmt.Println("逻辑核心数:", CPU.LogicalCores)
fmt.Println("系列", CPU.Family, "型号:", CPU.Model, "厂商 ID:", CPU.VendorID)
fmt.Println("特性:", strings.Join(CPU.FeatureSet(), ","))
fmt.Println("缓存行大小:", CPU.CacheLine)
fmt.Println("L1 数据缓存:", CPU.Cache.L1D, "字节")
fmt.Println("L1 指令缓存:", CPU.Cache.L1I, "字节")
fmt.Println("L2 缓存:", CPU.Cache.L2, "字节")
fmt.Println("L3 缓存:", CPU.Cache.L3, "字节")
fmt.Println("频率", CPU.Hz, "赫兹")
// 测试是否有这些特定特性:
if CPU.Supports(SSE, SSE2) {
fmt.Println("我们有流式 SIMD 2 扩展")
}
}
示例输出:
>go run main.go
名称: AMD Ryzen 9 3950X 16-Core Processor
物理核心数: 16
每核心线程数: 2
逻辑核心数: 32
系列 23 型号: 113 厂商 ID: AMD
特性: ADX,AESNI,AVX,AVX2,BMI1,BMI2,CLMUL,CMOV,CX16,F16C,FMA3,HTT,HYPERVISOR,LZCNT,MMX,MMXEXT,NX,POPCNT,RDRAND,RDSEED,RDTSCP,SHA,SSE,SSE2,SSE3,SSE4,SSE42,SSE4A,SSSE3
缓存行大小: 64
L1 数据缓存: 32768 字节
L1 指令缓存: 32768 字节
L2 缓存: 524288 字节
L3 缓存: 16777216 字节
频率 0 赫兹
我们有流式 SIMD 2 扩展
使用
cpuid.CPU
提供了对 CPU 特性的访问。使用 cpuid.CPU.Supports()
来检查 CPU 特性。
提供了一个更快的 cpuid.CPU.Has()
,通常会被 gc 编译器内联。
要测试大量特性,可以使用 f := CombineFeatures(CMOV, CMPXCHG8, X87, FXSR, MMX, SYSCALL, SSE, SSE2)
等来组合它们。
这可以与 cpuid.CPU.HasAll(f)
一起使用,以快速测试是否支持所有特性。
注意,对于某些 CPU/OS 组合,某些特性可能无法检测到。
amd64
的支持相当好,应该在所有平台上可靠工作。
请注意,虚拟机管理程序可能不会将所有 CPU 特性传递给客户操作系统, 所以即使你的主机支持某个特性,在客户机上也可能看不到。
arm64 特性检测
并非所有操作系统都直接提供 ARM 特性, 对于其他系统,也没有安全的方法来实现这一点。
目前 arm64/linux
和 arm64/freebsd
应该相当可靠。
arm64/darwin
添加了 M1 处理器预期的特性,但仍有许多特性未被检测到。
如果你能控制你的部署环境,可以使用 DetectARM()
,
它将检测 CPU 特性,但如果操作系统不拦截调用,可能会崩溃。
可以添加 -cpu.arm
标志来检测不安全的 ARM 特性。详见下文。
注意,目前在 ARM 上只检测特性, 目前没有其他额外信息可用。
标志
可以添加影响 CPU 检测的标志。
为此提供了 Flags()
命令。
这必须在 flag.Parse()
之前调用,并且在解析标志后必须调用 Detect()
。
这意味着在 init()
函数中使用的任何检测都不会包含这些标志。
示例:
package main
import (
"flag"
"fmt"
"strings"
"github.com/klauspost/cpuid/v2"
)
func main() {
cpuid.Flags()
flag.Parse()
cpuid.Detect()
// 测试是否有这些特定特性:
if cpuid.CPU.Supports(cpuid.SSE, cpuid.SSE2) {
fmt.Println("我们有流式 SIMD 2 扩展")
}
}
命令行
从以下地址下载二进制文件: https://github.com/klauspost/cpuid/releases
从源代码安装:
go install github.com/klauspost/cpuid/v2/cmd/cpuid@latest
示例
λ cpuid
名称:AMD Ryzen 9 3950X 16核处理器
厂商字符串:AuthenticAMD
厂商ID:AMD
物理核心数:16
每核心线程数:2
逻辑核心数:32
CPU系列23 型号:113
功能:ADX,AESNI,AVX,AVX2,BMI1,BMI2,CLMUL,CLZERO,CMOV,CMPXCHG8,CPBOOST,CX16,F16C,FMA3,FXSR,FXSROPT,HTT,HYPERVISOR,LAHF,LZCNT,MCAOVERFLOW,MMX,MMXEXT,MOVBE,NX,OSXSAVE,POPCNT,RDRAND,RDSEED,RDTSCP,SCE,SHA,SSE,SSE2,SSE3,SSE4,SSE42,SSE4A,SSSE3,SUCCOR,X87,XSAVE
微架构等级:3
缓存行大小:64字节
一级指令缓存:32768字节
一级数据缓存:32768字节
二级缓存:524288字节
三级缓存:16777216字节
JSON输出:
λ cpuid --json
{
"品牌名称": "AMD Ryzen 9 3950X 16核处理器",
"厂商ID": 2,
"厂商字符串": "AuthenticAMD",
"物理核心数": 16,
"每核心线程数": 2,
"逻辑核心数": 32,
"系列": 23,
"型号": 113,
"缓存行": 64,
"频率": 0,
"加速频率": 0,
"缓存": {
"一级指令": 32768,
"一级数据": 32768,
"二级": 524288,
"三级": 16777216
},
"SGX": {
"可用": false,
"启动控制": false,
"支持SGX1": false,
"支持SGX2": false,
"非64位最大飞地大小": 0,
"64位最大飞地大小": 0,
"EPC区段": null
},
"功能": [
"ADX",
"AESNI",
"AVX",
"AVX2",
"BMI1",
"BMI2",
"CLMUL",
"CLZERO",
"CMOV",
"CMPXCHG8",
"CPBOOST",
"CX16",
"F16C",
"FMA3",
"FXSR",
"FXSROPT",
"HTT",
"HYPERVISOR",
"LAHF",
"LZCNT",
"MCAOVERFLOW",
"MMX",
"MMXEXT",
"MOVBE",
"NX",
"OSXSAVE",
"POPCNT",
"RDRAND",
"RDSEED",
"RDTSCP",
"SCE",
"SHA",
"SSE",
"SSE2",
"SSE3",
"SSE4",
"SSE42",
"SSE4A",
"SSSE3",
"SUCCOR",
"X87",
"XSAVE"
],
"X64等级": 3
}
检查CPU微架构等级
λ cpuid --check-level=3
2022/03/18 17:04:40 AMD Ryzen 9 3950X 16核处理器
2022/03/18 17:04:40 支持微架构等级3。最高等级为3。
退出代码 0
λ cpuid --check-level=4
2022/03/18 17:06:18 AMD Ryzen 9 3950X 16核处理器
2022/03/18 17:06:18 不支持微架构等级4。最高等级为3。
退出代码 1
可用标志
x86 & amd64
特性标志 | 描述 |
---|---|
ADX | Intel ADX(多精度加进位指令扩展) |
AESNI | 高级加密标准新指令 |
AMD3DNOW | AMD 3DNOW |
AMD3DNOWEXT | AMD 3DNow扩展 |
AMXBF16 | 对BFLOAT16数字进行平铺计算操作 |
AMXINT8 | 对8位整数进行平铺计算操作 |
AMXFP16 | 对FP16数字进行平铺计算操作 |
AMXTILE | 平铺架构 |
APX_F | Intel APX |
AVX | AVX函数 |
AVX10 | 如果设置,表示支持Intel AVX10融合向量指令集架构 |
AVX10_128 | 如果设置,表示存在AVX10 128位向量支持 |
AVX10_256 | 如果设置,表示存在AVX10 256位向量支持 |
AVX10_512 | 如果设置,表示存在AVX10 512位向量支持 |
AVX2 | AVX2函数 |
AVX512BF16 | AVX-512 BFLOAT16指令 |
AVX512BITALG | AVX-512位算法 |
AVX512BW | AVX-512字节和字指令 |
AVX512CD | AVX-512冲突检测指令 |
AVX512DQ | AVX-512双字和四字指令 |
AVX512ER | AVX-512指数和倒数指令 |
AVX512F | AVX-512基础 |
AVX512FP16 | AVX-512 FP16指令 |
AVX512IFMA | AVX-512整数融合乘加指令 |
AVX512PF | AVX-512预取指令 |
AVX512VBMI | AVX-512向量位操作指令 |
AVX512VBMI2 | AVX-512向量位操作指令,版本2 |
AVX512VL | AVX-512向量长度扩展 |
AVX512VNNI | AVX-512向量神经网络指令 |
AVX512VP2INTERSECT | AVX-512 D/Q交集 |
AVX512VPOPCNTDQ | AVX-512向量双字和四字人口统计 |
AVXIFMA | AVX-IFMA指令 |
AVXNECONVERT | AVX-NE-CONVERT指令 |
AVXSLOW | 表示CPU执行2个128位操作而不是1个 |
AVXVNNI | AVX(VEX编码)VNNI神经网络指令 |
AVXVNNIINT8 | AVX-VNNI-INT8指令 |
AVXVNNIINT16 | AVX-VNNI-INT16指令 |
BHI_CTRL | 分支历史注入和内模式分支目标注入 / CVE-2022-0001, CVE-2022-0002 / INTEL-SA-00598 |
BMI1 | 位操作指令集1 |
BMI2 | 位操作指令集2 |
CETIBT | Intel CET间接分支跟踪 |
CETSS | Intel CET影子栈 |
CLDEMOTE | 缓存行降级 |
CLMUL | 无进位乘法 |
CLZERO | 支持CLZERO指令 |
CMOV | i686 CMOV |
CMPCCXADD | CMPCCXADD指令 |
CMPSB_SCADBS_SHORT | 快速短CMPSB和SCASB |
CMPXCHG8 | CMPXCHG8指令 |
CPBOOST | 核心性能提升 |
CPPC | AMD:协作处理器性能控制 |
CX16 | CMPXCHG16B指令 |
EFER_LMSLE_UNS | AMD:=Core::X86::Msr::EFER[LMSLE]不受支持,且必须为零 |
ENQCMD | 入队命令 |
ERMS | 增强型REP MOVSB/STOSB |
F16C | 半精度浮点转换 |
FLUSH_L1D | 刷新L1D缓存 |
FMA3 | Intel FMA 3。不意味着AVX。 |
FMA4 | Bulldozer FMA4函数 |
FP128 | AMD:设置时,内部FP/SIMD执行数据路径为128位宽 |
FP256 | AMD:设置时,内部FP/SIMD执行数据路径为256位宽 |
FSRM | 快速短Rep Mov |
FXSR | FXSAVE, FXRESTOR指令,CR4位9 |
FXSROPT | FXSAVE/FXRSTOR优化 |
GFNI | 伽罗瓦域新指令。根据使用情况可能需要其他特性(AVX, AVX512VL, AVX512F)。 |
HLE | 硬件锁消除 |
HRESET | 如果设置,CPU支持历史重置和IA32_HRESET_ENABLE MSR |
HTT | 超线程(已启用) |
HWA | 支持硬件断言。表示支持MSRC001_10 |
HYBRID_CPU | 此部件具有多种类型的CPU。 |
HYPERVISOR | 此位已被Intel和AMD保留给虚拟机监控程序使用 |
IA32_ARCH_CAP | IA32_ARCH_CAPABILITIES MSR(Intel) |
IA32_CORE_CAP | IA32_CORE_CAPABILITIES MSR |
IBPB | 间接分支受限推测(IBRS)和间接分支预测屏障(IBPB) |
IBRS | AMD:间接分支受限推测 |
IBRS_PREFERRED | AMD:IBRS优先于软件解决方案 |
IBRS_PROVIDES_SMP | AMD: IBRS提供同模式保护 |
IBS | 基于指令的采样(AMD) |
IBSBRNTRGT | 基于指令的采样功能(AMD) |
IBSFETCHSAM | 基于指令的采样功能(AMD) |
IBSFFV | 基于指令的采样功能(AMD) |
IBSOPCNT | 基于指令的采样功能(AMD) |
IBSOPCNTEXT | 基于指令的采样功能(AMD) |
IBSOPSAM | 基于指令的采样功能(AMD) |
IBSRDWROPCNT | 基于指令的采样功能(AMD) |
IBSRIPINVALIDCHK | 基于指令的采样功能(AMD) |
IBS_FETCH_CTLX | AMD: 支持IBS获取控制扩展MSR |
IBS_OPDATA4 | AMD: 支持IBS操作数据4 MSR |
IBS_OPFUSE | AMD: 指示支持IbsOpFuse |
IBS_PREVENTHOST | 支持禁止主机使用IBS |
IBS_ZEN4 | 获取和操作IBS支持Zen4添加的IBS扩展 |
IDPRED_CTRL | IPRED_DIS |
INT_WBINVD | WBINVD/WBNOINVD可中断 |
INVLPGB | 支持NVLPGB和TLBSYNC指令 |
KEYLOCKER | 密钥锁定器 |
KEYLOCKERW | 宽密钥锁定器 |
LAHF | 长模式下的LAHF/SAHF |
LAM | 如果设置,CPU支持线性地址掩码 |
LBRVIRT | LBR虚拟化 |
LZCNT | LZCNT指令 |
MCAOVERFLOW | 支持MCA溢出恢复 |
MCDT_NO | 处理器不表现MXCSR配置相关时序行为,无需缓解 |
MCOMMIT | 支持MCOMMIT指令 |
MD_CLEAR | VERW清除CPU缓冲区 |
MMX | 标准MMX |
MMXEXT | SSE整数函数或AMD MMX扩展 |
MOVBE | MOVBE指令(大端序) |
MOVDIR64B | 作为直接存储移动64字节 |
MOVDIRI | 作为直接存储移动双字 |
MOVSB_ZL | 快速零长度MOVSB |
MPX | Intel MPX(内存保护扩展) |
MOVU | MOVU SSE指令效率更高,应优先于SSE MOVL/MOVH。MOVUPS比MOVLPS/MOVHPS效率更高。MOVUPD比MOVLPD/MOVHPD效率更高 |
MSRIRC | 可用指令退役计数器MSR |
MSRLIST | 读/写模型特定寄存器列表 |
MSR_PAGEFLUSH | 可用页面刷新MSR |
NRIPS | 指示支持在VMEXIT时保存NRIP |
NX | NX(不可执行)位 |
OSXSAVE | 操作系统启用XSAVE |
PCONFIG | 用于Intel多密钥全内存加密的PCONFIG |
POPCNT | POPCNT指令 |
PPIN | AMD: 支持受保护处理器清单号。表示可以启用受保护处理器清单号(PPIN)功能 |
PREFETCHI | PREFETCHIT0/1指令 |
PSFD | 预测性存储转发禁用 |
RDPRU | 支持RDPRU指令 |
RDRAND | 可用RDRAND指令 |
RDSEED | 可用RDSEED指令 |
RDTSCP | RDTSCP指令 |
RRSBA_CTRL | 受限RSB替代 |
RTM | 受限事务内存 |
RTM_ALWAYS_ABORT | 表示加载的微码正在强制RTM中止 |
SERIALIZE | 序列化指令执行 |
SEV | 支持AMD安全加密虚拟化 |
SEV_64BIT | AMD SEV客户端执行仅允许来自64位主机 |
SEV_ALTERNATIVE | 支持AMD SEV替代注入 |
SEV_DEBUGSWAP | 支持SEV-ES客户端的完整调试状态交换 |
SEV_ES | 支持AMD SEV加密状态 |
SEV_RESTRICTED | 支持AMD SEV受限注入 |
SEV_SNP | 支持AMD SEV安全嵌套分页 |
SGX | 软件防护扩展 |
SGXLC | 软件防护扩展启动控制 |
SHA | Intel SHA扩展 |
SME | 支持AMD安全内存加密 |
SME_COHERENT | 强制AMD硬件缓存在加密域间保持一致性 |
SPEC_CTRL_SSBD | 推测性存储绕过禁用 |
SRBDS_CTRL | 可用SRBDS缓解MSR |
SSE | SSE功能 |
SSE2 | P4 SSE功能 |
SSE3 | Prescott SSE3功能 |
SSE4 | Penryn SSE4.1功能 |
SSE42 | Nehalem SSE4.2功能 |
SSE4A | AMD Barcelona微架构SSE4a指令 |
SSSE3 | Conroe SSSE3功能 |
STIBP | 单线程间接分支预测器 |
STIBP_ALWAYSON | AMD: 单线程间接分支预测模式具有增强性能,可以始终保持开启 |
STOSB_SHORT | 快速短STOSB |
SUCCOR | 软件不可纠正错误容纳和恢复能力 |
SVM | AMD安全虚拟机 |
SVMDA | 指示支持SVM解码辅助 |
SVMFBASID | SVM,表示TLB刷新事件(包括CR3写入和CR4.PGE切换)仅刷新当前ASID的TLB条目。还表示支持扩展VMCB TLB_Control |
SVML | AMD SVM锁。指示支持SVM锁 |
SVMNP | AMD SVM嵌套分页 |
SVMPF | SVM暂停拦截过滤器。表示支持暂停拦截过滤器 |
SVMPFT | SVM暂停过滤器阈值。表示支持暂停过滤器周期计数阈值 |
SYSCALL | 系统调用扩展(SCE):SYSCALL和SYSRET指令。 |
SYSEE | SYSENTER和SYSEXIT指令 |
TBM | AMD尾随位操作 |
TDX_GUEST | Intel信任域扩展客户端 |
TLB_FLUSH_NESTED | AMD:刷新包括所有用于客户端转换的嵌套转换 |
TME | Intel全内存加密。支持以下MSR:IA32_TME_CAPABILITY、IA32_TME_ACTIVATE、IA32_TME_EXCLUDE_MASK和IA32_TME_EXCLUDE_BASE。 |
TOPEXT | 拓扑扩展:支持拓扑扩展。表示支持CPUID Fn8000_001D_EAX_x[N:0]-CPUID Fn8000_001E_EDX。 |
TSCRATEMSR | 基于MSR的TSC速率控制。表示支持MSR TSC比率MSRC000_0104 |
TSXLDTRK | Intel TSX暂停加载地址跟踪 |
VAES | 矢量AES。AVX(512)版本需要额外检查。 |
VMCBCLEAN | VMCB清理位。表示支持VMCB清理位。 |
VMPL | 支持AMD VM权限级别 |
VMSA_REGPROT | 支持AMD VMSA寄存器保护 |
VMX | 虚拟机扩展 |
VPCLMULQDQ | 无进位乘法四字。3寄存器版本需要AVX支持。 |
VTE | 支持AMD虚拟透明加密 |
WAITPKG | TPAUSE、UMONITOR、UMWAIT |
WBNOINVD | 回写且不使缓存无效 |
WRMSRNS | 非序列化写入模型特定寄存器 |
X87 | 浮点运算单元 |
XGETBV1 | 支持ECX = 1的XGETBV |
XOP | Bulldozer XOP函数 |
XSAVE | XSAVE、XRESTOR、XSETBV、XGETBV |
XSAVEC | 支持XSAVEC和XRSTOR的压缩形式。 |
XSAVEOPT | 可用XSAVEOPT |
XSAVES | 支持XSAVES/XRSTORS和IA32_XSS |
ARM 特性:
特性标志 | 描述 |
---|---|
AESARM | AES 指令 |
ARMCPUID | 某些 CPU ID 寄存器可在用户级别读取 |
ASIMD | 高级 SIMD |
ASIMDDP | SIMD 点积 |
ASIMDHP | 高级 SIMD 半精度浮点 |
ASIMDRDM | 舍入双精度乘累加/减法(SQRDMLAH/SQRDMLSH) |
ATOMICS | 大系统扩展(LSE) |
CRC32 | CRC32/CRC32C 指令 |
DCPOP | 数据缓存清理至持久点(DC CVAP) |
EVTSTRM | 通用计时器 |
FCMA | 浮点复数加法和乘法 |
FP | 单精度和双精度浮点 |
FPHP | 半精度浮点 |
GPA | 通用指针认证 |
JSCVT | JavaScript 风格双精度转整数转换(FJCVTZS) |
LRCPC | 弱化的释放一致性(LDAPR 等) |
PMULL | 多项式乘法指令(PMULL/PMULL2) |
SHA1 | SHA-1 指令(SHA1C 等) |
SHA2 | SHA-2 指令(SHA256H 等) |
SHA3 | SHA-3 指令(EOR3、RAXI、XAR、BCAX) |
SHA512 | SHA512 指令 |
SM3 | SM3 指令 |
SM4 | SM4 指令 |
SVE | 可扩展向量扩展 |
许可证
本代码以 MIT 许可证发布。有关更多信息,请参阅 LICENSE 文件。