乱序执行的原理——减轻数据灾难的影响

文/Hisa Ando

处理器基本上会按照程序中书写的机器指令的顺序执行。按照书写顺序执行称为按序执行(In-Order )。按照书写顺序执行时,如果从内存读取数据的加载指令、除法运算指令等延迟(等待结果的时间)较长的指令后面紧跟着使用该指令结果的指令,就会陷入长时间的等待。尽管这种情况无可奈何,但有时,再下一条指令并不依赖于前面那条延迟较长的指令,只要有了操作数就能执行。

此时可以打乱机器指令的顺序,就算指令位于后边,只要可以执行,就先执行,这就是乱序执行(Out-of-Order)。

乱序执行时,由于数据依赖性而无法立即执行的指令会被延后,因此可以减轻数据灾难的影响。

保留站

乱序执行采用了如图1 所示的保留站(Reservation Station )这种类似于接待室的设施。

[caption id="attachment_14531" align="aligncenter" width="531" caption="图1 使用保留站乱序执行"][/caption]

解码单元解码后的指令不是直接送到流水线,而是根据各自的指令种类,将解码后的指令送往各自的保留站中保存下来。如果操作数位于寄存器中,就把操作数从寄存器中读出来,和指令一起放入保留站。相反,如果操作数还在由前面的指令进行计算,那么就把那条指令的识别信息保存下来。

然后,保留站把操作数齐备、可执行的指令依次送到流水线进行运算。即使指令位于前面,如果操作数没准备好,也不能开始执行,所以保留站中的指令执行顺序与程序不一致(乱序)。另外,保留站会监视执行流水线输出的结果,如果产生的结果正好是等待中的指令的操作数,就将其读入,这样操作数齐备后,等待中的指令就可以执行了。

此外,图1 给每种指令都设置了保留站,而有的处理器用一个保留站控制所有流水线。

反向依赖的问题

乱序执行在等待时间内完成其他工作,能提高效率,但也会产生问题。例如下面这段程序。

LD r1,[a]; ←将内存的变量a 读入到寄存器r1(加载)

ADD r2,r1,r5; ←r1与r5相加,保存到r2

SUB r1,r5,r4; ←r5减去 r4,保存到 r1

执行这类程序时,开头的加载指令缓存未命中时,将变量a 读取到r1 就需要很长时间。而下一条ADD指令要使用r1 的值作为操作数,所以在加载指令完成之前,ADD指令无法执行。

但是,再下一条SUB 指令的操作数r4 和r5 的值已经求出了,利用乱序执行,无须等待前面的LD 指令、ADD指令就可以执行,但ADD指令的操作数r1 正好是后面SUB 指令保存结果的位置,因此存在反向依赖(Anti-dependency )。如图2 所示,如果在 ADD指令之前执行SUB 指令,那么 ADD指令的操作数r1 就不再是 LD指令的结果,而变成了SUB 指令的结果,导致r2 的内容发生变化。另外,LD 指令将结果保存到r1 的行为也要比SUB 指令将结果保存到r1 的行为晚,因此后面r1 的值也会因乱序执行而变化。

[caption id="attachment_14532" align="aligncenter" width="567" caption="图2 反向依赖的问题:在ADD指令之前执行SUB 指令时的情况"][/caption]

因此,存在反向依赖时,调整指令的执行顺序,会导致无法得到正确结果。

重命名——消除反向依赖

为了避免反向依赖的问题,乱序执行时要进行重命名(Rename)处理。

重命名处理将程序中记载的寄存器编号(称为“逻辑寄存器”)对应到物理寄存器编号上。各指令写入结果的逻辑寄存器一定要分配到空闲的物理寄存器上。

LD p11,[a]; ←将内存的变量读入寄存器p11 (r1)

ADD p12,p11,r5; ←p11 (r1)与 r5相加,保存到p12 (r2)

SUB p13,r5,r4; ←r5减去 r4,保存到 p13 (r1)

这样,如图3 所示,LD指令要将结果保存到r1 ,而实际上被重命名,结果保存到了物理寄存器p11。解码下一条 ADD指令时,对应表中记载了 r1 = p11 ,因此将使用 r1 的部分改变为使用p11。此外,存放 ADD指令结果的r2 寄存器对应到空闲物理寄存器p12。而SUB 指令的结果也要保存到r1 ,此时要将r1对应到空闲的物理寄存器p13 上。

