CPU指令的流水线执行

指令集是CPU体系架构的重要组成部分。C语言的语法是对解决现实问题的运算和流程的方法的高度概况和抽象,其主要为算术、逻辑运算和分支控制,而指令集就是对这些抽象的具体支持,汇编只不过是为了让开发人员更好地记住指令,但它跟CPU所认的机器码其实是一一对应的,因此汇编也是低级语言。

CPU的指令执行一般包括取指、译码和执行,这是经典的三级指令执行流水线,教科书上往往以这三种过程来描述,arm7也是。但是现代的CPU设计往往使用更广泛使用的5级流水线,也就是分为取指、译码、执行、访存和回写。为什么要分为5级?这是由流水线的各个阶段的时间来决定的。我们可以考虑现实生活的工厂的流水线。

假设某流水线只有 三个工序,有三个工人A、B、C,则这条生产线的效率就取决于效率最低的那个工人的效率。现假设B做完其负责的工序需要10秒,而A和C完成只需要5秒,总共要完成4个产品。那总时间应该是:5+10*4+5 = 50秒,(第一个5是A先做第一道工序的时间,这时B和C都得等,而最后一个5是C必须要等B全部完成后才能开始)即会出现C在等待,而B一直在忙死忙活的场景。

当然,无论怎样,流水线的执行总比完成没有流水好,就好比A、B、C负责的工作都由一个人去做,那做完一个得20秒。全部做完得20*4 = 80秒。

最理性的场景就是三个人做事的效率是一样的,那就不会出现等待的情况。那现在确实遇到B工作效率最低的问题,怎么解决呢?就是将B的工作重新分解,平均分成两个工序,也就是B1和B2,分别都是5秒完成,那完成的总时间是40秒。

CPU指令的三级流水执行正是遇到各步骤流水时间不均的问题,也就是取指和译码往往比较快,而执行包括运算和访问寄存器、内存或者回写等功能,因此执行的时间一般比取指和译码要长,取指和译码可以在单时钟周期内完成,但执行需要2到3个时钟周期才能完成。要想得到更高的流水效率,就需要将执行部分分解为执行(运算等)、访存(内存)和回写(寄存器)。

CPU指令的流水线执行对于软件开发人员来说,最重要的就是要知道当前PC(程序计数寄存器)的值与当前执行指令的关系。取指指的是CPU根据当前PC的值内存的对应地址去取指令,因此PC值永远都指的都是当前取指令步骤的地址,而译码则是CPU的一部分电路根据取出来的指令机器码进行译码,选择对应的电路来执行这条执行,如选择加法电路还是减法电路,还是逻辑与电路等等;执行就是这个电路的执行过程了。

arm7的流水线示意图是:

从图可以看到在T1时刻,CPU的执行电路执行的是MOV指令,而取指电路取的是SUB指令,因此当前执行电路的MOV对应的运行地址应该是当前PC值减8. 如果当前运行的指令是一个函数调用(即BL指令),但返回地址就应该是ADD指令所在的地址,即(PC减4)。

CPU指令的流水线执行

时间: 2024-10-10 21:40:42

CPU指令的流水线执行的相关文章

cpu设计-->cpu指令设计与全程逻辑分析

CPU指令设计,除了命名之外,更重要的是分析出指令如何才能够实现.对于图 3 1的CPU结构,如果指令是预先放到irom里的,那么,指令执行时要一条一条地从irom取出来,放到ir指令寄存器中,提供给control进行分析执行.每一条指令如何转变成机器动作,CPU的设计者必须认真地进行分析和规划.这一过程叫指令全程动作分析,简称指令全程分析. 我们针对图 3-1的结构,可以尝试设计一些用符号表示的汇编指令,然后对这些汇编指令如何实现,进行细致地分析.汇编指令的二进制数表示就是机器指令.汇编指令和

从Java到CPU指令系列之 - 锁和原子操作是怎么实现的 How Lock and atomic works

