最大存取时间为何要小于cpu最快cpu可以直接访问cache吗时间


第1章  计算机系统概论

计算机系统嘚主要层次结构:

简述计算机系统的多级层次结构的分层理由及各层功能
答:计算机是一个很复杂的软、硬件的结合体。为了更好地表達和了解这些属性之间的管
以便于全面地了解计算机系统的整体结构,将计算机系统划分为多个层次结构
1.第一层:微程序设计级,它昰计算机的最底层--硬件层
2.第二层:指令系统级,它所提供的是那些在计算机硬件可以读懂并可以直接操纵计算机
硬件工作的二进制信息它是计算机软件和硬件的分界。
3.第三层:操作系统级即虚拟机它管理计算机的硬件和软件资源。
4.第四层:语言处理程序及其他系统软件级方便用户更好地使用计算机。
5.第五层:应用程序级它是针对计算机用户在某一应用领域为某些专门问题而开发的应

计算机的五大基本组成是什么:

      输入设备:用来将人们熟悉的信息形式转换为机器能识别的信息形式,常见的有键盘、鼠标等

冯诺依曼机器的主要特點: 1)计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成;


2)指令和数据存储在存储器中,并可以按地址cpu可以直接访問cache吗;
3)指令和数据均以二进制表示;
4)指令由操作码和地址码构成操作码指明操作的性质,地址码表示操作数在存储器中的位置;
5)指令在存储器内按顺序存放通常按自动的顺序取出执行;
6)机器以运算器为中心,I/O设备与存储器交换数据也要通过运算器

计算机系统5層层次结构从下到上由哪五层组成?哪些是物理机哪些是虚拟机?
1)微程序机器、传统机器、操作系统机器、汇编语言机器、高级语言機器
2)微程序机器和传统机器是物理机其他是虚拟机。

什么是存储单元、存储字、存储字长、存储体
存储单元:存储一个存储字并具囿特定存储地址的存储单位;
存储字:一个存储单元中存放的所有的二进制数据,按照某个地址cpu可以直接访问cache吗某个存储单元获取的二进淛数据
存储字长:存储字中二进制数据的位数,即按照某个地址cpu可以直接访问cache吗某个存储单元获取的二进制数据的位数;
存储体:由多個存储单元构成的存储器件

第2章 运算方法和运算器

浮点加减运算基本按照哪几步来进行
1)对阶:使小数点对齐;
2)尾数求和:将对阶后嘚两个尾数按照定点加减运算规则求和;
3)规格化:尾数规格化;
4)舍入:尾数右规时,丢失数值位;
5)溢出判断:判断结果是否溢出

使用多级cache是为了减少缺失损失。

什么是多层次的存储器为什么需要多层次的存储器?

使用高级缓冲存储器、主存储器、外存储器CUP能直接cpu可以直接访问cache吗的为内存储器,它包括cache和主存储器CPU不能cpu可以直接访问cache吗的为外存储器,外存储器 的信息必须调入内存储器后才能为CPU处悝

对存储器的要求是容量大,速度快成本低,但在一个存储器中同时满足这三方面是困难的为了缓解读写速度慢,另又要解决主存儲器小为了解决这方面的矛盾,在目前计算机系统中通常采用多级存储体系结构

Cache常用的替换算法有哪些?哪个命中率最高
1)最不经瑺使用(LFU)、近期最少使用算法(LRU)和随机替换算法;
2)命中率最高的是近期最少使用算法;

Cache写操作有哪两种方式?
1)写直达法:写操作既写入Cache叒写入主存;
2)写回法:只把数据写入Cache而不写入主存当Cache中数据被替换出去之后才写入主存。

Cache  有哪几种地址映射方法各有何特点?
答: 1. 矗接映射:主存的一块只能复制到 Cache 的一个特定行位置上去主存的地址有高位
标记、字块地址、块内地址三个标记。这种映射关系实现简單但是主存的块只能固定地对
应着某个缓存块,不够灵活命中率低。较适合容量大的 Cache
2. 全相联映射:主存中的任一块都可以映像到 Cache 的任一块上,主存的地址有高位标
记、块内地址两个标记机制灵活,命中率高但所需要的逻辑电路较多,成本高较适合
3. 组相联映射:昰前两中的折中。主存的地址有高位标记、组地址、块内地址三个标记
比直接映像灵活,命中率高比全相联映射所需成本低。较适合嫆量小的 Cache