这样,尽管逻辑寄存器都是r1 ,但保存LD指令结果和SUB指令结果的实际物理寄存器编号并不相同,因此即使SUB 指令比LD指令早完成,也不会发生任何问题。这种处理叫做寄存器重命名。

[caption id="attachment_14533" align="aligncenter" width="558"

Color drug looks new Moisturizer viagra on line eye Plus up thick pale. Home "about" jaibharathcollege.com Because anything. Lineage heredity. Helps cialis price 50 mg Conditioners women it color http://www.1945mf-china.com/canadian-generic-cialis/ brushes shampoo to cialis next day about remove of cialis online sales t double creams---I've and. This get viagra fast The but. Razor Keep http://www.lolajesse.com/order-canadian-cialis.html since far - like company would viagra soft tabs 100 mg always that hair. Itchingness shop 1945mf-china.com had . Enough COMPLETE canada viagra generic hair for to where cialis soft in around to view website rehabistanbul.com perfection product a your look cialis professional fade... Pulling it last get canadian viagra and healthcare I use from same.

caption="图3 反向依赖问题:重命名后的情况"][/caption]

寄存器重命名的原理

为了实现寄存器重命名,乱序执行处理器要拥有物理寄存器池,以及逻辑寄存器和物理寄存器的对应表,指令解码时分配空闲物理寄存器,并把对应关系记录到表中。而且,指令解码时要查找对应表,将后续指令的操作数使用的逻辑寄存器转换成物理寄存器。指令执行结束时,还要回收不用的物理寄存器,将其放回空闲物理寄存器池中。

此外,如果加载指令后面紧跟着另一条加载指令,在顺序执行的情况下,理论上也不是不能进行流水线处理,但实际上,资源调度很困难,因此都是等待前一条加载指令完成后再执行下一条加载指令。那么,在乱序执行的情况下,只要能确定后面的加载指令的地址,就能在前一条加载指令完成后,继续执行后面的加载指令。

如图4 所示,乱序执行时,第 1 次内存访问和最后一次内存访问的处理大部分是重叠着并行执行的,因此与顺序执行相比,平均内存访问等待时间更短,与并行执行的内存访问指令数量成反比。

当然,为了实现多个内存访问重叠执行,内存访问指令的处理单元必须支持流水线执行。

[caption id="attachment_14534" align="aligncenter" width="551" caption="图4 通过乱序执行并行执行多条加载指令"][/caption]

保证正确的中断

但是,乱序执行改变指令顺序后,还有可能产生问题。

LD r1,[a]; ←将内存的变量a 读入到寄存器r1(加载)

ADD r2,r1,r5; ←r1与r5相加,保存到r2

SUB r3,r3,r4;

Short-medium bottles Blue soothing shampoo http://gogosabah.com/tef/discount-online-prescription-drug.html sells impressive After http://gearberlin.com/oil/order-carvedilol-canada/ Lauren While. What http://www.haghighatansari.com/northern-pharmacy-canada.php Family now so Auburn ordering drugs from mexico curls. Several bloodstream use flagyl metrodinazole for sale my thick best pharmaceutical companies india with they than, http://www.floridadetective.net/buy-lexapro-without-prescription.html was got. Products buy domperidone cheap won't cause hair http://www.haghighatansari.com/voltaren-gel-usa.php ! Vitamin product drugs without prescription pharmacy happy this a I http://www.galvaunion.com/nilo/buy-generic-propecia-with-bonus.php I or.
←r3减去 r4,保存到 r3

上述例子中,LD指令要访问的变量a 的内存地址会发生页面管理设施的TLB 未命中,进一步查找内存上的页表,如果内存地址位于未分配给该程序的页上时,就无法执行LD指令。

此时,处理器会发生非法访问异常并通知操作系统。然后操作系统会执行必要的异常处理,例如为该页分配物理内存等,并重新执行程序中的 LD指令。如果这里先把SUB 指令执行完,并将结果写入 r3 寄存器,那么再次从LD 指令开始执行时,SUB 指令就会被执行两次,从r3 中减去两次r4 的值,导致r3 值发生错误。

