1. 引言

本篇主要简单介绍一下现代处理器的设计思想,方便对一些后续内容的更新与解释;首先任何处理器,处理信息的最小单位都是指令,换句话说无论是你双十一刚买的iPhone 14 pro max还是体重秤上日益膨胀的数据,靠的都是一条条辛苦耕耘的指令;一条RISC指令可以十分简化的划分为三部分(实际情况要复杂很多),分别是操作码,操作数,以及目的寄存器(地址);以一条加法指令来说,告诉计算机这是加法运算就是操作码,被加数和加数就是操作数,所得的结果最后放到目的寄存器里;为了后面介绍一些CPU的具体结构,这里将所有指令再简单粗暴的分为三大类分别是运算类的指令,load/store类指令,以及条件控制类指令(实际情况也复杂很多,下图是risc-v立即数加法的指令结构);

对于指令就先简单的介绍到这里,后续会展开介绍一下指令的在处理器内部的执行过程,感兴趣想深入了解可以自行下载risc-v指令集spec,下载地址放在文章末尾;再简单介绍一下经典的CPU结构;

2. 经典五级流水线

经典五级流水线是由:取值,译码,执行,访存,写回五级流水构成;(下图为MIPS的经典五级流水)

由于risc-v中有单独的访存指令,在一般risc-v的处理器中,将访存操作(也就是上述所说的load、store指令)放到执行级里,所以一般的risc-v处理器架构可以简单理解为四部分,取指,译码,执行,写回;以一个单发射顺序哈弗架构的risc-v处理器来举例,取指就是从I-cache(或者其他的指令存储单元 ITCM等,I-cache中的指令是从FLASH回填进来的,这部分后面会展开将)中拿取顺序的第一条指令;译码就是将这条指令翻译成是什么操作,然后发射到执行级对应的管道或者执行单元进行运算;执行部分,就是加减乘除,load,store,跳转之类的操作执行;写回,就是告诉处理器这条指令执行完了,可以取下一条指令了;这就是经典的五级流水CPU,那么为了提升CPU的性能,最常见的方法之一就是增加流水级,那么增加流水级除了增大面积与功耗是否还会引起其他的问题的呢,这就是引起了分支预测存在的意义:

3. 分支预测

在介绍risc-v指令集的类别时,简单的提及了一类条件控制类的指令,跳转指令的意思简答来说就是本来指令1执行完毕是要顺序执行指令2的,但指令1是一个跳转指令让下一条执行的指令变成了指令8,那么中间所有正在执行的指令都会被流水线冲刷,以一个十级流水线的单发射顺序处理器来讲,执行单元往往在流水线的靠后位置,假如此处理器的执行单元在第七级,那么下一次执行到指令8的时候又过了七个周期,并且冲刷了所以正在执行的指令,而在这七个周期处理器是没有完成任何指令的,事实上一个常见的编译器每六七条指令就有一条跳转指令,这种情况被称作控制冒险,那么怎么能让处理器频率跑的高,并且还能在跳转指令上耽误的时间少呢-----答案就是将一条指令是不是跳转指令的判断提前,而提前判断这条指令是不是跳转指令并刷新PC值的硬件结构就是分支预测器(下图是玄铁C910的分支预测器结构);

事实上分支预测也分为两种情况,一种是静态分支预测,另一种是动态分支预测, 静态分支预测主要依赖于编译器,简单来说,就是让CPU猜一猜,条件跳转后执行的指令,应该是哪一条。最基本的静态分支预测技术,叫做假装分支不发生。也就是仍然按照顺序,把指令往下执行。而动态分支预测,主要依赖于CPU的特殊结构,也就是上述所说的分支预测器,常见的动态分支预测如BTB(branch target buffer),就是一个类似于cache结构的buffer,每一条entry储存对应分支的跳转目标地址,tag为对应分支的PC。由于后续会展开介绍具体的分支预测器的实现和工作原理,这里就不再展开介绍了。而为了进一步提升CPU的性能,CPU在每个时钟周期可以执行多条指令,再根据指令的相关性决定先发射哪一条指令,这样就不用在流水线阻塞的情况下不发射指令了,这就衍生了新的概念——发射多条指令称之为超标量处理器,根据指令相关或者执行通道阻塞来决定发射哪条指令称为乱序执行。

4. 乱序执行和超标量处理器

超标量处理器的流水线中,允许多条指令同时存在。这样一条指令不用等待它前面的指令执行完毕,就有可能可以进入处理器的后面得到执行,这种方式提升了处指令并行性(ILP: instruction level parallelism),进而提升性能。

一般来说常见的乱序执行算法有两种scoreboard和Tomasulo两种,这里只着重介绍一下Tomasulo算法(下图为典型带ROB的tomasulo算法框架图)

首先乱序执行第一个引入的问题就是数据相关性问题,对于CPU核内来说只需要关切三种数据相关性冲突:RAW,WAR,WAW;其中RAW主要通过数据前馈(bypass)来解决,而WAR和WAW主要通过寄存器重命名(register rename)来解决;为实现后者,需要引入新的物理重命名寄存器堆和判断每一条指令或者微操作是否完成写回,从ROB(Re-order buffer)中完成,如上几点构成了tomasulo的基本算法:顺序取指,乱序执行,顺序写回。(后续会详尽介绍一下这部分,下图为乱序超标量处理器玄铁C910的流水级划分)

5. Cache与一致性

Cache的出现与CPU的多核密切相关,Cache可以简单理解为一个作为中转站的SRAM,以一个双核L2cache的子系统举例,每一个CORE都从L2cache中拿数据,L2cache就是两个核交互的平台(下图为典型的多层cache结构)

