旧版本的 x64 处理器不支持用于执行原子 128 位内存交换的 cmpxchg16b 指令,但似乎新版本的处理器已经支持该指令好几年了。我遇到装有旧处理器且缺少该指令的 64 位机器的可能性有多大?
答案1
您正在查看的是早期的 AMD 64 位处理器,早于 Rev F(当时他们转向了 DDR2 内存)。我认为,也有一些早期的 D 步进 Intel Noconas 不支持它,但这些比较少见。
答案2
我没有关于某类 CPU 普及程度的数据,因此无法直接回答您的问题。不过,您可以CMPXCHG16B
通过检查是CPUID.01h.ECX.bit13
(1
可用)还是0
(不可用)来了解 CPU 是否支持。
还要注意,英特尔的手册建议,要以原子方式执行该指令,您需要将其与前缀结合起来LOCK
。
答案3
CPU 中的支持可能实际上还不够,因为有些Core 2 用户在 Windows 8.1 发布时发现,尤其是那些拥有 Intel DP35DP 主板的人。我还不确定主板上的什么会阻止 CMPXCHG16B 工作。可能可以通过 BIOS 禁用功能检测位。总结一下 Yuhong Bao 的博客对此的看法,早期的 Core 2 芯片(45nm Core 2 的 E0/R0 步进)中有一个处理器勘误表,导致其功能通过 CPUID 被错误报告。据我所知,可以通过 BIOS/微代码更新来解决这个问题。