每一代新一代CPU都会引入一些新的指令集,即MMX,3DNOW,SSE等。
我对他们几乎没有一般性问题:
答案 0 :(得分:8)
1)是和否:CPU会认为它们无效,但如果程序检查CPU是否支持这些指令,那么它可以回退到不使用这些指令的版本,允许程序为无论如何都要跑。
2)程序必须使用更“基本”的指令提供替代实现,并知道何时使用哪一个。
3)由于程序可以检查CPU,现在可以获得好处,但当然,如果您的用户使用不支持这些指令的CPU,他们将看不到任何好处。
4)这完全取决于编译器和优化器。一些指令集可能被认为足够大,以至于编译器将始终使用它们,除非你告诉它不要,而其他指令集则相反:你必须告诉编译器使用它们。它是否会自动创建回退也将取决于编译器。
答案 1 :(得分:2)
详细说明Michael Madsen对问题4的回答,GCC默认为i386处理器生成代码。它提供了一个名为-march
的标志(也称为-mcpu
),用于确定编译器将发出哪种指令。 Microsoft cl.exe
为同一目的提供/arch:
和/Gx
标记。
该标志还会影响指令的排序方式,因为不同的CPU可以相对较慢或更快地执行给定的代码段,具体取决于指令的显示顺序。
我不知道任何会创建自动功能集回退代码的静态编译器。通常必须由程序员明确地完成。但好消息是程序员不一定是你;例如,liboil
库(Optimized Inner Loops)将在运行时根据运行的机器选择要运行的最佳代码。
答案 2 :(得分:1)
包含新指令的可执行文件只能在支持这些新指令的CPU上执行。您可以将编译器配置为针对特定CPU进行编译。
答案 3 :(得分:1)
MMX自1996年以来一直存在,SSE于1999年问世,SSE2于2001年首次亮相Pentium 4.我认为可以安全地假设您将使用的任何CPU都有MMX和SSE,可能还有SSE2。 3DNOW我认为只是AMD,所以不要指望这些指令可用。
答案 4 :(得分:1)
- 如果某些程序使用例如SSE指令,它是否可以在不支持SSE的CPU上运行?
醇>
没有。但是通常这通常会生成陷阱或异常,并且陷阱/中断处理程序可以在需要时处理它。
例如很久以前,软件通常包含x87的代码。如果x87协处理器存在,该指令将在硬件中正常运行,但如果计算机缺少x87协处理器,则它将生成一个陷阱,之后该指令将在软件中处理并返回结果正常。见What is the protocol for x87 floating point emulation in MS-DOS?
Hackintosh的第一个版本也使用它来模拟不支持该指令集的CPU上的SSE2。当然表现很糟糕,但它会运行。
- 如果没有,这是否意味着这些新指令的真正性能影响将在几年之后,大多数CPU将支持此类技术(因此不存在任何不兼容性)?
醇>
是。但几年后,也许软件需要更新,对吧?对于关键性能软件,可能需要重写以利用新指令集。对于其他一些人来说,性能的提升可能并不明显
- 当我编译一个带有优化的C ++程序时,是否意味着它会使用一些新的指令? (我知道这取决于很多因素,特别是在代码上,但我想要一些一般的答案)或者它们主要用于用asm编写的程序?
醇>
取决于您在编译时传递给它的编译器和选项。
现代编译器支持auto-vectorization所以他们detect common idioms and optimize it。您只需重新编译即可利用新的指令集。但对于复杂的情况,您仍然需要使用SIMD内在函数手动优化
如果您使用外部库,即使您没有对您的程序执行任何操作,当更新库以支持新指令集时,您也会自动获得速度提升