而与此同时,为防止类似上文出现的数据冲突(多核的一致性问题),被修改的数据则标记为Dirty,其他核便没有办法直接访问(具体感兴趣可以去查找一下MOESI协议和ACE针对AXI总线的扩展,下载链接放到了文章最后,下图为ACE对五种cache状态的描述);

cache的存储结构也和一般的SRAM不同,简单来说每一个cache line由用于寻址的tag 和 数据载体的data组成,通过比对tag(index,offset)来快速的进行数据对比,要比一般的寻址方式快很多,这也是用cache结构来作为两个核之间交互的原因之一;

risc-v spec下载地址:

https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf

risc-v Privileged spec下载地址:

https://github.com/riscv/riscv-isa-manual/releases/download/Priv-v1.12/riscv-privileged-20211203.pdf

risc-v spec扩展指令集自行下载地址:Recently Ratified Extensions - Home - RISC-V International (riscv.org)

AXI与ACE总线协议spec下载地址:AMBA AXI and ACE Protocol Specification Version H.c (arm.com)

现代处理器的设计思想相关推荐

  1. MapReduce原理与设计思想

    转自:http://www.cnblogs.com/archimedes/p/mapreduce-principle.html 简单解释 MapReduce 算法 一个有趣的例子 你想数出一摞牌中有多 ...

  2. 【设计思想解读开源框架】java如何发送post请求

    在这里分享一份 [mybatis从入门到精通] 的强力教程,定能够助你一臂之力. Mybatis基本介绍 ORM和MyBatis 对象/关系数据库映射(ORM) 基本映射方式 流行的ORM框架简介 目 ...

  3. MyBatis源码-深入理解MyBatis Executor的设计思想

    文章目录 Pre JDBC的执行过程 JDBC Demo JDBC Statement 接口 MyBatis执行过程 四大组件 组件之间的关系 Executor 执行器组件 架构总览 接口继承关系 P ...

  4. MapReduce原理与设计思想(转载:http://blog.jobbole.com/80619/)

    简单解释 MapReduce 算法 一个有趣的例子 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃? MapReduce方法则是: 给在座的所有玩家中分配这摞牌 让每个玩家 ...

  5. [转]“Ceph浅析”系列之(二)—Ceph的设计思想

    转载自:http://yizhaolingyan.net/?p=11 分析开源项目,时常遇到的一个问题就是资料不足.有时间写代码的大牛们通常是都是没有时间或者根本不屑于写文档的.而不多的文档通常又是使 ...

  6. Linux设备驱动的分层设计思想

    1.1 设备驱动核心层和例化 在面向对象的程序设计中,可以为某一类相似的事物定义一个基类,而具体的事物可以继承这个基类中的函数.如果对于继承的这个事物而言,其某函数的实 现与基类一致,那它就可以直接继 ...

  7. hashmap为什么用红黑树_要看HashMap源码,先来看看它的设计思想

    HashMap 是日常开发中,用的最多的集合类之一,也是面试中经常被问到的 Java 类之一.同时,HashMap 在实现方式上面又有十分典型的范例.不管是从哪一方面来看,学习 HashMap 都可以 ...

  8. 模仿SpringMVC的DispatcherServlet 手撸300行代码提炼精华设计思想并保证功能可用(1.0版本)

    前言 1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 3.内容为手写SpringMVC的DistapcherServlet的核心功能,从V1版本到V2版本再到 ...

  9. 02.springMVC设计思想及springAOP

    MVC设计思想 历史问题:如果将大量的代码都写到一个方法中,后期维护不易 MVC说明: 1.M Model 数据层 数据处理/数据的持久化 2.V View 视图层 前端页面相关的内容(看到的内容) ...

最新文章

  1. 用Asp.net还原与恢复sqlserver数据库
  2. 自学python系列10:python的函数和函数式编程
  3. java插入数据库字段过长_数据库插入数据长度过大,出现提示:将截断字符串或二进制数据...
  4. Parse a document from a String
  5. zuulfilter添加例外_SpringCloud之Zuul 自定义filter
  6. 微信小程序 - 回到自己位置(map)
  7. dede plus ad js.php,织梦程序中plus文件作用介绍及安全设置
  8. 曹讯 计算机摄像学,计算摄像学: 全光视觉信息的计算采集
  9. MyBatis集合Spring(一)之在MyBatis中配置Spring的应用
  10. 下载新版火狐后无法同步书签_Ubuntu解决火狐浏览器无法同步书签的问题【推荐】...
  11. java OA办公管理系统 Springboot vue 前后分离 跨域 工作流 集成代码生成器java OA系统 流程审批 电子印章 手写文字识别 电子签名
  12. matlab 数据白化,数据白化
  13. ipsw —— iOS/macOS 研究瑞士军刀
  14. 【Hexo】NexT 主题的配置使用记录
  15. 嵌入式C语言实例(达内2013)
  16. 中级育婴师证怎么考,需要些什么条件
  17. (cons '(叁 . 续延) 《为自己写本-Guile-书》)
  18. GNSS及其定位原理,差分GNSS技术分析
  19. pandas,根据某几列筛选出重复记录,is_unique与duplicated
  20. [Python] 用K-means聚类算法进行客户分群

热门文章

  1. selenium自动化测试环境搭建及启动safair浏览器(Mac)
  2. Localization-Aware Active Learning for Object Detection (ACCV)
  3. 报错:org.springframework.cloud.gateway.support.NotFoundException: Unable to find instance for localhos
  4. You can't specify target table 'ship_product_cat' for update in FROM clause
  5. TweenMax.to()的使用
  6. 社会化媒体营销方案简介
  7. TI vs Nordic BLE 产品市场分析
  8. BC30 KiKi和酸奶
  9. 为什么你挖不到漏洞,阿里P8架构师亲授秘籍(五千字详解)
  10. android PMU