【发布时间】:2026-02-17 07:55:01
【问题描述】:
我了解今天使用最新编译器(GCC、Intel CC、VC 等)编译的所有 x86 (i386) 二进制文件都将在 Intel 386 机器上运行(允许外部依赖,如操作系统函数等),这说明为什么 YouTube 上有视频显示人们在 20 年前的计算机上安装和运行 Windows 7。
但我不明白 ISA 扩展是如何工作的,例如 MMX 和 SSE。如果程序的代码具有扩展指令,但处理器不支持该指令,那么程序肯定会崩溃(可能是处理器中断进入操作系统)。我能想到的唯一解决方案是程序的二进制文件检查是否支持指令,如果不支持,则执行保证每个平台都支持的最低公分母代码,但肯定可以使二进制文件非常大,那么那些是扩展但现在实际上是标准的指令呢,比如浮点运算?这是否意味着执行 FP 操作的每个 i386 二进制文件也包括软件 FP 仿真?
如果一个程序进行指令支持的检查,那么它在哪里进行呢?如果您有一个紧密的循环,那么您不希望它在循环内执行检查。我不相信编译器足够聪明,还不知道如何在每种情况下进行优化,所以缺乏可见的编译器选项很奇怪。
我在我的 VC 项目设置中找不到用于控制指令发射的编译器或链接器的任何设置或选项。有一些关于优化的内容,但没有什么能提供我期望的控制。
AMD 的“3DNow!”又如何呢?延期? 3DNow 旨在成为 MMX 之上的扩展,因此它有一些独特的指令和自身的方面,但我在我的 VC 编译器或链接器设置中找不到对它的任何引用,所以如果我正在编写代码如何我可以让我的编译器使用 3DNow!指令(而不是 MMX)?
此外,关于 3DNow 的 Wikipedia 文章指出,AMD 从其处理器中删除了一些 3DNow 指令 - 如果存在假设这些指令存在的代码,它是否不再有效?
【问题讨论】:
-
实际上,一些 Linux 发行版现在似乎针对 i586 (Pentium) 或 i686 (Pentium Pro)。 phoronix.com/… 中提到了这一点。
-
这能回答你的问题吗? New instruction sets in CPU
标签: x86 simd instruction-set