assembly - 这是英特尔流水线指令吗?
问题描述
据我所知,是在执行当前指令时
获取下一条指令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?
解决方案
最初的计算机不是流水线的。他们获取一条指令,执行指令所需的所有周期并传递给下一条指令。平均而言,一条指令需要 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)的后续架构实现。
因为它在一个时隙执行多条指令
您实际上是对的,可以在一个时隙启动多条指令,但这是流水线之上的另一种技术,允许在指令级别并行执行并称为超标量。
推荐阅读
- node.js - 为什么加载失败?服务器响应状态为 404(未找到)
- sql - SQL 查询 - 在连续行中累积连接字符串
- azure - 创建索引和技能 Azure 认知搜索
- javascript - 异步函数 Javascript 中的 Cookie
- php - 使用elementor表单更新mysql中的表
- excel - Excel VBA - 对于每个循环备选方案
- apache-spark - org.apache.spark.SparkException:作业因 pyspark 中的阶段失败而中止
- keycloak - Keycloak 不会重定向到 https
- javascript - 使用 nightwatchjs 定位并检查脚本(在网页内)是否正确
- powerbi - 尝试使用 PowerBI 显示 Azure 流分析的窗口日期