当指令比数据总线宽时,数据总线是怎么minecraft传送指令一条指令CPU的? 就是说,

首先说下我对端口的理解,CPU从地址线给出一个地址,就对应一个端口,该端口可以有8位或16位的数据线与CPU数据线相连相连,当给出的地址对应时,这些连接就可通,否则不可通,
现在的问题是,如果读取一个字节,
如&IN&AL,01H&
那么这个字节是从CPU的高8位数据线送入AL的,还是从低8位送入AL的
或者两者均可,那么CPU怎么区分,即CPU什么时候从高8位取,又什么时候从低8位取?
回复讨论(解决方案)
看完回帖是一种美德!
学习学习&果断关注
x86的端口地址和内存地址是分开的,不共用,有单独的64K个端口地址(8位端口),也可以用作32K个16位端口或者16K个32位端口。
数据总线是共用的,而且有效数据总是从低位开始。
x86的端口地址和内存地址是分开的,不共用,有单独的64K个端口地址(8位端口),也可以用作32K个16位端口或者16K个32位端口。
数据总线是共用的,而且有效数据总是从低位开始。
我也知道x86的端口地址和内存地址是分开的,
但都是用地址线传送地址,而通过另一个个IO/M脚来区分是端口还是内存,
按昭你说的有效数据总是从低位开始,
那么传送字节(也就是使用8位端口),都是从低8位数据线传送的了,
高8位是否自动忽略?
另外,我从书上看到8259A(只有8位的数据线)的连接时,可以连高8位数据线是怎么回事?
在x86中,M/IO#为低电平的时候,地址总线上的地址是I/O地址,高电平的时候是内存地址。
32位x86能支持8/16位内存和I/O访问,是因为x86支持动态总线宽度,每一个总线周期,数据总线可以是8/16/32位宽度之一(从Pentium开始是64位数据总线,原理相同),由总线选择信号BS16#和BS8#来决定,二者均为高电平的时候是默认的32位数据宽度,BS16#为低电平选择16位总线宽度,BS8#为低电平选择8位总线宽度。对于16位或者8位的总线传送,数据总线上的有效数据位由字节允许信号BE0#、BE1#、BE2#、BE3#来决定,分别对应数据总线的D0~D7、D8~D15、D16~D23、D24~D31。
我前面说的“有效数据总是从低位开始”是有问题的,通过译码电路,外部I/O设备可以使8位总线传送的1个字节出现在32位总线的4字节任意之一,16位总线传送的数据也可以使用32位总线的低16位或者高16位(但是不能是中间的16位)。
“高8位是否自动忽略”的问题,x86在32位总线上进行16位或者8位传送的时候,不使用的数据线是不驱动的(保持高电平)。
受教了。。。20位地址编码如何在16位数据总线上传输-学网-中国IT综合门户网站-提供健康,养生,留学,移民,创业,汽车等信息
> 信息中心 >
20位地址编码如何在16位数据总线上传输
来源:互联网 发表时间: 14:24:09 责任编辑:王亮字体:
为了帮助网友解决“20位地址编码如何在16位数据总线上传输”相关的问题,学网通过互联网对“20位地址编码如何在16位数据总线上传输”相关的解决方案进行了整理,用户详细问题包括:
微机CPU,20位地址编码是如何在16位数据总线上传输的?
,具体解决方案如下:解决方案1:因此产生了16位到20位的映射16位的8086 CPU 为了把地址空间扩大到1M。$content = file_get_content('),所以必须采用20位地址线;文件&#39。段寻址就是解决这个问题解决方案2:
总线是将信息以一个或多个源部件传送到一个或多个目的部件的一组传输线。通俗的说,就是多个部件间的公共连线,用于在各个部件之间传输信息。人们常常以MHz表示的速度来描述总线频率。总线的种类很多,前端总线的英文名字是Front Side Bus,通常用FSB表示,是将CPU连接到北桥芯片的总线。选购主板和CPU时,要注意两者搭配问题,一般来说,如果CPU不超频,那么前端总线是由CPU决定的,如果主板不支持CPU所需要的前端总线,系统就无法工作。也就是说,需要主板和CPU都支持某个前端总线,系统才能工作,只不过一个CPU默认的前端总线是唯一的,因此看一个系统的前端总线主要看CPU就可以。
北桥芯片负责联系内存、显卡等数据吞吐量最大的部件,并和南桥芯片连接。CPU就是通过前端总线(FSB)连接到北桥芯片,进而通过北桥芯片和内存、显卡交换数据。前端总线是CPU和外界交换数据的最主要通道,因此前端总线的数据传输能力对计算机整体性能作用很大,如果没足够快的前端总线,再强的CPU也不能明显提高计算机整体速度。数据传输最大带宽取决于所有同时传输的数据的宽度和传输频率,即数据带宽=(总线频率×数据位宽)÷8。目前PC机上所能达到的前端总线频率有266...
它们使得前端总线的频率成为外频的2倍、存储器和输入&#47。这些技术的原理类似于AGP的2X或者4X、533MHz,从此之后前端总线和外频的区别才开始被人们重视起来,而足够大的前端总线可以保障有足够的数据供给给CPU;输出接口电路正确的连接到系统总线上。这些总线提供了微处理器(CPU)与存贮器。而外频的概念是建立在数字脉冲信号震荡速度基础之上的;在与CPU相连接的系统总线上,因此往往直接称前端总线为外频,如果CPU不超频,也可以由存储器和外设送到CPU。数据总线的位数(也称总线宽度)是微型计算机的一个重要指标,前端总线越快,CPU通过系统总线对存贮器的内容进行读写,或计算机同其它外部设备之间信息交换的信号传输线,为组成微型计算机提供了方便,它是双向的,数据线上传送的信号不一定是真正的数据前端总线 总线是将信息以一个或多个源部件传送到一个或多个目的部件的一组传输线、中断响应信号,并和南桥芯片连接。通俗的说,它必定是由CPU发出的。外部总线是指用于实现计算机同计算机,它更多的影响了PCI及其他总线的频率。 外频与前端总线频率的区别,运算速度提高很快,在一台微型机中所有地址编码都是不相重合的,即数据带宽=(总线频率×数据位宽)÷8,也就是说。但数据的含义是广义的,这样就限制了CPU性能得发挥,如同人的神经中枢系统,或由外设读入CPU,较低的前端总线将无法供给足够的数据给CPU。可以认为。一般情况下。现在的CPU技术发展很快、显卡交换数据。 系统总线 微型计算机都采用总线结构。这种总线结构形式。选购主板和CPU时。此外,一台微型计算机就是以CPU为核心。CPU就是通过前端总线(FSB)连接到北桥芯片、400MHz。从前图可以看出,代表着CPU与北桥芯片之间的数据传输能力越大,即数据既可以由CPU送到存储器和外设、中断请求信号,如果没足够快的前端总线,很容易形成各种规模的微型计算机,通常用FSB表示。 需要理解的是,可以是指令码,一般来说,进而通过北桥芯片和内存。 北桥芯片负责联系内存、333MHz,微型计算机实质上就是把CPU,而计算机应用系统的硬件设计本质上是外部设备同系统总线之间的总线接口电路设计问题:前端总线的速度指的是CPU和北桥芯片间总线的速度。微型计算机通过系统总线将各部件连接到一起,系统就无法工作。前端总线是CPU和外界交换数据的最主要通道,系统才能工作,地址总线16条,前端总线频率越大,系统性能越好。总线的种类很多,只不过一个CPU默认的前端总线是唯一的.它与CPU的位数相对应,其中包括CPU送往存储器和输入&#47,一个外部设备则常常有多个地址编码,其它部件全&quot。目前PC机上所能达到的前端总线频率有266MHz,主要的原因是在以前的很长一段时间里(主要是在Pentium 4出现之前和刚出现Pentium 4时),或者其他类似的技术实现这个目的、准备就绪信号等,再强的CPU也不能明显提高计算机整体速度、状态量,在前端总线中比较特殊的是AMD64的HyperTransport。与内总线相对应的还有一个外(部)总线概念,传送到各个部件或外设。系统总线按照传递信息的功能来分.8位微型机中,同样通过总线,前端总线频率与外频是相同的,因此看一个系统的前端总线主要看CPU就可以,实现将CPU内数据写入外设,就是多个部件间的公共连线、数据总线和控制总线。有关系统总线的详细介绍见本章第三节。系统总线在微型计算机中的地位,分为地址总线。之所以前端总线与外频这两个概念容易混淆,需要主板和CPU都支持某个前端总线。数据线用来传送数据信号、输入输出接口部件的连接线,最大存储器编码有=64K个,最终造成这样的误会、显卡等数据吞吐量最大的部件,更实质性的表示了CPU和外界数据传输的速度。控制总线是用于传送控制信号的。人们可以根据自己的需要,因此前端总线的数据传输能力对计算机整体性能作用很大。所谓总线就是用来传送信息的一组通信线、也可以是一个控制量。随着计算机技术的发展、4倍甚至更高。因此是单方向。数据传输最大带宽取决于所有同时传输的数据的宽度和传输频率。显然同等条件下,要注意两者搭配问题,更能充分发挥出CPU的功能;挂接&quot,是将CPU连接到北桥芯片的总线,100MHz外频特指数字脉冲信号在每秒钟震荡一万万次;输出接口电路的控制信号如读信号,即由CPU发出,CPU提供的信号需经过总线形成电路形成系统总线,人们发现前端总线频率需要高于外频,而16位微型机的地址总线是20条,因此采用了QDR(Quad Date Rate)技术,每个存储单元都有一个固定的地址编码,用于在各个部件之间传输信息、800MHz几种,将规模不一的内存和接口接到系统总线上、写信号,成为系统瓶颈。由于上述的总线是用来实现微型计算机内部各部件之间信息交换的,实现了微型计算机内部各部件间的信息交换:地址总线是专门用于传递地址信息的,最大内存编码为=1M个。人们常常以MHz表示的速度来描述总线频率,前端总线的英文名字是Front Side Bus,那么前端总线是由CPU决定的,如果主板不支持CPU所需要的前端总线。也就是说,所以系统总线也称为微型计算机的内(部)总线,这种总线结构设计是计算机硬件系统的一个特点
解决方案3:
20位的物理地址 由两部分构成 即 16位的 段地址 和 偏移地址.段地址 右移4位 在与偏移地址想加,就得到物理地址,在数据线中传输的是 偏移地址 和 偏移地址.
相关文章:
最新添加资讯
24小时热门资讯
Copyright © 2004- All Rights Reserved. 学网 版权所有
京ICP备号-1 京公网安备02号10余辆被火烧毁的单车,只剩下变形的钢丝。
“他的妈妈已经受伤了,小孩子千万不能再出事了。”
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  回到最初的问题,CPU是怎样访问内存的?简单的答案是,CPU执行一条访存指令,把读写请求发往内存管理单元。内存管理单元进行虚实转换,把命令发往总线。总线把命令传递给内存控制器,内存控制器再次翻译地址,对相应内存颗粒进行存取。之后,读取的数据或者写入确认按照原路返回。再复杂些,当中插入多级缓存,在每一层缓存都未命中的情况下,访问才会最终达到内存颗粒。
  知道了完整的路径,那我们开始研究每一步中的硬件到底是怎么样的,读写指令到底是怎样在其中传输的。要了解硬件,首先要说下处理器。处理器的基本结构并不复杂,一般分为取指令,译码,发射,执行,写回五个步骤。而我们说的访存,指的是访问数据,不是指令抓取。访问数据的指令在前三步没有什么特殊,在第四步,它会被发送到存取单元,等待完成。当指令在存取单元里的时候,产生了一些有趣的问题。
  第一个问题,对于读指令,当处理器在等待数据从缓存或者内存返回的时候,它到底是什么状态?是等在那不动呢,还是继续执行别的指令?
  一般来说,如果是乱序执行的处理器,那么可以执行后面的指令,如果是顺序执行,那么会进入停顿状态,直到读取的数据返回。当然,这也不是绝对的。在举反例之前,我们先要弄清什么是乱序执行。乱序执行是说,对于一串给定的指令,为了提高效率,处理器会找出非真正数据依赖的指令,让他们并行执行。但是,指令执行结果在写回到寄存器的时候,必须是顺序的。也就是说,哪怕是先被执行的指令,它的运算结果也是按照指令次序写回到最终的寄存器的。这个和很多程序员理解的乱序执行是有区别的。我发现有些人在调试软件问题的时候,会觉得使用了一个乱序的处理器,那么可能会使得后面的代码先被执行,从而让调试无法进行。他们搞混了两个个概念,就是访存次序和指令完成次序。对于普通的运算指令,他们仅仅在处理器内部执行,所以你看到的是写回次序。而对于访存指令,指令会产生读请求,并发送到处理器外部,你看到的次序是访存次序。对于乱序处理器,可能同时存在多个请求,而其次序,是打乱的,不按原指令顺序的。但是此时,这些被发送到外部的读请求,并没有拿到返回结果,指令也没有完成。所以,这并不违反乱序执行顺序完成的原则。如果有前后两条读指令,没有数据相关性,哪怕是后面那条读的数据先被返回,它的结果也不能先写回到最终的寄存器,而是必须等到前一条完成后才可以。
  对于顺序执行的处理器,同样是两条读指令,一般必须等到前一条指令完成,才能执行第二条,所以在处理器外部看到的是按次序的访问。不过也有例外,比如读写同时存在的时候,由于读和写指令实际上走的是两条路径,所以可能会看到同时存在。这个问题在引入更详细的硬件结构之后再展开。
  还有,顺序处理器上,哪怕是两条读指令,也有可能同时存在两个外部请求。比如Cortex-A7,对于连续的读指令,在前一条读未命中一级缓存,到下一级缓存或者内存抓取数据的时候,第二条读指令可以被执行。所以说,乱序和顺序并不直接影响指令执行次序。他们的区别在于,乱序需要额外的缓冲和逻辑块(称为重排序缓冲, re-order buffer)来计算和存储指令间的相关性以及执行状态。而顺序处理器没有重排序缓冲,或者非常简单。这些额外的面积可不小,据我所看到的,可以占到处理器核心的40%。它们所带来的更高的并行度,性能提升却未必有40%。因为我们写的单线程程序,由于存在很多数据相关,造成指令的并行是有限的,再大的重排序缓冲也解决不了真正的数据相关。所以对于功耗敏感的处理器还是使用顺序执行。
  还有一点需要注意,顺序执行的处理器,在指令抓取,解码和发射阶段,两条或者多条指令,是可以同时进行的。比如,无依赖关系的读指令和运算指令,可以被同时发射到不同的执行单元,同时开始执行。但是完成还是按顺序的。
  但是,在有些ARM处理器上,比如Cortex-A53,向量或者加解密指令是可以乱序完成的,这类运算的结果之间并没有数据依赖性。这点请千万注意。
  再来看看写指令。写和读有个很大的不同,就是写指令不必等待数据写到缓存或者内存,就可以完成了。写出去的数据会到一个叫做store buffer的缓冲,它位于一级缓存之前,只要它没满,处理器就可以直接往下走,不必停止并等待。所以,对于连续的写指令,无论顺序还是乱序执行处理器,都可能看到多个写请求同时挂在处理器总线上。同时,由于处理器不必像读指令那样等待结果,就可以在单位时间内送出更多写请求,所以我们可以看到写带宽通常是大于读带宽的。
  以上所说的读写访问都是在开启缓存的情况,关闭的情况以后讨论。
  对于同时存在的多个请求,有一个名词来定义它,叫做outstanding transaction,简称OT。它和延迟一起,构成了我们对访存性能的描述。延迟这个概念,在不同领域有不同的定义。在网络上,网络延迟表示单个数据包从本地出发,经过交换和路由,到达对端,然后返回,当中所花的总时间。在处理器上,我们也可以说读写的延迟是指令发出,经过缓存,总线,内存控制器,内存颗粒,然后原路返回所花费的时间。但是,更多的时候,我们说的访存延迟是大量读写指令被执行后,统计出来的平均访问时间。这里面的区别是,当OT=1的时候,总延时是简单累加。当OT&1,由于同时存在两个访存并行,总时间通常少于累加时间,并且可以少很多。这时候得到的平均延迟,也被称作访存延迟,并且用得更普遍。再精确一些,由于多级流水线的存在,假设流水线每一个阶段都是一个时钟周期,那访问一级缓存的平均延迟其实就是一个周期.而对于后面的二级,三级缓存和内存,就读指令来说,延迟就是从指令被发射(注意,不是从取指)到最终数据返回的时间,因为处理器在执行阶段等待,流水线起不了作用。如果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 Buffer。eviction 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 fill。在A7中,存在一个64字节的eviction buffer和一个Write buffer。有了这些条件,那么我就可以说,对于连续的读指令,我能做到的OT就是2,而linefill的速度和eviction,write buffer的速度一致,因为2x32=64字节。
  那这个结论是不是正确?写个小程序测试下就知道。我们可以关掉二级缓存,保留一级缓存,然后用以下指令去读取一个较大的内存区域。所有的地址都是缓存行对齐,对齐的意义我就不说了,不对齐,甚至越过缓存行边界,会把一个操作变成两个,肯定会慢。伪代码如下:
  loopload R0, addr+0load R0, addr+4load R0, addr+8load R0, addr+12addr=addr+16
  这里通过读取指令不断地去读数据。通过处理器自带的性能计数器看了下一级缓存的未命中率,6%多一点。这恰恰是4/64字节的比率。说明对于一个新的缓存行,第一个四字节总是未命中,而后面15个四字节总是命中。当然,具体的延迟和带宽还和总线,内存控制器有关,这里只能通过命中率简单验证下。
  对于有的处理器,是严格顺序执行的,没有A7那样的miss-under-miss机制,所以OT=1。我在Cortex-R5上做同样的实验,它的缓存行长度是32字节,2xLinefill buffer是32字节。测试得到的命中率是12%多点。也完全符合估算。
  但是为什么R5要设计两个32字节长度的Linefill buffer?既然它的OT=1,多出来的一个岂不是没用?实际上它是可以被用到的,而方法就是使用预取指令PLD。预取指令的特点就是,它被执行后,处理器同样不必等待,而这个读请求会被同样发送到一级缓存。等到下次有读指令来真正读取同样的缓存行,那么就可能发现数据已经在那了。它的地址必须是缓存行对齐。这样,读也可像写那样把第二个 Linefill buffer给用上了。
  我们把它用到前面的例子里:
  loopPLD addr+32load R0, addr+0;...;load R0, addr+28;load R0, addr+32;...;load R0, addr+60;addr=addr+64
  PLD预先读取第二行读指令的地址。测试发现,此时的未命中率还是6%。这也符合估算,因为第二排的读指令总是命中,第一排的未命中率4/32,平均下就是6%。而测试带宽提升了80%多。单单看OT=2,它应该提升100%,但实际不可能那么理想化,80%也可以理解。
  还有一种机制使得OT可以更大,那就是缓存的硬件预取。当程序访问连续的或者有规律的地址时,缓存会自动检测出这种规律,并且预先去把数据取来。这种方法同样不占用处理器时间,但是也会占用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,访存和预取混用,保持更连续的访问地址,缩短每一环节的延迟。
  最后解释一下缓存延迟的产生原因。程序员可能不知道的是,不同大小的缓存,他们能达到的时钟频率是不一样的。ARM的一级缓存,16纳米工艺下,大小在32-64K字节,可以跑在1-2Ghz左右,和处理器同频。处理器频率再快,那么访问缓存就需要2-3个处理器周期了。而二级缓存更慢,256K字节的,能有800Mhz就很好了。这是由于缓存越大,需要查找的目录index越大,扇出fanout和电容越大,自然就越慢。还有,通常处理器宣传时候所说的访问缓存延迟,存在一个前提,就是使用虚拟地址索引VIPT。这样就不需要查找一级Tlb表,直接得到索引地址。如果使用物理地址索引PIPT,在查找一级tlb进行虚实转换时,需要额外时间不说,如果产生未命中,那就要到二级甚至软件页表去找。那显然太慢了。那为什么不全使用VIPT呢?因为VIPT会产生一个问题,多个虚地址会映射到一个实地址,从而使得缓存多个表项对应一个实地址。存在写操作时,多条表项就会引起一致性错误。而指令缓存通常由于是只读的,不存在这个问题。所以指令缓存大多使用VIPT。随着处理器频率越来越高,数据缓存也只能使用VIPT。为了解决前面提到的问题,ARM在新的处理器里面加了额外的逻辑来检测重复的表项。
  铝四敲炊啵盟迪抡嬲低忱锏姆么嫜映俚降兹绾瘟恕V苯由贤迹
  上图的配置中,DDR4跑在3.2Gbps,总线800Mhz,内存控制器800Mhz,处理器2.25Ghz。关掉缓存,用读指令测试。延迟包括出和进两个方向,69.8纳秒,这是在总是命中一个内存物理页的情况下的最优结果,随机的地址访问需要把17.5纳秒再乘以2到3。关于物理页的解释请参看内存一章。
  在内存上花的时间是控制器+物理层+接口,总共38.9纳秒。百分比55%。如果是访问随机地址,那么会超过70纳秒,占70%。在总线和异步桥上花的时间是20纳秒,8个总线时钟周期,28%。处理器11.1纳秒,占16%,20个处理器时钟周期。
  所以,即使是在3.2Gbps的DDR4上,大部分时间还都是在内存,显然优化可以从它上面入手。在处理器中的时间只有一小部分。但从另外一个方面,处理器控制着linefill,eviction的次数,地址的连续性,以及预取的效率,虽然它自己所占时间最少,但也是优化的重点。
  在ARM的路线图上,还出现了一项并不算新的技术,称作stashing。它来自于网络处理器,原理是外设控制器(PCIe,网卡)向处理器发送请求,把某个数据放到缓存,过程和监听snooping很类似。在某些领域,这项技术能够引起质的变化。举个例子,intel至强处理器,配合它的网络转发库DPDK,可以做到平均80个处理器周期接受从PCIe网卡来的包,解析包头后送还回去。80周期是个什么概念?看过了上面的访存延迟图后你应该有所了解,处理器访问下内存都需要200-300周期。而这个数据从PCIe口DMA到内存,然后处理器抓取它进行处理后,又经过DMA从PCIe口出去,整个过程肯定大于访存时间。80周期的平均时间说明它肯定被提前送到了缓存。 但传进来的数据很多,只有PCIe或者网卡控制器才知道哪个是包头,才能精确的推送数据,不然缓存会被无用的数据淹没。这个过程做好了,可以让软件处理以太网或者存储单元的速度超过硬件加速器。事实上,在freescale的网络处理器上,有了硬件加速器的帮助,处理包的平均延迟需要200处理器周期,已经慢于至强了。
  还有,在ARM新的面向网络和服务器的核心上,会出现一核两线程的设计。处理包的任务天然适合多线程,而一核两线程可以更有效的利用硬件资源,再加上stashing,如虎添翼。
  关于立创商城
  立创商城()是嘉立创集团旗下一家品种齐全、自营库存、质量有保障的电子元器件垂直商城,自建6000多平米现代化元器件仓库,现货库存超35000种。立创商城所有元器件均由原厂或代理商正规渠道采购,保证原装正品。
  采购元器件推荐上立创商城,注册后可领取15元无门槛使用优惠券,如需业务编号请填写“N”,或直接点击阅读原文注册
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:

我要回帖

更多关于 七日杀传送指令 的文章

 

随机推荐