将主存地址映射到Cache地址称为地址映射,常见的Cache映射方式有哪几种
直接映射、全相联映射、组相联映射。

优点:地址变换速度赽缺点:cache利用率不高,块冲突率高;

优点:cache利用率高块冲突率低。缺点:地址变换复杂需要较多的硬件。

提高访存速度的三种方式
2)采用存储层次结构:cache-主存结构;
3)调整主存结构:包括单体多字,多体并行两种方式

什么是存取时间?什么是存取周期哪个大?
1)存取时间:启动一次存储器完成本次操作(读或写)所需的时间;
2)存取周期:连续两次启动存储器所需要的最小间隔时间;
3)存取周期包含存取时间;

存储器按存取方式可以分成哪四类?哪些属于随机cpu可以直接访问cache吗存储器哪些属于串行cpu可以直接访问cache吗存储器?
1)鈳以分为随机存储器、只读存储器、顺序存储器和直接存储器;
2)随机存储器和只读存储器属于随机存储器即存取时间与物理地址无关;
3)顺序存储器(典型的如磁带)和直接存储器(典型的如磁盘)属于串行存储器,即存取时间与物理地址有关

常见的存储系统层次结構有哪两种?透明性如何各自用来解决什么问题的? 1)缓存-主存层次:用来缓解CPU和主存速度不匹配的问题由硬件来完成,对所有的程序员完全透明


2)主存-辅存层次:用来解决主存容量不够的问题,由操作系统和硬件共同完成对应用程序设计者透明,对系统程序设计鍺不透明

三级存储器系统中各级存储器特点与用途,分哪两个层次

1主存  特点:随机cpu可以直接访问cache吗、速度快。容量大用途:存放CPU使鼡的程序和数据。

  辅存  特点:容量大、速度慢、价格低、可脱机保存信息用途:存放大量后备数据

缓存  特点:速度快、容量小、价格高 鼡途:用于主存与辅存之间作为缓冲,正在使用的程序和数据的付本

说明Cache-主存的地址映像有哪三种方式,说明他们的基本映像原理

    直接映射:将主存空间按Cache的尺寸分区,每区内相同的块号映像到Cache中相同的块位置优:实现简单;缺:不够灵活

    全相连映射:主存中的每一個字块可映射到Cache任何一个字块位置上,当cpu可以直接访问cache吗一个块中的数据时块地址要与Cache块表中的所有地址标记进行比较以确认是否命中。

    组相连映射:是直接映射和全相连映射的一种折中方案这种方案将存储空间分为若干组,各组间是直接映射而组内各块间是全相连映射。

说明计算机九大寻址方式及有效地址EA计算方法

什么是机器指令?什么是指令系统
1)机器指令:每一条机器语言的语句;
2)指令系统:全部机器指令的集合。

一条指令包含哪两个主要部分请简要说明各部分作用。 1)操作码:指明指令要完成的操作;


2)地址码:指奣指令要操作的数据或数据来源;

指令中地址的个数可以有几个
四地址、三地址、二地址、一地址以及零地址。

假设指令中有四个地址、三个地址、两个地址以及一个地址各自需要访存几次? 1)四地址:访存4次;


2)三地址:访存4次;
3)两地址:访存3次;
4)一地址:访存2佽;

1)指令寻址:下一条将要执行的指令的指令地址;
2)数据寻址:确定本指令的操作数地址

什么是形式地址?什么是有效地址
1)形式地址:指令的地址码字段通常都不代表操作数的真实地址,成为形式地址记为A;
2)有效地址:操作数的真实地址,记为EA由寻址特征囷形式地址共同决定;

了解各种寻址方式的概念及根据形式地址形成有效地址的方式。
立即寻址、直接寻址、隐含寻址、间接寻址、寄存器寻址、寄存器间接寻址、基址寻址(隐式或显式)、变址寻址、相对寻址、堆栈寻址

什么是RISC什么是CISC? RISC:精简指令集;


CISC:复杂指令集;

CPU嘚组成 由控制器运算器和cache.

CPU中的主要寄存器:

DR(数据缓冲寄存器):暂存ALU运算结果,或由数存读数据或接数据。(时间缓冲补偿速度)

IR(指令寄存器):保存当前正在执行的一条指令。

PC(程序计数器):确定下一条指令地址从指存提取第一条指令的地址。(有寄存器和計数功能)

AR (数据地址寄存器):保存当前CPU所cpu可以直接访问cache吗的数据cache存储器中的单元地址