给急性格的读者: 请参考<Intel 64 and IA32 Architectures Software Develeloper's Manual>.其中有CMPXCHG指令和LOCK指令前缀.或者AMD等其他厂商的开发指南. 在多线程编程中,对某一资源的同步操作是保证资源状态一致性的关键.这个需要同步的资源可以是单个简单的变量,也可以是多个变量,或者是某些外部资源.对他们同步操作的含义就是同一时间点,最多只能有一个线程在操作这些资源,也就是排他性.并且一系列操作必须一气呵成,中间不允许其他

sqlserver 索引优化 CPU占用过高 执行分析 服务器检查

原文:sqlserver 索引优化 CPU占用过高 执行分析 服务器检查 1. 管理公司一台服务器,上面放的东西挺多的.有一天有个哥们告诉我现在程序卡的厉害.我给他说,是时候读点优化的书了.别一天到晚没个正形,现在写的程序卡的跑不动.他说我本地 是好好的,跑的很快.我说别扯那么多没用的,服务器不比你的本子强得多.待洒家上去看看.不看不知道一看吓一跳,CPU占用在95上下.开个程序是不卡,可整点有些时间是卡的一匹.这就令人很难受了. 本来服务器上也没有什么,就一个网站和几个数据库.那一个个分析吧,

Intel系列CPU指令速查手册

指令名称 指令形式 机器码 标志位 (设置/测试) 说明 应用举例 ES: ES: 26 ES段跨越前缀 CS: CS: 2E CS段跨越前缀 SS: SS: 36 SS段跨越前缀 DS: DS: 3E DS段跨越前缀 FS: FS: 64 FS段跨越前缀 GS: GS: 65 GS段跨越前缀 Opsize: Opsize: 66 操作数类型跨越前缀 Address: Address: 67 地址类型跨越前缀 AAA 37 设置 AF CF 加法后的ASCII码调整AL AAA AAD AAD

cpu指令重排序的原理

目录: 1.重排序场景 2.追根溯源 3.缓存一致性协议 4.重排序原因 一.重排序场景 class ResortDemo { int a = 0; boolean flag = false; public void writer() { a = 1; //1 flag = true; //2 } Public void reader() { if (flag) { //3 int i = a * a; //4 …… } } } 当两个线程 A 和 B,A 首先执行writer() 方法,随后

CPU指令集设计RISC和CISC

CPU指令集 硬件实现具有速度快,成本高,灵活性差,软件实现与之相反.因此出现频率高的基本功能首选硬件实现.指令集的不同反映了设计原理.制造技术和系统类别. RISC 精简指令集计算机(Reduced Instruction Set Computer) 硬件电路直接控制方案 CISC 复杂指令集计算机(Complex Instruction set Computer) 微程序控制方案 原文地址:https://www.cnblogs.com/uestcman/p/9589186.html

sqlserver 索引优化 CPU占用过高 执行分析 服务器检查[转]

SELECT TOP 10 [Total Cost] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) , avg_user_impact , TableName = statement , [EqualityUsage] = equality_columns , [InequalityUsage] = inequality_columns , [Include Cloumns] = incl

指令的编码与译码原理

指令集是处理器体系架构的重要组成部分.指令集有两个发展方面,包括以X86为代表的CISC(复杂指令集)和以ARM.MIPS为代表的RISC(精简指令集).CISC的目标是尽可能将常用的功能用最少甚至一条指令来实现,因此该指令对应的执行电路往往是复杂的,其侧重的是硬件功能的实现:RISC则相反,其是将复杂的执行电路进行分解,即用尽可能简单的多指令去描述该功能,以软件来降低硬件的复杂度,因此RISC对编译器的要求比较高.CISC的指令长度是可变的,执行周期也不固定,而RISC则是定长的.往往都是单周

自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现

将陆续上传本人写的新书<自己动手写CPU>,今天是第28篇,我尽量每周四篇 China-pub的预售地址如下(有目录.内容简介.前言): http://product.china-pub.com/3804025 亚马逊的预售地址如下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8/ref=cm_sw_r_si_dp_5kq8tb1gyhja4 7.5 流水线暂停机制的设计与实现 7.5.1 流水线暂停机制设计 因为OpenMIPS设计乘累加.乘累减.除法