耻辱堂汇编
一个开源项目在整理最慢的 x86 指令,突出显示了某些模式——例如 MMIO 访问和非规格化浮点运算——如何让现代 CPU 停顿数毫秒甚至数秒。评论者把这与更广泛的软件性能和延迟问题联系起来,指出抽象层、操作系统输入管线和显示刷新率会让今天的机器尽管吞吐量高得多,却显得比老旧硬件更不灵敏。这个工作既被视为对 CPU 行为的有趣深入剖析,也是理解性能陷阱乃至潜在安全影响的实用资源,例如滥用长时间运行的指令来干扰系统管理中断。
项目及相关工具
- 该仓库被视为一个有趣但严肃的病态 x86 指令与模式目录。
- 它与更广泛的一系列工作有关:对未文档化指令进行 opcode 空间暴力搜索、“仅 mov” 编译器、反汇编中的控制流艺术、二进制可视化工具,以及打破 SMI 的演示。
- 有人会问它发现的是实际的陷阱,还是主要为了好玩;也有人指出其中明确的安全性/可靠性动机。
缓慢指令、MMIO 与体系结构
- 许多最坏情况序列依赖于非规格化浮点运算和 MMIO 交互,尤其是通过 PCIe 和 ACPI I/O 端口。
- 其中一个特别突出的例子是
fxrstor64作用于 MMIO,似乎能够让 PCIe 路径停滞几十秒;讨论指出这类操作缺乏向前推进的保证。 - 有些人觉得基于 MMIO 的技巧是在“作弊”,更喜欢受限于主存的结果;uops.info 被提及为更“纯粹”的指令时序来源。
延迟、吞吐量与用户体验
- 围绕 1 ms 内能放下多少条指令,以及为什么现代系统仍然感觉慢,展开了争论。
- 经典的响应时间阈值(0.1 s “瞬时”、1 s 流畅、10 s 分散注意力)被引用,但也有人指出人类能察觉更小的差异(取决于场景,可能是几十毫秒甚至更少)。
- 讨论了输入管线细节(USB 轮询、显示器刷新、操作系统层);旧系统有时在输入到显示的延迟上明显低于现代软件栈。
- 强调了吞吐量优化(批处理)与延迟之间的区别,而现代设计往往更偏向前者。
软件膨胀与回归
- 提到了软件会膨胀以吞掉硬件收益的规律。
- 抱怨现代 Notepad/MSPaint 改变了长期以来的行为并打破肌肉记忆;一些用户因此避开较新的 Windows 版本。
NOP 语义与微架构吹毛求疵
- 围绕
nop是“什么都不做”还是“递增指令指针”,以及这如何与解码和微架构实现相互作用,展开了长篇争论。 - 讨论涉及传统编码(
XCHG AX,AX)、保留的 NOP,以及对推测性 RIP 处理细节的说明。
计时指令与测量怪癖
- 讨论了
rdtsc的开销;一位评论者提到在某些微架构上大约是 25 个周期,而仓库中报告的更高成本可能反映了许多在飞行中的rdtsc调用彼此干扰。 - 简要对比了
rdtsc/rdtscp作为计时屏障和排序指令的作用。
更底层的技巧与边界情况
- 有人提出利用 TLB 缺失、散布/聚集,甚至页表 / MMU 行为来制造任意长或循环的操作。
- PCIe 被描述为一个分组网络,并指出通过奇特桥接器实现极端延迟在理论上是可能的。