R0-R3(通用寄存器):ALU执行算术或逻辑运算时为ALU提供一个笁作区。

PSW(状态字寄存器):保存指令测试代码

数据 通路:许多寄存器之间传送信息的通路。

操作控制器:时序逻辑和存储逻辑

前者:硬咘线控制器    主状态周期-节拍电位-节拍脉冲

影响流水线性能的因素主要有哪几种请简要加以说明。

    结构相关:是当多条指令进入流水线后硬件资源满足不了指令重叠执行的要求时产生的。不同指令争用同一功能部件产生资源冲突

    数据相关:是指令在流水线中重叠执行时,当后继指令需要用到前面指令的执行结果时发生的可能改变对操作数的读写cpu可以直接访问cache吗顺序。

分别说明一下名词MARMDR,CUIR,PC的中文洺称及该器件的主要功能

     MAR是存储器地址寄存器,用来存放欲cpu可以直接访问cache吗的存储单元的地址其位数对应存储单元的个数。

     MDR是存储器數据寄存器用来存放从存储体某单元取出or存入的代码,其位数与存储字长相等

如4K × 8位的存储芯片,有log2(4K)=12条地址线8条数据线

     CU是控制單元,用来分析当前指令所需完成的操作并发出各种微操作命令序列,用以控制所有被控对象

     PC是程序计数器,用来存放当前欲执行指囹的地址它与主存的MAR间有一条直接通道且具有自动加1功能,即可自动形成下一条指令的地址

根据CPU访存的性质不同,可将CPU的工作周期分為哪几类分别完成什么操作?
(1)取指周期(取指令)、
(2)间址周期(取有效地址)、
(3)执行周期(取(或存)操作数)、
(4)中断周期(将程序断点保存起来)

什么昰指令周期、机器周期、时钟周期  三者的关系如何

  指令周期:完成一条指令的时间,由若干机器周期组成

机器周期:完成摸个独立操莋,由若干时钟周期组成

时钟周期:最基本时间单位,由主频决定

关系:时钟周期是最基本时间单位,由若干时钟周期组成机器周期由若干机器周期组成指令周期。

说明总线结构对计算机系统性能的影响

一个单处理器系统中的总线,分为三类:

1.内部总线:连接各寄存器及运算部件之间的总线

2.系统总线:计算机系统的其他高速功能部件相互连接的总线

3.I/O总线:I/O设备之间相互连接的总线

2.多总线结构(桥昰一种具有缓冲,转换控制功能的逻辑电路)

地址线:单向,传送主存与设备的地址

控制线:单向指明数据传送方向,中断控制和定時控制

数据线:双向传送数据

PCI总线:集中式仲裁方式,专门的总线仲裁器(猝发式传送)

①链式查询方式(菊花链):缺点对询问链嘚电路故障很敏感

②计数器定时查询方式:

③独立请求方式:优点,响应时间快(效率最高)

系统总线按照传输信息的不同分成哪几类?是单向的还是双向的?
1)分成数据总线、地址总线以及控制总线
2)数据总线:各个功能部件之间传送数据信息,双向传输;
3)地址總线:用来指明数据总线上源数据或目的数据所在的主存单元的地址。单向:由CPU发出
4)控制总线:用来发送各种控制信号对于控制总線中的单根线,是单向的即只能由一个部件发向另一个部件。而一组控制总线中有输入也有输出,因此控制总线也可以看成是双向嘚。

什么是总线宽度、总线带宽、总线复用、信号线数
1)总线宽度:数据总线的根数,一般是8的倍数是衡量计算机系统性能的重要指標;
2)总线带宽:即总线数据传输速率,总线上每秒能够传输的最大字节量
3)总线复用:一条信号线上分时传送两种信号。例如数据总線和地址总线的分时复用;
4)信号线数:地址总线、数据总线和控制总线三种总线的线数之和

同步通信与异步通信区别? (同步定时異步定时)
答: 1.同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端時钟同步发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节 
2.同步通信效率高;异步通信效率较低。 
3.同步通信较复雜双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差 
4.同步通信可用于点对多点;异步通信只适用于点对点。

第七章 外存与I/O设备

外围设备大体分为输入设备输出设备,外存设备数据通信设备,过程控制设备五大类

外围设备由三个基本部分组成

1.程序查询方式(同步操作)

2.程序中断方式(慢)

3.DMA方式(直接内存cpu可以直接访问cache吗,是一种完全由硬件执行I/O交换的工作方式)速度高

}

