第六章、流水线不是流水账—蜂鸟E200流水线介绍

6.1 处理器流水线概述

6.1.1 从经典的五级流水线说起

经典五级流水是指

取址、译码、执行、访存、写回

6.1.2 可否不要流水线—流水线和状态机的关系

流水线本质:以面积换性能、以空间换时间

状态机本质:以性能换面积、以时间换空间(五级流水可以理解为5个状态的状态机,一个时钟周期完成一个状态)

8051内核采用类似状态机方式实现,没用流水线,性能差。

6.1.3 深处种菱浅种稻,不深不浅种荷花—流水线深度

流水线深度是否越深越好

  • 两级寄存器之间硬件逻辑越少,则越能运行到更高的主频。Cortex-A系列有十几级流水线,主频可高达2GHz。x86处理器采用几十级流水,主频可达3-4GHz。主频越高,流水线吞吐率越高,从而性能越高。
  • 流水线加深会导致寄存器数量增加,面积增大。
  • 每一级流水线之间的握手操作,可能导致时序问题。
  • 流水线取指令阶段无法得知条件跳转是跳还是不跳(跳不跳由两个数进行比较大小确定),因此只能预测。而到了执行阶段完成明确是跳还是不跳才与预测结果相比较,若发现预测失败,则需要重新来过。这个过程叫“流水线冲刷”。流水线越深,这种情况导致的浪费和损失越严重。

流水线深度需要结合应用场景合理选择。

6.1.4 向上生长—越来越深的流水线

Cortex-A7主打低功耗前提下的能效比,流水线8级。

Cortex-A15主打高性能,流水线15级。

流水线并不能无限长,流水线越长实现难度越大。

6.1.5 向下生长—越来越浅的流水线

性能够用的前提下追求极低的功耗,流水线越来越浅。

Cortex-M3流水线3级,Cortex-M0流水线3级,Cortex-M0+流水线2级。ARM宣称Cortex-M0+是世界上能效比最高的处理器核。

2级流水基本已经浅到底,1级流水又成了单周期cpu。

6.16 总结

6.2 处理器流水线中的乱序

第八章介绍

6.3 处理器流水线中的反压

当入口流量大于出口流量,这时候就需要反压,或者,当后级未准备好时,如果本级进行数据传递,那么它就需要反压前级,所以此时前级需要将数据保持不动,直到握手成功才能更新数据。

如三级流水设计,如果某一级收到后级反压信号,我们理所当然想反压本级输出信号的寄存器,但是如果只反压最后一级寄存器,那么会面临一个问题,就是最后一级寄存器数据会被前两级流水冲毁,导致数据丢失,引出数据安全问题,所以我们此时需要考虑反压设计。

占个坑,看不懂。学深入了再回头看。

6.4 处理器流水线中的冲突

冲突主要分为资源冲突和数据冲突

6.4.1 流水线中的资源冲突

资源冲突是指硬件资源冲突,比如上一个指令需要除法模块运算,则下一条指令若也需要除法模块会造成冲突。

6.4.2 流水线中的数据冲突

数据冲突是指不同的指令之间的操作数存在着数据相关性造成的冲突

常见数据相关性

  • WAR(write-after-read)相关性,即先读后写相关性。若后序指令要写入数据的寄存器前序指令要读的寄存器是同一个,且后序指令先执行,就会造成错误。因此存在这种相关性的后续指令一定不能比前序指令先执行。
  • WAW(write-after-write)相关性,即先写后写相关性。若后续指令需要写入结果的寄存器和前序指令需要写入结果的寄存器相同,且后序指令先执行,寄存器结果就会被前序指令结果覆盖,造成错误。存在这种相关性的后续指令一定不能比前序指令先执行。
  • RAW(read-after-write)相关性,即先写后读相关性。若后续指令要读的寄存器与前序指令要写入结果的寄存器相同,且后续指令限制性,就会读到错误结果,造成错误。存在这种相关性的后续指令一定不能比前序指令先执行。
  • 上述中,RAW称为真数据相关。

解决办法

  • WAR,WAW可采用寄存器重命名方法去除相关性
  • RAW相关性无法去除,后续指令必须等待前序指令的执行结果,从而导致流水线等待停顿。为减少性能损失,可采用“动态调度”方法。

动态调度思想

  • 采用数据旁路传播计数,让前序指令结果尽快传给后续指令
  • 让后续指令不阻塞流水线,让其他无关指令先执行

6.5 蜂鸟E200处理器的流水线

6.5.1 流水线总体结构

  • 第一级流水为取指
  • 译码(EXU完成)、执行(EXU完成)和写回(WB完成)处于同一时钟周期作为第二级流水
  • 访存(LSU完成)处于第三季流水,但需要依靠WB写回通用寄存器组。
  • 因此书中称为变长流水线结构

6.5.2 流水线中的冲突

第八章涉及

6.6 总结

E200以两级按序流水线为主体,辅以其他组件构成变长流水线结构

快速看书的时期到此结束,下一章就该书和代码一起研究了

posted @   骑猪上树的少年  阅读(494)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
回到顶部
点击右上角即可分享
微信分享提示

目录导航