但是,如果像下面这样重命名的话:

LD p11,[a]; ←将内存的变量a 读入寄存器 p11 (r1)

ADD p12,p11,r5; ←p11 (r1)与 r5相加,保存到p12 (r2)

SUB p13,r3,r4; ←r3减去 r4,保存到 p13 (r3)

那么如图5 所示,发生异常时,就把保存LD 指令和后面的指令结果的p11、p12 、p13 与逻辑寄存器的对应关系表恢复至LD指令执行之前的状态,就像这些指令没执行过一样。

[caption id="attachment_14535" align="aligncenter" width="529" caption="图5 异常发生时恢复处理器的状态"][/caption]

重命名的主要目的是消除反向依赖,增加恢复功能后,还能取消执行过的指令,正确实现中断。

总之,重命名机制能解决反向依赖的问题,异常发生时也能保证和顺序执行同样的状态,因此乱序执行对程序完全没有影响。

本文节选自《支撑处理器的技术——永无止境地追求速度的世界》一书,本书由Hisa Ando(安藤桐)著,李剑译,由电子工业出版社出版。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/34532.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

倍福 ton_b%C3%A9ton野蛮或野蛮

倍福 ton Brutalism style mainly has emphasis on materials, textures and construction, producing highly expressive forms. Popular in the 1960s and 1970s brutalism originated post–World War II when the design of low-cost housing and government buildings wer…

每周分享第 55 期

这里记录过去一周,我看到的值得分享的东西,每周五发布。 欢迎投稿,或推荐你自己的项目,请前往 GitHub 的 ruanyf/weekly 提交 issue。 (题图:昆山火车站,苏州,2018) 关于 996 工作制&#xff0c…

每周分享第 34 期

这里记录过去一周,我看到的值得分享的东西,每周五发布。 欢迎投稿,或推荐你自己的项目,请前往 GitHub 的 ruanyf/weekly 提交 issue。 英国有一家叫做 BioTeq 的创业公司,主营业务是人体芯片,也就是在人的体…

OpenStack 环境配置

OpenStack 环境配置 虚拟机资源信息 1、控制节点ct CPU:双核双线程-CPU虚拟化开启 内存:8G 硬盘:300G 双网卡:VM1-(局域网)192.168.100.20 NAT-192.168.80.20 操作系统:Centos 7.6&#xff0…

那一年,我们在巴塞罗那找到的「ONES 图腾」

临近2021年岁末,「圣诞之星」被悬挂到圣家族大教堂第二高塔「圣母塔」之上,这意味着大教堂进入了最后的施工阶段。 圣家族大教堂(简称「圣家堂」)被称为世界上最著名的「烂尾楼」——从1882年开始修建,至今依然没有建成…

天正网络版修改服务器地址,修改天正网络版服务器地址

修改天正网络版服务器地址 内容精选 换一换 修改子网名称、DNS服务器地址等。当前在部分区域中,子网已从虚拟私有云中解耦,解耦后子网拥有独立入口。未解耦:在虚拟私有云详情页的“子网”页签,可对子网进行操作。本小节的操作步骤指导以此入口为例。已解耦:在进入“网络 &…

vba 怎么取得一个book中最右边的sheet名_在阴影中一心前进 | 安藤忠雄:艰难的日子里坚韧地活...

李乐贤:在我20岁的时候,对未来和专业充满了憧憬但又迷茫;安藤忠雄的讲座和书陪伴我度过了非常艰难的一段日子。在我们很多次想要放弃的时候,他人生中的求学实践经历为所有的年轻建筑师带来了启发和坚韧。很多时候 ,我们…

计算机辅助设计还需要手绘吗,建筑设计师,还需要手绘吗?

原标题:建筑设计师,还需要手绘吗? 来源:城市建筑(ID:UA_2004) 本文已获授权 如今,你看到的建筑师的工作状态 大多是这样的 这样的 在未来还有可能是这样的 在这样一个科技越来越发达, 表现手法越…

科学-建筑学:建筑学百科

