大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
一. 线性流水线
流水线技术是一种将每条指令分解为多步,并让各步操作重叠,从而实现几条指令并行处理的技术。程序中的指令仍是一条条顺序执行,但可以预先取若干条指令,并在当前指令尚未执行完时,提前启动后续指令的另一些操作步骤。这样显然可加速一段程序的运行过程。
每个流水级的结构是:逻辑电路+寄存器
我们可以将流水线往下细分,使得各个流水级足够小(CPU执行时间少),就可以通过提高系统时钟频率来提高CPU的处理速度。
二.线性超流水线(这里以5级为例)
超级流水线以增加流水线级数的方法来缩短机器周期,相同的时间内超级流水线执行了更多的机器指令。采用简单指令以加快执行速度是所有流水线的共同特点,但超级流水线配置了多个功能部件和指令译码电路,采用多条流水线并行处理,还有多个寄存器端口和总线,可以同时执行多个操作,因此比普通流水线执行的更快,在一个机器周期内可以流出多条指令。
一般而言,CPU执行一条指令需要经过以下阶段:取指->译码->地址生成->取操作数->执行->写回,每个阶段都要消耗一个时钟周期,同时每个阶段的计算结果在周期结束以前都要发送到阶段之间的锁存器上,以供下一个阶段使用。
注意: 我们把5级以上的流水线称为超流水线结构。
三.muti-线性超流水线(这里以5级为例)——超标量
超标量(superscalar)是指在CPU中有一条以上的流水线,并且每时钟周期内可以完成一条以上的指令,这种设计就叫超标量技术。 其实质是以空间换取时间。而超流水线是通过细化流水、提高主频,使得在一个机器周期内完成一个甚至多个操作,其实质是以时间换取空间。
四.非线性超流水线(加入乱序执行部件)
五.超线程非线性超流水线(虚拟处理器共用乱序执行部件)
拥有超线程的处理器将两个虚拟的处理器暴露给共享的乱序执行部件。它们共享一个重排序缓存和乱序执行部件,让操作系统认为它们是两个独立的处理器。
六.场景演绎
这一切看上去有点令人感到困惑,那么我们举一个例子来让这一切变得清晰起来。
从应用程序的角度来看,我们仍然是运行在指令流水线上,就像老的 8086 处理器那样。处理器就是一个黑盒子。黑盒子会处理指令指针指向的指令,当处理完之后,会在内存里找到处理的结果。
但是从指令本身的角度来讲,这个过程可谓历经沧桑。我们下面介绍对于现今的处理器(大约在 2008-2013 年之间),一条指令在其内部的过程。
首先,你是一条指令,你所属的程序正在运行。
你一直在耐心的等待指令指针会指向自己,等待被 CPU 运行。当指令指针距离你还有 4KB 远的时候(这大约是 1500 条指令),你被 CPU 从内存取到指令缓存中。虽然从内存加载进入指令缓存需要一段时间,但是现在距离你被执行的时刻还很远,你有足够的时间。这个预取的过程属于流水线的第一级。
当指令指针离你越来越近,距离你还有 24 条指令的时候,你和你旁边的 5 个指令会被放到指令队列里面。
这个处理器有 4 个译码器,可以容纳一个复杂指令和最多三个简单指令。你碰巧是一条复杂指令,通过译码,你被翻译成 4 个微指令。
译码的过程可以划分为多步。译码过程中的一步是检查你需要的数据和猜测你可能会产生一个地址跳转。译码器一旦检测到需要的额外数据,不需要让你知道,这个数据就开始从内存加载到数据缓存中了。
你的四个微指令到达寄存器重命名表。你告诉它你需要读哪个内存地址(比如说 fs:[eax+18h]),然后寄存器重命名表将这个地址转换为临时地址供微指令使用。地址转化完成后,你的微指令将进入重排序缓存(Reorder Buffer, ROB)并记录指令次序。接着第一时间进入保留站(Reservation Station, RS)。
保留站用于存储已经准备就绪可以执行的指令。你的第三条微指令被立即选中并送往端口5,这个端口直接执行运算。但是你并不知道为什么它会被首先选中,无论如何,它确实被执行了。几个时钟周期之后你的第一条微指令前往端口2,该端口是读单元(Load Address execution unit)。剩余的微指令一直等待,同时各个端口正在收集不同的微指令。他们都在等待端口 2 将数据从缓存和内存中加载进来并放在临时存储空间内。
他们等了很久……
相当久的时间……
不过在他们等待第一条微指令返回数据的时候,又有其他的新指令又进来。好在处理器知道如何让这些指令乱序执行(即后到达保留站的微指令被优先执行)。
当第一条微指令返回了数据,剩余的两条微指令被立即送往执行端口 0 和1。现在这 4 条微指令都已经运行,最终它们会返回保留站。
这些微指令返回后交出他们的“票”并给出各自的临时地址。通过这些地址,你作为一个完整的指令,将他们合并。最后 CPU 将结果交给你并使你退出
当你到达标有“退出”的门的时候,你会发现这里要排一个队列。你进入后发现你刚好站在你前面进来指令的后面,即使执行中的顺序可能已经不同,但你们退出的顺序继续保持一致。看来乱序执行部件真正知道自己做了什么。
每条指令最终离开 CPU,每次一条指令,就和指令指针指向的顺序一样!
参考文章:
转一篇难得的好文章-CPU流水线的探秘之旅_mb5fe94b3e552d9的技术博客_51CTO博客https://blog.51cto.com/u_15069472/4701934跟涛哥一起学习嵌入式 31:深入浅出CPU流水线工作原理 – 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/132352768
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/171214.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...