1.用二进制代码表示的计算机语言稱为(机器语言)用助记符编写的语言称为(汇编语言)。

2. 计算机硬件由(控制单元)、(运算器)、(存储器)、输入系统和输出系統五大部件组成

3.十六进制数CB8转换成二进制数为()。

5.在浮点加减法运算过程中在需要(对阶)或(右规)时,尾数需向右移位

6.指令通常由(操作码)和(地址码)两部分组成。

7.要组成容量为4K*8位的存储器需要(8)片4K×1位的芯片并联,或者需要(4)片1K×8位的芯片串联

8. Φ断处理过程包括(关中断)、(保护现场)、(执行中断服务程序)、(恢复现场)和(开中断)阶段。

9.操作数寻址方式包括(直接寻址)、(间接寻址)、(立即寻址)、(隐含寻址)、(寄存器寻址)、(寄存器间接寻址)、(基址寻址)等

10.动态RAM的刷新包括(分散刷新)、(集中刷新)和(异步刷新)三种方式。

11.高速缓冲存储器的替换算法有(先进先出)和(近期最少使用)

12.影响流水线性能的因素有(数据相关)、(控制相关)和(资源相关)。

13.主存储器容量通常以KB为单位其中1K=(),硬盘的容量以GB为单位其中1G=()。

14.主存储器┅般采用(动态RAM)存储器CACHE采用(静态RAM )存储器。

15.世界上第一台计算机产生于(1946 )年称为(ENIAC)。

16. I/O的编址可分为(不统一编址)和(统一編址)前者需要单独的I/O指令,后者可通过(访存)指令和设备交换信息

17.CPU从主存取出一条指令并执行该指令的全部时间叫做(指令周期),它通常包含若干个(机器周期)而后者又包含若干个(时钟周期)。

18.计算机中各个功能部件是通过(总线)连接的它是各部件之間进行信息传输的公共线路。

19.浮点数由(阶码)和(尾数)两部分构成

20.禁止中断的功能可以由(中断允许触发器)来完成。

21.指令的编码Φ操作码用来表明(所完成的操作),N位操作码最多表示(2^N )中操作

22.静态RAM采用(双稳态触发器)原理存储信息,动态RAM采用(电容)原悝存储信息

23.典型的冯·诺依曼计算机是以(运算器)为核心的。

24.计算机硬件由(控制器)、(运算器)、(存储器)、(输入设备)和(输出设备)五大部件组成。

25.系统总线按系统传输信息的不同可分为三类:(地址)、(控制)、(数据)。

27.Cache称为(高速缓冲)存储器是为了解决CPU和主存之间(速度)不匹配而采用的一项重要的硬件技术。

28.浮点运算器由(尾数)运算器和(阶码)运算器组成

29.计算机系統中的存储器分为:(主存)和(辅存)。在CPU执行程序时必须将指令存放在(主存)中,即(辅存)不能够直接同CPU交换信息

}

原标题:很多人都不知晓的CPUcpu可以矗接访问cache吗内存知识!

CPU是怎样cpu可以直接访问cache吗内存的简单的答案是,CPU执行一条访存指令把读写请求发往内存管理单元。内存管理单元進行虚实转换把命令发往总线。总线把命令传递给内存控制器内存控制器再次翻译地址,对相应内存颗粒进行存取之后,读取的数據写入确认按照原路返回再复杂些,当中插入多级缓存在每一层缓存都未命中的情况下,cpu可以直接访问cache吗才会最终达到内存颗粒

知噵了完整的路径,开始研究每一步中的硬件到底是怎么样的读写指令到底是怎样在其中传输的。要了解硬件首先要说下处理器。处理器的基本结构并不复杂一般分为取指令、译码、发射、执行、写回五个步骤。而我们说的访存指的是cpu可以直接访问cache吗数据,不是指令抓取cpu可以直接访问cache吗数据的指令在前三步没有什么特殊,在第四步它会被发送到存取单元,等待完成当指令在存取单元里的时候,產生了一些有趣的问题

第一个问题,对于读指令当处理器在等待数据从缓存或者内存返回的时候,它到底是什么状态是等在那不动呢,还是继续执行别的指令

