首页 > 解决方案 > 这是英特尔流水线指令吗?

问题描述

据我所知,是在执行当前指令时 获取下一条指令intel 8086 pipelining的技术。

这篇文章说流水线的优点之一
消除了欧盟的等待时间,加快了处理速度

我认为,类似的指令lea 0x7(%eax), %ecx可以拆分为多个指令,
例如add $0x7, %eax; lea %eax, %ecx.

我的想法)
所以,根据定义,
我认为上面的示例与定义相匹配,intel 8086 pipelining
因为它在一个时隙执行多条指令,因此
这样的操作加快了处理速度

问题)
我很好奇下面的说明可以是流水线的例子。

main:
 mov $0x2, %eax
 mov $0x3, %esi
 lea (%eax), %ecx           # result: 2. Pipeling?
 lea 0x7(%eax), %ecx        # result: 9. Pipeling?
 lea 0x7(%eax,%esi,), %ecx  # result: 12. Pipeling?
 lea 0x7(,%esi,4), %ecx     # result: 19. Pipeling?
 lea 0x7(%eax,%esi,4), %ecx # result: 21. Pipeling?

标签: assemblyintelx86-16disassemblypipelining

解决方案


最初的计算机不是流水线的。他们获取一条指令,执行指令所需的所有周期并传递给下一条指令。平均而言,一条指令需要 5-6 个周期。这种行为适用于 80 年代中期之前的所有计算机,包括 8086(在 78 中引入)。

七十年代后期,人们发现管道是提高效率的有效途径。第一个商用芯片是 IBM 801,但流水线的成功是在八十年代中期与 Sun Sparc、Berkeley Risc 和 MIPS 合作的。

这个想法是将所有指令拆分为相似的阶段,并将这些阶段与独立的硬件资源相关联,这样您就可以开始一条新指令,而无需等待前一条指令完成,从而允许每个周期开始一条新指令. 为了处理指令交互(危险),每约 1.5 个周期增加 1 条指令,但与上一代相比增益巨大(X3 性能)。

问题是流水线需要特定的指令集,基于简单的数据移动(称为 RISC 指令集)。新计算机基于此方案,但未采用旧处理器指令集(包括 x86)。

为了从流水线优势中获益,同时保持向上兼容性,英特尔决定采用基于两部分的微架构:第一部分获取 x86 指令并将其转换为可流水线指令(称为 μOps),第二部分是这些 μOps 的流水线执行. 这是在 Pentium Pro(1995 年推出)中首次引入的,并且出现在任何后续版本中。

你给的代码

lea 0x7(%eax), %ecx

翻译成

添加 $0x7, %eax;
lea %eax, %ecx

是μOps翻译的一个例子。转换在将具有内存操作数的 ALU 操作转换为执行单个任务(内存传输或 ALU 操作)的更简单操作时特别有用。

目前所有的计算机都是流水线的(除了一些简单的微控制器或一些嵌入在 FPGA 中的处理器)。

您给出的任何指令序列都将在管道中执行,当然包括您问题中的指令。唯一的限制是,根据指令交互,可能存在可能意味着流水线减速(停顿)的危险。

我认为上面的例子符合英特尔 8086 流水线的定义

流水线是微架构的特征,而不是指令集的特征。因此,微架构 8086 不是流水线,而是其指令集(称为 x86 或 IA32)的后续架构实现。

因为它在一个时隙执行多条指令

您实际上是对的,可以在一个时隙启动多条指令,但这是流水线之上的另一种技术,允许在指令级别并行执行并称为超标量。


推荐阅读