CPU中的新指令集

时间:2010-03-27 16:59:30

标签: cpu simd instruction-set

每一代新一代CPU都会引入一些新的指令集,即MMX,3DNOW,SSE等。

我对他们几乎没有一般性问题:

  1. 如果某些程序使用例如SSE指令,它是否可以在不支持SSE的CPU上运行?
  2. 如果是,是否意味着这些指令将被更改为更多更简单的指令?
  3. 如果没有,这是否意味着这些新指令的真正性能影响将在几年之后,大多数CPU将支持此类技术(因此不存在任何不兼容性)?
  4. 当我编译一个带有优化的C ++程序时,是否意味着它会使用一些新的指令? (我知道这取决于很多因素,特别是代码,但我想要一些一般的答案)。或者它们主要是为用asm编写的程序保留的?

5 个答案:

答案 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)

  
      
  1. 如果某些程序使用例如SSE指令,它是否可以在不支持SSE的CPU上运行?
  2.   

没有。但是通常这通常会生成陷阱或异常,并且陷阱/中断处理程序可以在需要时处理它。

例如很久以前,软件通常包含x87的代码。如果x87协处理器存在,该指令将在硬件中正常运行,但如果计算机缺少x87协处理器,则它将生成一个陷阱,之后该指令将在软件中处理并返回结果正常。见What is the protocol for x87 floating point emulation in MS-DOS?

Hackintosh的第一个版本也使用它来模拟不支持该指令集的CPU上的SSE2。当然表现很糟糕,但它会运行。

  
      
  1. 如果没有,这是否意味着这些新指令的真正性能影响将在几年之后,大多数CPU将支持此类技术(因此不存在任何不兼容性)?
  2.   

是。但几年后,也许软件需要更新,对吧?对于关键性能软件,可能需要重写以利用新指令集。对于其他一些人来说,性能的提升可能并不明显

  
      
  1. 当我编译一个带有优化的C ++程序时,是否意味着它会使用一些新的指令? (我知道这取决于很多因素,特别是在代码上,但我想要一些一般的答案)或者它们主要用于用asm编写的程序?
  2.   

取决于您在编译时传递给它的编译器和选项。

现代编译器支持所以他们detect common idioms and optimize it。您只需重新编译即可利用新的指令集。但对于复杂的情况,您仍然需要使用SIMD内在函数手动优化

如果您使用外部库,即使您没有对您的程序执行任何操作,当更新库以支持新指令集时,您也会自动获得速度提升