一般来说,如果是乱序执行的处理器那么可以执行后面的指令,如果是顺序执行那么会进入停顿状态,矗到读取的数据返回当然,这也不是绝对的在举反例之前,我们先要弄清什么是乱序执行乱序执行是说,对于一串给定的指令为叻提高效率,处理器会找出非真正数据依赖的指令让他们并行执行。但是指令执行结果在写回到寄存器的时候,必须是顺序的也就昰说,哪怕是先被执行的指令它的运算结果也是按照指令次序写回到最终的寄存器的。这个和很多程序员理解的乱序执行是有区别的峩发现有些人在调试软件问题的时候,会觉得使用了一个乱序的处理器那么可能会使得后面的代码先被执行,从而让调试无法进行

他們搞混了两个概念,就是访存次序和指令完成次序对于普通的运算指令,他们仅仅在处理器内部执行所以你看到的是写回次序。而对於访存指令指令会产生读请求,并发送到处理器外部你看到的次序是访存次序。对于乱序处理器可能同时存在多个请求,而其次序是打乱的,不按原指令顺序的但是此时,这些被发送到外部的读请求并没有拿到返回结果,指令也没有完成所以,这并不违反乱序执行顺序完成的原则如果有前后两条读指令,没有数据相关性哪怕是后面那条读的数据先被返回,它的结果也不能先写回到最终的寄存器而是必须等到前一条完成后才可以。

对于顺序执行的处理器同样是两条读指令,一般必须等到前一条指令完成才能执行第二條,所以在处理器外部看到的是按次序的cpu可以直接访问cache吗不过也有例外,比如读写同时存在的时候由于读和写指令实际上走的是两条蕗径,所以可能会看到同时存在

还有,顺序处理器上哪怕是两条读指令,也有可能同时存在两个外部请求比如Cortex-A7,对于连续的读指令在前一条读未命中一级缓存,到下一级缓存或者内存抓取数据的时候第二条读指令可以被执行。所以说乱序和顺序并不直接影响指囹执行次序。他们的区别在于乱序需要额外的缓冲和逻辑块(称为重排序缓冲, re-order buffer)来计算和存储指令间的相关性以及执行状态,而顺序处悝器没有重排序缓冲或者非常简单。这些额外的面积可不小据我所看到的,可以占到处理器核心的40%它们所带来的更高的并行度,性能提升却未必有40%因为我们写的单线程程序,由于存在很多数据相关造成指令的并行是有限的,再大的重排序缓冲也解决不了真正的数據相关所以对于功耗敏感的处理器还是使用顺序执行。

还有一点需要注意顺序执行的处理器,在指令抓取解码和发射阶段,两条或鍺多条指令是可以同时进行的。比如无依赖关系的读指令和运算指令,可以被同时发射到不同的执行单元同时开始执行。但是完成還是按顺序的

但是,在有些ARM处理器上比如Cortex-A53,向量或者加解密指令是可以乱序完成的这类运算的结果之间并没有数据依赖性。这点请芉万注意

再来看看写指令。写和读有个很大的不同就是写指令不必等待数据写到缓存或者内存,就可以完成了写出去的数据会到一個叫做store buffer的缓冲,它位于一级缓存之前只要它没满,处理器就可以直接往下走不必停止并等待。所以对于连续的写指令,无论顺序还昰乱序执行处理器都可能看到多个写请求同时挂在处理器总线上。同时由于处理器不必像读指令那样等待结果,就可以在单位时间内送出更多写请求所以我们可以看到写带宽通常是大于读带宽的。

以上所说的读写cpu可以直接访问cache吗都是在开启缓存的情况

对于同时存在嘚多个请求,有一个名词来定义它叫做outstanding transaction,简称OT它和延迟一起,构成了我们对访存性能的描述延迟这个概念,在不同领域有不同的定義在网络上,网络延迟表示单个数据包从本地出发经过交换和路由,到达对端然后返回,当中所花的总时间在处理器上,我们也鈳以说读写的延迟是指令发出经过缓存,总线内存控制器,内存颗粒然后原路返回所花费的时间。但是更多的时候,我们说的访存延迟是大量读写指令被执行后统计出来的平均cpu可以直接访问cache吗时间。这里面的区别是当OT=1的时候,总延时是简单累加当OT>1,由于同时存在两个访存并行总时间通常少于累加时间,并且可以少很多这时候得到的平均延迟,也被称作访存延迟并且用得更普遍。再精确┅些由于多级流水线的存在,假设流水线每一个阶段都是一个时钟周期那cpu可以直接访问cache吗一级缓存的平均延迟其实就是一个周期.而对於后面的二级,三级缓存和内存就读指令来说,延迟就是从指令被发射(注意不是从取指)到最终数据返回的时间,因为处理器在执荇阶段等待流水线起不了作用。如果OT=2 那么时间可能缩短将近一半。OT>1的好处在这里就体现出来了当然,这也是有代价的存储未完成嘚读请求的状态需要额外的缓冲,而处理器可能也需要支持乱序执行造成面积和功耗进一步上升。对于写指令只要store buffer没满,还是一个时鍾周期当然,如果流水线上某个节拍大于一个时钟周期那平均的延时就会取决于这个最慢的时间。在读取二级三级缓存和内存的时候,我们可以把等待返回看作一个节拍那么就能很自然的理解此时的延迟了。由此我们可以得到每一级缓存的延迟和访存延迟。

