几句话说清楚9:Skylake微架构(Microarchitecture)剖析(1)

楔子

了解CPU的微架构是基于其开发“硬核”软件的必需步骤。由于一些历史遗留问题,现存的技术资料往往存在一些概念混淆、重复命名甚至自相矛盾之处。本文一来梳理Skylake微架构(主要是流水线)的组成和特性,二来试图厘清一些含混的概念用以帮助后来者。

另外在介绍完微架构之后,会继续结合Perf中的Performance Event来对照说明互为印证。

需要强调的是,本文的重点是Skylake的流水线(pipeline)架构,core间的连接和架构方式不作重点说明。

Skylake简介

Skylake是由Intel以色列研发中心于2015年发布的14nm CPU架构。作为Broadwell的继任者,Skylake在原有架构的基础上,对一些关键特性和组件做出了相当幅度的优化:

上图简单列举了一些量化指标,现在不求甚解就好。

在指令集方面,引入了AVX-512CLFLUSHOPTCLWB等新的指令集,不过本文不打算介绍这些东西,写到这里只是觉得如果只用上一段话结束这一小节有些太突兀了。

流水线总览

引用上面这张图是为了举一个反例,说明一下本文要解决的问题。这张图可以被当做是一张流水线的架构抽象,我可以指着每一个组件讲讲它们都是干嘛的,但这里的问题就是某一个相同的组件在不同的文档、资料、甚至语境下可能有两个甚至更多个名字。

比如蓝色方块最下面的Allocation Queue,它就还有一个名字叫做Instruction Decode Queue,同时它还有可能被叫做IDQAQ。而关于Decoded Instruction QueueMicro Instruction SequencerRe-order bufferSchedulerReservation Station等概念的辨析也是…需要下一番功夫。

本文将以全网最清晰的方式讲清楚这些概念。

从high-level的层面来讲,Skylake的流水线架构与Broadwell和Haswell没有太大出入。还是可以分为两个阶段:

前端(Front-End)

上图中蓝色部分就代表流水线的前端。它的主要作用就是获取指令、解码(Decode)指令。

为了最大限度的发挥CPU的能力,前端就需要尽可能高效率地把程序指令输送给后端。这里就面临两个挑战:

  1. 如何更快更准确地取得要执行的指令
  2. 如何将取得的指令更快地解码为微指令(micro-ops/uops)

有了更多的微指令输送给后端(执行单元),后端的工作量才能饱和。而前端的所有组件和机制,都是围绕这两个挑战进行的。

后端(Back-End)

上图中红色的部分就代表流水线的后端。一般来讲绿色的部分是存储子系统,虽然与后端交互,但严格讲不算在后端里面。

后端的主要任务就是执行前端送过来的指令。和前端类似,后端除了“来料加工”之外,也有它自己需要面对的挑战:

  1. 如何提高指令的并行程度
  2. 如何充分利用已有的CPU能力

如果将CPU比作一家餐厅,跑在上面的应用就是来餐厅就餐的食客。前端类似餐厅的服务生,需要接受客人的下单,同时将订单送到后厨。而后厨就类似后端,负责做出客人需要的菜品。

但如何能让上菜速度更快?前端是否可以在客人排位时就让其提前下单?后厨是否能够提前准备好本店热门的特色菜,或者一并煮好一大锅面条,根据需要浇上不同的浇头?

CPU说是高科技,其实干得也就是这些事情。

在下一篇文章中将详细介绍一下前端。

© 2020 DecodeZ All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero