每个新一代的CPU引入了一套新的指令,即试试吧,3DNOW,SSE等。

我已经有了几个一般性问题有关:

  1. 如果一些程序使用例如SSE指令可以对它进行处理器,不支持SSE?
  2. 如果是,这是否意味着,这些指示将会改变到一些更多的较简单的指令?
  3. 如果不能,它的意思是,真正的性能产生影响的这一新指令将以后几年,当最CPU将支持这种技术(所以不会有任何不兼容的)?
  4. 当我汇编C++程序与优化,这是否意味着就会使用这些新的指令?(我知道,这取决于许多因素,特别是在码,但是我想要的一些一般性的回答).或者是他们保留的大部分用于编写的程序,在asm?
有帮助吗?

解决方案

1)是否:CPU会考虑他们是无效的,但如果程序的检查,如果CPU支持这些指令,那么它可能退回到一个版本,不使用这些指令,允许该程序的运行,无论如何。

2)该项目将提供一个替代的实施采用更多的"基本"的说明,并且知道何时使用哪一个。

3)由于程序可以检查CPU,好处是可以提供的权利,但是当然,如果你的用户使用的Cpu不支持这些指令,他们不会看到任何效益。

4)这将完全取决于编译器和优化。一些说明设置可被认为足够老的编译器将总是用它们,除非你告诉它不要,而其他会相反的:你必须告诉编译器使用它们。它是否将自动创造回退,以及还要取决于编译器。

其他提示

详细阐述一下迈克尔Madsen的回答问题4,海湾合作委员会默认产生的代码,用于一个i386处理器。它提供了一个标志叫 -march (也称为 -mcpu),确定哪些种类的指示编译器,将发射。微软的 cl.exe 提供 /arch:/Gx 标志相同的目的。

标志也会影响的说明是令,因为不同的Cpu可以相对较慢或快速执行一个特定的代码,根据以在其中说明出现。

我不知道有任何静态的编译器,将创建自动特征设置的后备代码。通常,必须做到明确的程序员。但好消息是,这一程序不需要;例如, liboil 库(优化内在的循环)将在运行时,选择最好的代码运行根据该机器正在运行。

一个可执行的,其中包含新的指令只能执行上的CPU是,支持这些新的指令。你可以配置的编译为一个特定的CPU。

试试吧已经自1996年以来,SSE是在1999年,SSE2首次亮相的奔腾4在2001年。我认为这是安全承担的任何CPU只使用已经试试吧和证,而且很可能SSE2.3DNOW我认为是AMD只,所以不要指望这些指令提供。

  1. 如果一些程序使用例如SSE指令可以对它进行处理器,不支持SSE?

没有。但在一般情况下这往往会产生一个陷阱或例外和陷阱/中断的处理程序可处理,如果需要的话。

例如长时间以前的软件往往包含码x87.如果x87协同处理器存在,指令将正常运行中的硬件,但如果缺乏计算机的一个x87协那么它会产生一个陷阱,之后,该指令会被处理软件,并将结果作为正常的。看看 是什么协议x87浮点仿真MS-DOS?

第一个版本中的黑苹果也使用这个模仿SSE2在Cpu不支持这一指示设置的。当然的表现是可怕的,但它将运行。

  1. 如果不能,它的意思是,真正的性能产生影响的这一新指令将以后几年,当最CPU将支持这种技术(所以不会有任何不兼容的)?

是的。但是几年后,也许可的软件需要更新,对吗?对于一个关键性能软件,改写,以利用的新指示设置可能是必要的。对于一些其他人中,增加绩效可能不明显

  1. 当我汇编C++程序与优化,这是否意味着就会使用这些新的指令?(我知道,这取决于许多因素,特别是在码,但是我想要的一些一般性的答复),或者是他们保留的大部分用于编写的程序,在asm?

取决于编译器和选择,你通过它在编译时间。

现代化的支助编译器 所以他们会 检测常见的成语和优化它.你只需要 重新编译 利用新的指示设置的。但对于复杂的案件,你还是需要 手优化 使用单指令内部函数

如果你使用 外部图书馆, 你将自动获得一速度改善当库更新,以支持新的指令组,即使如果你不做任何与你的节目

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top