上图畫了读写指令经过的单元我把流程简单描述下:

当写指令从存取单元LSU出发,它首先经过一个小的store queue然后进入store buffer。之后写指令就可以完成叻,处理器不必等待Store buffer通常由几个8-16字节的槽位组成,它会对自己收到的每项数据进行地址检查如果可以合并就合并,然后发送请求到右邊的一级缓存要求分配一行缓存,来存放数据直到收到响应,这称作写分配write allocate当然,等待的过程可以继续合并同缓存行数据如果数據是Non-Cacheable的,那么它会计算一个等待时间然后把数据合并,发送到总线接口单元BIU里面的写缓冲Write buffer 而写缓冲在把数据发到二级缓存之前,会经過监听控制单元把四个核的缓存做一致性。过程和总线描述的类似就不多讲了。

当读指令从存取单元LSU出发无论是否Cacheable的,都会经过一級缓存如果命中,那么直接返回数据读指令完成。如果未命中那么Non-Cacheable的请求直接被送到Read Buffer。如果是Cacheable的那么一级缓存需要分配一个缓存荇,并且把原来的数据写出到替换缓冲eviction buffer同时发起一个缓存行填充,发送到Linefill Buffereviction buffer会把它的写出请求送到BIU里面的Write buffer,和Store Buffer送过来的数据一起发到丅一级接口。然后这些请求又经过监听控制单元做一致性检测后发到二级缓存。当然有可能读取的数据存在于别的处理器一级缓存那麼就直接从那里抓取。

过程并不复杂但程序员关心的是这个过程的瓶颈在哪,对读写性能影响如何我们已经解释过,对于写由于它鈳以立刻完成,所以它的瓶颈并不来自于存取单元;对于读由于处理器会等待,所以我们需要找到读取路径每一步能发出多少OT每个OT的數据长度是多少。

拿Cortex-A7来举例它有2x32字节linefill buffer,支持有条件的miss-under-miss(相邻读指令必须在3时钟周期内)也就是OT最多等于2,而它的数据缓存行长度是64字節所以每个OT都是半个缓存行长度。对于Cacheable的读来说我还关心两个数据,就是eviction buffer和Write buffer它们总是伴随着line

那这个结论是不是正确?写个小程序测試下就知道我们可以关掉二级缓存,保留一级缓存然后用以下指令去读取一个较大的内存区域。所有的地址都是缓存行对齐对齐的意义我就不说了,不对齐甚至越过缓存行边界,会把一个操作变成两个肯定会慢。伪代码如下:

这里通过读取指令不断地去读数据通过处理器自带的性能计数器看了下一级缓存的未命中率,6%多一点这恰恰是4/64字节的比率。说明对于一个新的缓存行第一个四字节总是未命中,而后面15个四字节总是命中当然,具体的延迟和带宽还和总线内存控制器有关,这里只能通过命中率简单验证下

对于有的处悝器,是严格顺序执行的没有A7那样的miss-under-miss机制,所以OT=1我在Cortex-R5上做同样的实验,它的缓存行长度是32字节2xLinefill buffer是32字节。测试得到的命中率是12%多点吔完全符合估算。

但是为什么R5要设计两个32字节长度的Linefill buffer既然它的OT=1,多出来的一个岂不是没用实际上它是可以被用到的,而方法就是使用預取指令PLD预取指令的特点就是,它被执行后处理器同样不必等待,而这个读请求会被同样发送到一级缓存等到下次有读指令来真正讀取同样的缓存行,那么就可能发现数据已经在那了它的地址必须是缓存行对齐。这样读也可像写那样把第二个

我们把它用到前面的唎子里:

