硬件性能计数器并不可靠:x86 上连退休指令数都会飘
来源:web.eece.maine.edu — 2021-03-18
📋 概述
Vincent Weaver 等人测量了 11 种 x86-64 CPU 的硬件性能计数器,发现本应精确、确定的事件(例如退休指令数)在严格受控的环境里依然逐次抖动,甚至超计数。他们定位到根因:iret 中断返回指令被算进了用户态指令数,尽管它运行在内核态,于是计数随中断时机变化而失去确定性。测过的事件中只有不把 iret 计入的那些(条件分支、退休存储等)足够确定,可以直接用于确定性重放与确定性线程库。ARM、IA64、POWER、SPARC 平台的确定性明显更好;x86-64 上的多数变通办法行不通,彻底解决需要重新设计 PMU。
🔑 核心要点
- 理想中性能计数器给出精确确定的结果,现实里 x86-64 上连退休指令数都会逐次变化并超计数。
- 实验覆盖 11 种 x86-64 实现,测量在严格受控环境中完成,排除干扰因素。
- 根因是 iret 被算作用户态指令,使计数依赖中断发生的时机。
- 只有不计 iret 的事件(条件分支、退休存储)足够确定,可用于确定性重放与确定性线程库。
- ARM、IA64、POWER、SPARC 的计数器确定性更好。
- 多数规避手段在 x86-64 上无效,彻底解决需要 PMU 架构层面的重新设计。
💡 金句
本应精确的事件,在 x86-64 机器上会随运行次数变化,并且超计数。
👍 0
👎 0
← 返回 Lobsters 首页