(书稿底稿)(C/C++)第一章:CPU基础知识 1.2 管道技术

2024-04-24 11:32

本文主要是介绍(书稿底稿)(C/C++)第一章:CPU基础知识 1.2 管道技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



1.2.1    管道技术介绍

       管道基本知识

前面已经提到,指令就是程序中控制CPU执行的命令,也就是代码中的各种关键字、运算符等。如:3+4if while 语句。

正如没有无缘无故的爱,也没有无缘无故的恨,计算机里也没有无缘无故的技术,各种技术都是为了解决实际问题而诞生的。管道技术是为了解决指令执行效率慢而诞生的,因此在介绍管道技术前,首先看看没有管道技术的CPU有什么问题。

         管道(pipeline):这里的管道和软件领域进程间通信使用的管道不一样,管道技术是提升CPU执行指令效率的一种解决方案。衡量CPU执行指令效率的一个常用指标为:单位时间内执行的指令条数。在后续内容中,会一直用这个指标进行效率衡量。

         想了解一个事件的后果需要先了解事件本身才行,同样,要了解传统指令执行的效率问题就需要先了解指令是如何执行的,根据它的执行方法发掘出存在的效率,最后掌握何种技术解决这个问题。说到指令执行方法就必须先了解指令生命周期和周期各阶段先后执行关系

       指令生命周期

人类不能长生不老,指令也不例外,也被存在生命周期的约束,只能存在有限的时间,算法也有个类似规定:必须在有限时间内用有限的步骤得出结果。正如人类的生命按照年龄段划分则是由婴儿、少年、成年、老年4个阶段组成,任何生命周期都是由各个阶段组成,指令的生命周期按照CPU的执行的操作划分,理论上为4个阶段,每个阶段的执行时间尽量保持相同,后面会说为何每个阶段时间都相同:取指令(fetch)、解码(decode)、执行(execute)、存取。不同的CPU的阶段划分都不相同,很多时候将“存取”阶段细化为访存取数阶段和结果写回阶段,但和本例原理相同,因此尽管阶段划分和实际情况不太相符,但是阶段划分方法和因此而导致的后果是相同的。从内存提取指令或数据时需要寻找他们所在地址,利用指令格式中地址码字段计算出指令或数据真实地址的方法称为寻址方式,寻址方式分指令寻址和数据寻址,前者较为简单,后者较为复杂。

取指令:CPU利用指令寻址方式将一条指令从主存提取到指令寄存器,等待被调用

通常将读取指令的这段时间称为取指周期,指令寻址方式有两种:顺序寻址方式和跳跃寻址方式

                         顺序寻址:指令在程序中顺序排列,当执行一段程序时,通常是一个指令接着一个指令顺序的读取和执行,这种方式成为顺序执行,程序计数器(指令指针寄存器)PC中保存当前被执行的指令所在地址,顺序寻址就是利用PC+1的方式获取下条指令地址

                         跳跃寻址:下条指令的地址并不是由PC给出,而是由当前指令给出,跳跃后,按照新的指令地址重新开始顺序执行,同时PC内容发生对应改变,以便跟踪新地址,一般指令系统中的条件转移或无条件转移指令就是跳跃寻址,对应源码中的各种条件语句 if while

解码:指令译码器按照预定的指令格式,对取指令阶段提取的指令进行拆分和解释,产生不同的控制电位,以形成不同的操作,CPU是利用控制电位指挥内部各个部件工作;

执行:完成指令规定的各种操作,也就是CPU各部件根据控制电位执行操作,具体实现指令的功能,将执行指令的这段时间称为执行周期

存取:分两部分:一.   根据指令的需要,可能需要访问内存读取出操作数,

二.执行完毕,将命令执行的结果写入对应的寄存器或内存

              数据寻址方式包含:立即数寻址方式、直接寻址方式、间接寻址方式、寄存器寻址方式、基址寻址方式、变址寻址方式、相对寻址方式,具体的各种寻址方式具体内容,请不做介绍,如果有兴趣请自行查看相关资料;

              按照指令系统分类,计算机大致分为:复杂指令系统计算机(CISC)和精简指令系统计算机(RISC);

CISC的指令集功能强大但指令复杂且庞大,其寻址方式也比较复杂,涵盖了上面数据寻址方式的所有情况,代表是IntelCPU

RISC指令集中的指令,格式简单且执行效率高,代表是ARM,其指令几乎都是使用寄存器寻址方式,不会出现存储器间接寻址方式,寻址方式总数一般不超过

5

         一般CPU的架构,通常把CPU分成2部分:前端(frontend)和后端(back end),处于不同的生命周期中。

前端:由指令控制单元(PC寄存器、指令寄存器等)和I/0单元组成,主要是和其他部

分交互和控制功能,包含指令生命周期的读取和解码阶段;

后端:由其他各寄存器和执行单元(ALU)组成,主要负责执行相关工作,包含指令生命周期的执行和写入阶段。

6

7

         由上面指令生命周期可以看到,CPU将指令切割成相互独立的4个阶段,被切割出来的阶段的数量被称为管道的深度(pipeline depth),因此本例的管道深度为四,管道深度和生命周期阶段划分紧密相关,管道深度直接关系到CPU实现和执行细节,因此实际中管道深度的划分比较复杂,管道的深度直接影响指令的执行方式和效率,不同的CPU不同架构其管道深度也不同,如Pentium 4为了高性能深度提升为30级,Core 2 CPU为了控制能耗并未将时钟频率设置的比较高,不需要像Pentium4那么大的深度,因此又将深度缩减为14,至今为止AMD的管道深度最大,提升到了45。在后面的小节会详细讲述这些情况。

       生命周期各阶段执行关系:

         大部分的技术的实现原理或解决方案,都来源于现实生活,人类的大脑是最复杂灵活的,人类不断的优化生活中的各种解决方案以提升效率,因此技术层面碰到的问题可以由现实生活进行反思寻找解决方案,比如设计模式的思路就得益于建筑业,再比如我们的管道技术得益于传统流水线工作方式。