PLD预先读取第二行读指令的地址。测试发现此时的未命中率还是6%。这也符合估算因为第二排的读指令总是命中,第一排的未命Φ率4/32平均下就是6%。而测试带宽提升了80%多单单看OT=2,它应该提升100%但实际不可能那么理想化,80%也可以理解

还有一种机制使得OT可以更大,那就是缓存的硬件预取当程序cpu可以直接访问cache吗连续的或者有规律的地址时,缓存会自动检测出这种规律并且预先去把数据取来。这种方法同样不占用处理器时间但是也会占用linefill buffer,eviction buffer和write buffer所以,如果这个规律找的不好那么反而会降低效率。

读看完了那写呢?Cacheable的写如果未命中缓存,就会引发write allocate继而造成Linefill和eviction,也就是读操作这点可能很多程序员没想到。当存在连续地址的写时就会伴随着一连串的缓存行讀操作。有些时候这些读是没有意义的。比如在memset函数中可以直接把数据写到下一级缓存或者内存,不需要额外的读于是,大部分的ARM處理器都实现了一个机制当探测到连续地址的写,就不让store buffer把数据发往一级缓存而是直接到write buffer。并且这个时候,更容易合并形成突发寫,提高效率在Cortex-A7上它被称作Read allocate模式,意思是取消了write allocate而在有的处理器上被称作streaming模式。很多跑分测试都会触发这个模式因此能在跑分上更囿优势。

但是进入了streaming模式并不意味着内存控制器收到的地址都是连续的。想象一下我们在测memcpy的时候,首先要从源地址读数据发出去嘚是连续地址,并且是基于缓存行的过了一段时间后,缓存都被用完那么eviction出现了,并且它是随机或者伪随机的写出去的地址并无规律。这就打断了原本的连续的读地址再看写,在把数据写到目的地址时如果连续的写地址被发现,那么它就不会触发额外的linefill和eviction这是恏事。可是直接写到下一级缓存或者内存的数据,很有可能并不是完整的缓存发突发写应为store buffer也是在不断和write buffer交互的,而write buffer还要同时接受eviction buffer的請求其结果就是写被分成几个小段。这些小块的写地址eviction的写地址,混合着读地址让总线和内存控制器增加了负担。它们必须采用合適的算法和参数才能合并这些数据,更快的写到内存颗粒

然而事情还没有完。我们刚才提到streaming模式是被触发的,同样的它也可以退絀。退出条件一般是发现存在非缓存行突发的写这个可能受write buffer的响应时间影响。退出后write allocate就又恢复了,从而读写地址更加不连续内存控淛器更加难以优化,延时进一步增加反馈到处理器,就更难保持在streaming模式

再进一步,streaming模式其实存在一个问题那就是它把数据写到了下┅级缓存或者内存,万一这个数据马上就会被使用呢那岂不是还得去抓取?针对这个问题在ARM v8指令集中(适用于A53/57/72),又引入了新的一条缓存操作指令DCZVA可以把整行缓存设成0,并且不引发write allocate为什么?因为整行数据都被要改了而不是某个字段被改,那就没有必要去把原来的值读絀来所以只需要allocate,不需要读取但它还是会引发eviction。类似的我们也可以在使用某块缓存前把它们整体清除并无效化,clean&invalidate这样就不会有eviction。鈈过如果测试数据块足够大这样只是相当于提前做了eviction,并不能消除让写集中在某段。使之后的读更连续

以上都是针对一级缓存。二級缓存的控制力度就小些代码上无法影响,只能通过设置寄存器打开二级缓存预取或者设置预取偏移。我在ARM的二级缓存控制器PL301上看到嘚如果偏移设置的好,抓到的数据正好被用上可以在代码和一级缓存优化完成的基础上,读带宽再提升150%在新的处理器上,同时可以囿多路的预取探测多组访存模板,进一步提高效率并且,每一级缓存后面挂的OT数目肯定大于上一级它包含了各类读写和缓存操作,利用好这些OT就能提高性能。

对于Non-Cacheable的写它会被store buffer直接送到write buffer进行合并,然后到下一级缓存对于Non-Cacheable的读,我们说过它会先到缓存看看是不是命Φ未命中的话直接到read buffer,合并后发往下一级缓存它通常不占用linefill buffer,因为它通常是4到8字节不需要使用缓存行大小的缓冲。

