英特尔和AMD如何不同但仍兼容?

时间:2016-06-23 00:57:42

标签: optimization cpu intel amd cpu-architecture

正如我一直所理解的那样,AMD通过逆向工程英特尔的指令集来构建他们的CPU,现在支付英特尔使用他们的指令集,而英特尔也为AMD的64位指令做同样的事情。

这就是如何在两种类型的CPU上安装Windows而无需购买特定版本,例如为ARM编译的版本,因此所有应用程序,游戏等以相同的方式工作,在CPU上可以互换。

但是最近有些事情让我质疑其中一些......

首先,我注意到有些游戏在我的系统(AMD)上有点滞后,看完之后游戏就针对英特尔CPU进行了优化......

此外,OSX在英特尔CPU上销售,但在发现hackintosh社区之后,事实证明可能但很难让OSX在AMD上运行。这是因为OSX专为英特尔设计......

经过这些事情......

针对英特尔或AMD进行优化是什么意思?如果它们是相互替换的插槽,那么如何才能为一个而不是另一个进行不同/优化?我们都支持相同的指令等。

5 个答案:

答案 0 :(得分:4)

他们实施same ISA,但具有不同的效果特征,因为microarchitecture不同。

e.g。有关详细信息,请参阅Agner Fog's microarch pdf,以及代码wiki中的其他链接。例如David Kanter's Haswell microarchitecture writeuphis writeup of AMD Bulldozer