在介绍管道技术之前,我们来了解三个指令周期相关的术语以及一个现实范例;

术语:

指令周期:CPU取出一条指令并执行该指令所消耗的总时间称为指令周期,指令周期的长短和指令的复杂度相关,越复杂的指令其指令周期越长

CPU周期:寄存器访问速度远大于主存储器的访问速度,因此将CPU从主存储器取出一条指令的最短时间称为CPU周期,也叫机器周期,若干个CPU周期组成指令周期

时钟周期:处理操作的最基本时间,由CPU主频决定,若干个时钟周期组成一个CPU周期

范例:去医院治病,一般流程包含四个阶段:挂号、看病、缴费和拿药。我们按看病流程的执行方式分两个版本:要命版和改进版流程,两个版本的阶段划分完全不同,只是执行方式进行了改进,刚好对应CPU使用管道技术之前和之后的差别。

要命版流程:

8

         如图7,假如医院的看病流程规定为:挂号、看病、缴费和拿药四个阶段依次执行,不可以跨越,不挂号就去看病医生会无视你,且看病流程中只能同时出现一个人,也就是当开始的这个人不结束完“拿药”阶段离开医院,医院就不理会第二个人的挂号请求,一直等到流程中的这个人拿完药离开医院。在这样的流程下,在一个人处于某个阶段时,其他人要等待,同一时刻医院工作人员也只有1个部门的人在工作,当进行到看病阶段时,其他医生只能围观此人看病。

很明显,这样的流程效率非常差劲,假设每个阶段耗时为1,有一个人看完病花费时间为43个人看完病需要时间为12,有段时间完全没有被利用到。我相信如果有医院采用这样规定,院长肯定是要被拉出来被打成熊猫的。

改进版流程:

         院长为了避免自己被打成熊猫,改进了看病流程,当一个人进入到流程后,不会阻碍其他人,但是同一个阶段只能有一个人同时存在,毕竟一个医生只能同时给一个病人看病,如果一个医生同时给两个病人看病,很快他脑子就浆糊了。如下图,当第一个人结束“挂号”阶段后,后面的病人就可以开始“挂号”,而并不需要一定要前一人进入“看病”阶段,但必须等待前一人“看病”完毕才能进入此阶段,之前所有人必须等待,按照人员顺序进行各阶段。这种流程下1个人看完病需要的时间依然为4并没有节约,但3个人看完病需要的时间仅为7,效率提升了将近一半,这种方式是目前医院都采用的流程方式。



范例到此结束,到此其实你已经掌握的管道技术。我们已经了解到指令的生命周期阶段划分为:读取、解码、执行、保存,各阶段的执行类似医院的流程,依次执行,未采用管道技术情况下,指令执行情况和那个让人发火医院流程相同,其三条指令执行完毕需要时间为12,如下图

 


 上述医院采用的流程策略在计算机中称为管道技术,采用了和医院流程优化策略相同的方法后,时间也提升到了7,效率将近提升一倍。

 

 


        到此大家已经掌握管道技术原理了,管道技术并不是为提升单个指令的执行效率而设计的它根本也无法优化单个指令的执行时间,它针对的是多条指令的执行效率,当各阶段开始满负载后效率的提升才能显现出来。这种看起来很简单的原理,是由人类长期积累出来的智慧结晶,其典型代表就是1913年福特公司发明出的世界上第一条流水线,流水线出现后大幅提升生产效率,流水线的出现是生产效率的一个里程碑,管道技术原理就来源于流水线原理,因此也称为流水线技术,8088以后的CPU才开始使用此技术提升CPU执行效率。管道技术原理本身比较容易理解,阶段数量也就是管道深度对指令效率有影响,假如我们将阶段变为2个,也就是管道深度为2,每个阶段执行时间为2,单条指令执行时间不变为4,但三条指令执行总时间变为10,管道深度为4的三条指令总时间只为7 ,时间效率差了3,因此一般来说管道深度越高效率提升越大,那是不是管道深度越大越好?不可简单的这么认为,还有很多其他制约因素存在,比如实际中各阶段的执行时间不可能完全相同,这些制约因素也影响了效率,因此阶段划分方法是很困难的,需要总和考虑各种制约的因素。后面会详细的介绍。

         本书的所有章节介绍某种技术时,都会努力说明其原因(面对的问题)、技术原理和解决方案以及需要注意的情况,之所以这样介绍,除了让大家掌握介绍的技术外,更重要的是希望大家能够吸收并借鉴其技术的原理来解决我们平时碰到的问题,世界上不存在完美的解决方法,每种方法都是牺牲掉不敏感的因素换取敏感因素的优化,比如算法中牺牲内存提升效率或者牺牲效率降低内存需求。以这个管道技术为例,我们如果有个算法或表达式性能比较差或耗时长,如何提升效率呢?从管道原理出发,我们应该研究下这个算法或表达式是否可以拆分成N个子算法、表达式的组合,然后利用管道技术的原理去并发其执行,这样虽然损失了编码难度但提高了效率。如何拆分、要注意什么、有什么挑战呢?请看后续

这篇关于(书稿底稿)(C/C++)第一章:CPU基础知识 1.2 管道技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/931630

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以