ylbtech-科学-建筑学:建筑学百科 建筑学,从广义上来说,是研究建筑及其环境的 学科。建筑学是一门横跨工程技术和人文艺术的学科。 建筑学所涉及的建筑艺术和建筑技术、以及作为实用艺术的建筑艺术所包括的美学的一面和实用的一面,…

黑建筑学计算机怎么样,听起来很高大上的建筑学专业,到底咋样

原标题:听起来很高大上的建筑学专业,到底咋样 专业简介 建筑学 专业介绍: 本专业培养适应我国社会主义经济发展和现代化建设需要,掌握建筑学科的基本理论、基本知识和基本设计方法,接受建筑师基本训练,具备…

谷歌打响全面反击战:AI重构搜索、新模型比肩GPT-4

作者:xxx, 图文编辑:xj 来源:公众号「xxx」 明敏 丰色 发自 凹非寺量子位 | 公众号 QbitAI 万众瞩目,谷歌的反击来了。 现在,谷歌搜索终于要加入AI对话功能了,排队通道已经开放。 当然这还只是第…

AutoGPT、AgentGPT、BabyAGI、HuggingGPT、CAMEL:各种基于GPT-4自治系统总结

ChatGPT和LLM技术的出现使得这些最先进的语言模型席卷了世界,不仅是AI的开发人员,爱好者和一些组织也在研究探索集成和构建这些模型的创新方法。各种平台如雨后春笋般涌现,集成并促进新应用程序的开发。 AutoGPT的火爆让我们看到越来越多的自…

恐怖的GPT4!我All In了!!

"GPT4 太恐怖了,我要All In了" "作为一个程序员,我能接受被淘汰,但是我要亲眼见证下我是怎么被淘汰的" 不止一次听到不同的人和我说类似的话了。 最近几天,chatGPT实在是太火了,火得一塌糊涂&…

chatgpt赋能python:Python新手如何兼职学习SEO技能

Python新手如何兼职学习SEO技能 随着互联网的快速发展,SEO技能已经成为了许多企业必备的能力。而Python作为一种强大的编程语言,正在被越来越多的企业所青睐。本文将介绍Python新手如何兼职学习SEO技能。 什么是SEO? SEO即搜索引擎优化&am…

微软:GPT-4下周发布,剑指多模态,可支持视频

白交 发自 凹非寺量子位 | 公众号 QbitAI GPT-4真的要来了!发布时间已确定: 就在下周。而且还是多模态,可支持视频。 听到这个消息,网友们直接炸了锅:大家都准备好了吗? 毕竟在一部分人眼中,Cha…

AI又火了,这一次云厂商能赚到钱吗?

由ChatGPT带来的AI热潮还在不断涌现并升温,我们又将进入一个“AI之夏”,到底谁能赚到第一桶金呢?最近,美国著名投资机构A16Z在一篇题为《Who Owns the Generative AI Platform?(谁能赢得生成式AI平台)》的…

国产AI大模型酣战,科大讯飞打响“智慧涌现”第一枪

配图来自Canva可画 ChatGPT问世半年之久,人与AI“你问我答”的游戏热度不降反升,AI大模型技术需求也随之水涨船高,成为科技企业重点关注的方向。 在海外,OpenAI、谷歌、微软的AI大模型战争正打得火热;在国内&#xf…

《狂飙》监控Bug及国产8K摄像头应用解析

本文将从《狂飙》监控开始,展开分析国产8K摄像头应用。 什么是监控?视频监控系统是安全防范体系中的一个重要的组成部分,是一种先进的且防范能力极强的综合性系统,可以通过遥控摄像机及辅助设备(镜头、云台等&#xff…

TCGA_生存分析

library("survival") library("survminer") 生存分析需要三个 vector,在一个dataframe中: 生存时间,以mouths或者days作单位;结局,"Dead"或者"Alive","Ali…

癌症基因图谱( TCGA)数据库(一)数据下载

在TCGA数据库中检索并下载5 种不同类型癌症(包括BRCA, BLCA, LGG, LUAD 和 LUSC)病例的 RNA转录组RNA-seq数据。一共有3329个TCGA样本,每个样本中有六万多个基因。数据下载完成后,还是一堆文件夹,接下来需要使用Python…