6

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

我有几个关于它们的一般性问题:

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

5 回答 5

9
  1. 是和否:CPU 会认为它们是无效的,但如果程序检查 CPU 是否支持这些指令,那么它可以回退到不使用这些指令的版本,从而允许程序继续运行。
  2. 该程序必须使用更“基本”的指令提供替代实现,并知道何时使用哪个指令。
  3. 由于该程序可以检查 CPU,因此可以立即获得好处,但是当然,如​​果您的用户使用不支持这些指令的 CPU,他们将看不到任何好处。
  4. 这将完全取决于编译器和优化器。一些指令集可能被认为足够老,编译器将始终使用它们,除非你告诉它不要这样做,而另一些则相反:你必须告诉编译器使用它们。它是否也会自动创建回退也将取决于编译器。
于 2010-03-27T17:09:10.640 回答
2

为了详细说明 Michael Madsen 对问题 4 的回答,GCC 默认为 i386 处理器生成代码。-march它提供了一个名为(也称为)的标志-mcpu,用于确定编译器将发出哪种指令。Microsoft 的cl.exe提供/arch:/Gx标志用于相同目的。

该标志还影响指令的排序方式,因为不同的 CPU 执行给定代码的速度可能相对较慢或较快,具体取决于指令出现的顺序。

我不知道有任何静态编译器会创建自动功能集后备代码。通常这必须由程序员明确地完成。但好消息是,程序员不一定是你;例如,liboil(优化的内部循环)库将在运行时根据运行它的机器选择要运行的最佳代码。

于 2010-03-27T17:22:32.643 回答
1

MMX 自 1996 年就出现了,SSE 于 1999 年问世,SSE2 于 2001 年与 Pentium 4 一起首次亮相。我认为可以安全地假设您将使用的任何 CPU 都具有 MMX 和 SSE,并且可能还有 SSE2。3DNOW 我认为只有 AMD,所以不要指望这些指令可用。

于 2010-03-27T17:19:39.930 回答
1
  1. 如果某些程序使用例如 SSE 指令,它可以在不支持 SSE 的 CPU 上运行吗?

不会。但通常这通常会产生陷阱或异常,并且陷阱/中断处理程序可以在需要时对其进行处理。

例如,很久以前的软件通常包含 x87 的代码。如果有 x87 协处理器,该指令在硬件中可以正常运行,但如果计算机没有 x87 协处理器,则会产生一个陷阱,之后该指令将在软件中处理并正常返回结果。请参阅MS-DOS 中 x87 浮点仿真的协议是什么?

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

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

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

  1. 当我编译一个带有优化的 C++ 程序时,这是否意味着它将使用一些新指令?(我知道这取决于许多因素,尤其是代码,但我想要一些一般性的答案)或者它们主要是为用 asm 编写的程序保留的?

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

现代编译器支持,因此它们会检测常见的习语并对其进行优化。您只需要重新编译以利用新的指令集。但是对于复杂的情况,您仍然需要使用 SIMD 内在函数进行手动优化

如果您使用外部库,当库更新以支持新指令集时,您将自动获得速度提升,即使您对程序不做任何事情

于 2013-08-15T14:03:58.640 回答
1

包含新指令的可执行文件只能在支持这些新指令的 CPU 上执行。您可以将编译器配置为针对特定 CPU 进行编译。

于 2010-03-27T17:08:37.710 回答