【问题标题】:What is the "EU" in x86 architecture? (calculates effective address?)x86 架构中的“欧盟”是什么? (计算有效地址?)
【发布时间】:2010-10-21 23:09:38
【问题描述】:

我在某处读到 x86 指令中的有效地址(如 LEA 指令中的)是由“EU”计算的。什么是欧盟?计算有效地址究竟涉及什么?

我只了解了 MC68k 指令集(UC Boulder 先教这个),通过搜索网络找不到好的 x86 网页。

【问题讨论】:

标签: assembly x86 cpu-architecture


【解决方案1】:

“EU”是执行单元的总称。 ALU 是执行单元的一个示例。 FADD 和 FMUL,即浮点加法器或乘法器,是其他示例 - 就这一点而言,是(是)用于加载和存储的内存单元。

与 LEA 指令相关的 EU 是 ALU(加、减、AND/OR 等)和 AGU(地址生成单元)。 AGU 耦合到内存管道、TLB、数据缓存等。

当我编写第一个代码生成指南时,典型的 Intel x86 CPU 具有 2 个 ALU、1 个连接到 AGU 的加载管道、一个连接到第二个 AGU 的存储地址管道和一个存储数据管道。截至 2016 年,大多数都有 3 或 4 个 ALU 和不止一个负载管道。

LEA 是一个 3 输入指令 - BaseReg+IndexReg*Scale+Offset。就像 x86 的内存寻址模式一样,它实际上有第四个输入,即段基址,它不是 LEA 计算的一部分。 3 个输入的成本必然高于 ADD 所需的 2 个输入。

在某些机器上,ALU 只能执行 2 个输入操作。因此 LEA 只能在 AGU 上执行,特别是用于加载的 AGU(因为存储 ALU 不写入寄存器)。这可能意味着您不能在加载的同时执行 LEA,或同时执行两个 LEA,而您可以在同一周期中执行两个 Adds 和一个加载。

在其他机器上,LEA 可以由一个、两个或三个 ALU 完成。可能代替 AGU - 可能和 ALU 一样。这证明了更大的灵活性。

或者,简单的 LEA,例如 regscale+offset,可以在 ALU 上完成,而最大的 LEA,例如 breg+iregscale+offset,可能会受到限制,甚至可能被破坏分成两个微单。

所以,问题归结为:哪个欧盟(执行单位)处理哪些 LEA? ALU 还是 AGU?答案取决于机器。

优化指南中的通用文本可能只是简单地说“EU”而不是“AGU 或 ALU,具体取决于型号”或“任何 EU 能够处理该特定 LEA”。

【讨论】:

  • 此外,如今“典型”x86 CPU 有 3 个 ALU 端口/管道和 2 个负载端口,除非您正在寻找像 Silvermont 这样的低功耗设计。 Haswell+ 有 4 个 ALU 端口。只有 AMD Bulldozer 系列的每个整数内核仍然只有 2 个整数 ALU 端口,这是一种固定分区 SMT。 K8/K10 的吞吐量为每个时钟 3 个 ADD。而且我注意到您没有尝试了解 2 个 ALU 端口 的复杂性,而是许多专门的 ALU(例如,标量整数 mul 单元 + 向量 FP mul 单元 + 许多 Intel P6 的端口 0 上的其他东西/ SnB-family uarches)。
  • 不,Peter,我没有深入了解共享启动端口和完成端口的专业 EU 组的复杂性,更不用说 RF 读写端口、灵活的延迟等。很难解释英特尔编译器作者指南中的这些问题,当我在 1994 年为 P6 编写第一个版本时。太难适应 stackoverflow 的 fitmaf 和原始格式。
  • 是的,您必须在某处划清要在答案中添加多少细节的界限。我大多只是提到港口+专业欧盟作为热心读者的脚注。不错的更新;更准确 + 正确,同时又漂亮又简短。
【解决方案2】:

英特尔自己的Software Developer's Manuals 是有关 x86 的一个很好的信息来源,尽管它们可能有点矫枉过正(并且更像参考而不是教程)。

EU(执行单元)参考很可能与 ALU(算术逻辑单元)形成对比,ALU(算术逻辑单元)通常是处理器中负责算术和逻辑指令的部分。然而,欧盟也有(或有)一些算术能力,用于计算内存地址。 x86 LEA 指令将这些功能传达给汇编程序员。

通常您可以为 x86 指令提供一些非常复杂的内存地址:

sub eax, [eax + ebx*4 + 0042]

当 ALU 处理算术减法时,EU 负责生成地址。

借助 LEA,您可以将有限的地址生成功能用于其他目的:

lea ebx, [eax + ebx*4 + 0042]

比较:

mul ebx, 4
add ebx, eax
add ebx, 0042

我链接的页面上的“第 1 卷”有一节“3.7.5”讨论寻址模式 - 您可以为期望内存操作数(其中 LEA 是其中之一)的指令提供什么样的内存地址,反映EU(或任何内存接口部分)能够执行什么样的算术。

“第 2 卷”是指令集参考,包含所有指令(包括 LEA)的明确信息。

【讨论】:

  • 我想知道哪个更快/更高效; lea 指令或 mul、add、add 组合,因为它们由不同的单元 (EU/ALU) 处理。
  • 当今所有的多级流水线、多核、多单元真的很难说。当 ALU 忙时,EU 可以免费进行此类计算,反之亦然。哎呀,我什至不确定 EU/ALU 的区别是否存在。
  • ALU 是一种 EU(可以运行 add 和 shift 指令的那种)。其他类型是可以执行这些微指令的加载单元或存储单元。 Krazy Glew's answer 在这个问题上解释了更多细节。 (Andy Glew 是英特尔 P6 设计的架构师之一。他对英特尔术语的解释是正确的,@TonyR 应该接受这个答案)。如果您可以替换多个其他指令,那么使用lea 总是一种胜利。如果您可以替换所有 4 个(shift、addadd-immediate 和 mov),那将是一个巨大的胜利。
  • 这个答案将欧盟与 AGU 混淆了。它所说的关于“欧盟”的所有内容实际上都应该替换为“AGU”。 (请注意,在现代 x86 设计中,只有有序 Atom 在实际 AGU 硬件上运行 LEA,而不是作为另一个 ALU 指令。其他 CPU 仅将其 AGU 用于实际加载/存储/预取。)
【解决方案3】:

多年来,单个系列中处理器的内部结构发生了很大变化,因此需要使用确切的 cpu 型号来澄清“欧盟”参考。与您的 m68k 体验类似,68000、010、020、030、040 和 060 的指令集大部分相同,但它们的内部结构确实不同,因此任何对内部名称的引用都需要带有它们的部件号。

【讨论】:

    【解决方案4】:

    EU = 执行单位?

    有效地址是如果LEA 指令是实际执行某种算术或其他数据访问的指令,则将被访问的地址。它的“预期”用途是从指针算术或数组索引操作计算结果指针。但是,由于它可以执行乘法和加法的某种组合,因此也可以用来优化一些常规计算。

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 2020-02-19
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2014-03-24
      • 1970-01-01
      相关资源
      最近更新 更多