Agner Fog的指令表还可以准确显示每个指令在每个CPU上的速度。例如{Bulmpozer-family上的imul r64, r64/m32, imm32是6周期延迟/每4c吞吐量一个。在英特尔SnB系列上,它具有3c延迟,每1c吞吐量为1。

因此,在调整AMD时,将64位乘法替换为常量with a couple shifts / adds if possible是值得的。在英特尔,如果你能用一个或两个班次/ lea指令完成工作,它可能是值得的。

AMD的设计还具有明显较弱的缓存层次结构,并且由于使用永久拆分的核心对而不是英特尔超线程在两个硬件线程之间动态共享资源而导致单线程吞吐量降低同样的核心。 IIRC,AMD正计划改变它的下一个微体系结构。其中一些是你无法真正优化的东西,只是AMD的速度较慢。 :(

所以他们运行相同的代码,因为这是相同的架构意味着什么。

某些CPU支持另一个没有的ISA扩展(新指令)。例如XOP仅限AMD,而AVX2和BMI2(目前为止)只支持Intel,所以想要使用超过公共基线的代码必须在运行时检查支持。

维基百科的AMD Excavator文章不是最新的。硬件已经出现了一段时间了,但文章仍然说它预计会有#34; AVX2和BMI2。 Agner Fog还没有对它进行测试并更新了他的指令表。

答案 1 :(得分:2)

当我第一次看到这个问题时,它有更多的赞成票而不是赞成票。但我认为这是一个与系统性能以及AMD和英特尔处理器之间差异相关的合理问题。我认为有几点值得解决。

ISA许可

  

正如我一直所理解的那样,AMD通过反向构建了他们的CPU   设计英特尔的指令集,现在支付英特尔使用他们的   指令集,英特尔对AMD的64位指令也这样做。

我不知道AMD和英特尔x86许可协议的完整历史,但这有点过于简单化了。目前,AMD和英特尔签署了一项交叉许可协议,允许它们实现相同的ISA。例如,当英特尔推出Itanium ISA时,AMD公司开发了x86 ISA的64位扩展。无论AMD和英特尔现在都支持相同的核心x86 ISA是真的,它们通常都有相互兼容的扩展。

整体表现

  

首先,我注意到有些游戏在我的系统上有点滞后   (AMD)并且在阅读之后证明该游戏针对英特尔进行了优化   的CPU ...

程序执行的整体性能取决于三个基本内容。需要执行的指令数,CPU的频率(时钟速度)以及每个周期执行的指令数(每个时钟周期)。目前,即使执行完全没有任何特定优化的完全相同的应用程序,高端英特尔CPU往往具有比AMD CPU更好的整体性能。因此,如果游戏在您的系统上运行缓慢,那可能只是因为CPU太慢,而不是因为它针对特定的微体系结构进行了优化。还有其他因素(GPU往往对游戏最重要),但调试游戏的性能不会成为stackoverflow的主题,除非你是一个试图理解特定编码问题的游戏开发人员。

CPU特定优化

  

针对英特尔或AMD进行优化是什么意思?怎么会这样   如果可能的话,可以为一个而不是另一个进行优化/优化   他们的意思是互相替换?我都是   支持相同的说明等。

虽然英特尔和AMD都开发了运行x86应用程序的CPU,但CPU的内部微体系结构却不同。并不是简单的 Intel 微体系结构或 AMD 微体系结构。相反,每家公司都有各种不同的CPU组,它们是在特定的微体系结构下开发的。因此,可以针对 Skylake (和英特尔微体系结构)或 Bulldozer (AMD微体系结构)优化程序。

当编译器生成代码时,它可以进行非常小的调整,这可能使一个微体系结构比另一个更有益。如果开发人员不知道目标CPU系列是什么,则可能有意义的是不针对特定的微体系结构,只生成预期会发挥最佳整体性能的代码。但是,如果开发人员知道该程序将运行哪个微体系结构,那么通过专门针对该微体系结构可以获得轻微的性能提升。

与基线优化相比,通常这些性能提升非常小。一个例外是当SSE4这样的新功能可用时。在这种情况下,它可以对能够利用新功能的某些工作负载产生重大影响。但即便如此,由于AMD和英特尔现在都支持SSE4,因此优化比特定处理器供应商更具体。

答案 2 :(得分:0)

可以通过查询某些明确定义的指令或指令组的可用性来确保与处理器的软件兼容性。 (这些日子的指令集非常不稳定;这对开发人员来说可能是一场噩梦。)

因此,即使在英特尔系列中,程序也可以以完全不同的性能运行,具体取决于处理器支持的内容以及软件如何利用它。

答案 3 :(得分:-1)

基本上处理方面存在差异。 AMD和英特尔互相支付使用其他专利的费用。这并不意味着两者都具有相同的设计。 基本指令集是相同的,但两者都有特定于CPU的附加指令,而它们基本上是在另一个CPU(至少大多数)上模拟的,这导致软件使用AMD上的英特尔附加(优化)指令反之亦然。另外,并不是说所有指令都将在两个CPU上进行仿真。可能会略有不同。

希望这能澄清一点; - )

答案 4 :(得分:-1)

SIMD指令非常不同,对于某些任务(如游戏),它们可以有所作为。有关具体示例,请参阅此答案:https://stackoverflow.com/a/17355341/126995

如果您真的想要,可以创建内部循环算法的多个版本,并在运行时使用cpuid为平台选择最佳实现。 有些人这样做,例如开发x264视频编解码器的人肯定会:

int x264_intra_satd_x9_4x4_ssse3( uint8_t *, uint8_t *, uint16_t * ); // Intel 2006+, AMD 2011+
int x264_intra_satd_x9_4x4_sse4( uint8_t *, uint8_t *, uint16_t * ); // Both around 2006 but slightly different instructions
int x264_intra_satd_x9_4x4_avx( uint8_t *, uint8_t *, uint16_t * ); // Intel 2011, AMD around 2012
int x264_intra_satd_9_4x4_xop( uint8_t *, uint8_t *, uint16_t * ); // AMD only

对于许多项目来说,这样做,即对所有项目进行优化是非常昂贵的。因此,该软件仅针对最流行的架构进行了优化。

此页面http://store.steampowered.com/hwsurvey?platform=pc(点击“其他设置”)告诉:

  • 99.95%有SSE3
  • 91.04%有SSSE3
  • 84.76%有SSE4.1
  • 81.60%SSE4.2
  • 67.56%AVX(我认为主要是英特尔)
  • 22.05%SSE4a(仅限AMD)

如果您正在管理项目,并且可以选择如何花费预算:您是否会为拥有AVX的67%用户或拥有SSE4a的22%用户专门优化您的软件?

AMD在实施SSSE3之前实施了SSE4a。 22.83%的用户使用AMD,因为22.05%的用户拥有SSE4a,所以几乎所有AMD用户都拥有SSE4a是安全的。我想我们可以得出结论,没有SSSE3的大多数用户都有AMD K10用户。这是SSE3成为基线而不是SSSE3的主要原因。