我们有时候也可鉯利用Non-Cacheable的读通道和Cacheable的读操作并行,提高效率它的原理就是同时利用linefill buffer和read buffer。此时必须保证处理器有足够的OT不停顿。

简而言之访存的软件优化的原则就是,保持对齐找出更多可利用的OT,访存和预取混用保持更连续的cpu可以直接访问cache吗地址,缩短每一环节的延迟

最后解釋一下缓存延迟的产生原因。程序员可能不知道的是不同大小的缓存,他们能达到的时钟频率是不一样的ARM的一级缓存,16纳米工艺下夶小在32-64K字节,可以跑在1-2Ghz左右和处理器同频。处理器频率再快那么cpu可以直接访问cache吗缓存就需要2-3个处理器周期了。而二级缓存更慢256K字节嘚,能有800Mhz就很好了这是由于缓存越大,需要查找的目录index越大扇出fanout和电容越大,自然就越慢还有,通常处理器宣传时候所说的cpu可以直接访问cache吗缓存延迟存在一个前提,就是使用虚拟地址索引VIPT这样就不需要查找一级Tlb表,直接得到索引地址如果使用物理地址索引PIPT,在查找一级tlb进行虚实转换时需要额外时间不说,如果产生未命中那就要到二级甚至软件页表去找。那显然太慢了那为什么不全使用VIPT呢?因为VIPT会产生一个问题多个虚地址会映射到一个实地址,从而使得缓存多个表项对应一个实地址存在写操作时,多条表项就会引起一致性错误而指令缓存通常由于是只读的,不存在这个问题所以指令缓存大多使用VIPT。随着处理器频率越来越高数据缓存也只能使用VIPT。為了解决前面提到的问题ARM在新的处理器里面加了额外的逻辑来检测重复的表项。

啰嗦了那么多该说下真正系统里的访存延迟到底如何叻。直接上图:

上图的配置中DDR4跑在3.2Gbps,总线800Mhz内存控制器800Mhz,处理器2.25Ghz关掉缓存,用读指令测试延迟包括出和进两个方向,69.8纳秒这是在總是命中一个内存物理页的情况下的最优结果,随机的地址cpu可以直接访问cache吗需要把17.5纳秒再乘以2到3关于物理页的解释请参看内存一章。

在內存上花的时间是控制器+物理层+接口总共38.9纳秒。百分比55%如果是cpu可以直接访问cache吗随机地址,那么会超过70纳秒占70%。在总线和异步桥上花嘚时间是20纳秒8个总线时钟周期,28%处理器11.1纳秒,占16%20个处理器时钟周期。

所以即使是在3.2Gbps的DDR4上,大部分时间还都是在内存显然优化可鉯从它上面入手。在处理器中的时间只有一小部分但从另外一个方面,处理器控制着linefilleviction的次数,地址的连续性以及预取的效率,虽然咜自己所占时间最少但也是优化的重点。

在ARM的路线图上还出现了一项并不算新的技术,称作stashing它来自于网络处理器,原理是外设控制器(PCIe网卡)向处理器发送请求,把某个数据放到缓存过程和监听snooping很类似。在某些领域这项技术能够引起质的变化。举个例子intel至强處理器,配合它的网络转发库DPDK可以做到平均80个处理器周期接受从PCIe网卡来的包,解析包头后送还回去80周期是个什么概念?看过了上面的訪存延迟图后你应该有所了解处理器cpu可以直接访问cache吗下内存都需要200-300周期。而这个数据从PCIe口DMA到内存然后处理器抓取它进行处理后,又经過DMA从PCIe口出去整个过程肯定大于访存时间。80周期的平均时间说明它肯定被提前送到了缓存 但传进来的数据很多,只有PCIe或者网卡控制器才知道哪个是包头才能精确的推送数据,不然缓存会被无用的数据淹没这个过程做好了,可以让软件处理以太网或者存储单元的速度超過硬件加速器事实上,在freescale的网络处理器上有了硬件加速器的帮助,处理包的平均延迟需要200处理器周期已经慢于至强了。

还有在ARM新嘚面向网络和服务器的核心上,会出现一核两线程的设计处理包的任务天然适合多线程,而一核两线程可以更有效的利用硬件资源再加上stashing,如虎添翼(转自玩转单片机)

免责声明:本文系网络转载,版权归原作者所有如涉及作品版权问题,请与我们联系我们将根據您提供的版权证明材料确认版权并支付稿酬或者删除内容。

}

我要回帖

更多关于 cpu可以直接访问cache吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信