computerarchitecturea computer什么意思思及同义词

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
361ComputerArchitectureLecture14CacheMemory:计算机体系结构的高速缓存内存14361讲义.pdf 20页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:100 &&
361ComputerArchitectureLecture14CacheMemory:计算机体系结构的高速缓存内存14361讲义.pdf
你可能关注的文档:
··········
··········
Computer Architecture
Lecture 14: Cache Memory
The Motivation for Caches
Memory System
Motivation:
Large memories (DRAM) are slow
Small memories (SRAM) are fast
Make the average access time
Servicing most accesses from a small, fast memory.
Reduce the bandwidth required of the large memory
Outline of Today’s Lecture
Recap of Memory Hierarchy & Introduction to Cache
A In-depth Look at the Operation of Cache
Cache Write and Replacement Policy
An Expanded View of the Memory System
Levels of the Memory Hierarchy
正在加载中,请稍后...首先,GDDR5并不是DDR3的频率加强版,GDDR5的特性更接近于DDR4并非DDR3。&br&&img src=&/f5643dbedf9d031b12e56_b.jpg& data-rawwidth=&632& data-rawheight=&2240& class=&origin_image zh-lightbox-thumb& width=&632& data-original=&/f5643dbedf9d031b12e56_r.jpg&&如图所示,GDDR5和DDR4都是采用了类似的Bank Group技术,而DDR3与GDDR5的类似之处只是预读取都为8n(其实DDR4的数据预读也是8n)&br&第一个问题:其实最早用在显卡上的DDR颗粒与用在内存上的DDR颗粒仍然是一样的。后来由于GPU特殊的需要,显存颗粒与内存颗粒开始分道扬镳,这其中包括了几方面的因素:&br&&p&&strong&1. GPU需要比CPU更高的带宽。&/strong&GPU不像CPU那样有大容量二三级缓存,GPU与显存之间的数据交换远比CPU频繁,而且大多都是突发性的数据流,因此GPU比CPU更加渴望得到更高的显存带宽支持。位宽×频率=带宽,因此提高带宽的方法就是增加位宽和提高频率,但GPU对于位宽和频率的需求还有其它的因素。&/p&&p&&strong&2.显卡需要高位宽的显存&/strong&。显卡PCB空间是有限的,在有限的空间内如何合理的安排显存颗粒,无论高中低端显卡都面临这个问题。从布线、成本、性能等多种角度来看,显存都需要达到更高的位宽。 最早的显存是单颗16bit的芯片,后来升级到32bit,将来甚至还会有更高的规格出现。而内存则没有那么多要求,多年来内存条都是64bit,所以单颗内存颗粒没必要设计成高位宽,只要提高容量就行了,所以位宽一直维持在4/8bit。&/p&&p&&strong&3.显卡能让显存达到更高的频率。&/strong&显存颗粒与GPU配套使用时,一般都经过专门的设计和优化,而不像内存那样有太多顾忌。GPU的显存控制器比CPU或北桥内存控制器性能优异,而且显卡PCB可以随意的进行优化,因此显存一般都能达到更高的频率。而内存受到内存PCB、主板走线、北桥CPU得诸多因素的限制很难冲击高频率。由此算来,显存与内存“分家”既是意料之外,又是情理之中的事情了。为了更好地满足显卡GPU的特殊要求,一些厂商(如三星等)推出了专门为图形系统设计的高速DDR显存,称为“Graphics Double Data Rate DRAM”,也就是我们现在常见的GDDR。&/p&&p&所以GDDR5的带宽远大于DDR3 DDR4等是理所应当的。其实GDDR5在提高了带宽的同时也带来了延迟(时序)的大幅度增加,但因GPU的大规模并行结构,对延迟的容忍度较高,所以造成的性能损失非常小。而CPU是对延迟(时序)高度敏感的,在极限超频中可以看到对时序的稍微变化便会引起非常大的带宽损失。所以说其实GDDR对应GPU,DDR对应CPU是互相合适的,一个适合在对延迟容忍度高带宽吞吐量大的环境,一个适合对延迟容忍度第带宽吞吐量要求不高的环境。&/p&&br&第二个问题:HBM(High-Bandwidth Memory)从名字便可得知是高带宽的内存,而其的使用环境是用于显存。其实Jedec在当初制定DDR4就已经考虑到了以后的堆叠内存情况,并将其称为3DS(3-Dimensional Stack)&img src=&/20fbae78cff8d47cc4b34_b.png& data-rawwidth=&751& data-rawheight=&539& class=&origin_image zh-lightbox-thumb& width=&751& data-original=&/20fbae78cff8d47cc4b34_r.png&&3DS和HBM同样使用TSV硅穿孔技术。可以理解为是不同技术衍生出的的不同种称呼吧。&br&&img src=&/08f72ecfdd44aeae044c12e6_b.png& data-rawwidth=&738& data-rawheight=&489& class=&origin_image zh-lightbox-thumb& width=&738& data-original=&/08f72ecfdd44aeae044c12e6_r.png&&根据JEDEC的说明,在使用了3DS堆叠封装技术后,单条内存的容量最大可以达到目前产品的8倍之多。举例来说,目前常见的大容量内存单条容量为8GB(单颗芯片512MB,共16颗),未来DDR4最大可以达到64GB,甚至128GB,彻底解决了点对点总线容量不足的问题。另外,即使堆叠层数没有那么多,DDR4内存在4层堆叠的情况下也至少可以达到单条32GB,双通道64GB,基本可以满足未来三、五年左右的内存容量需求了。&br&GDDR5X与GDDR5的区别是将数据预读从8n提升到了16n,从而使带宽翻倍,但是只是当前GDDR5的缓兵之计,不是Jedec的官方标准,只因为目前HBM成本更高,良品率并不是特别满意技术也不是完全成熟,所以才有这么个过渡产品,未来的趋势依然会是HBM。&br&第三个问题:为什么分开用的原因已经在第一个问题回答了,PS4使用的HSA技术的评价还请参考这个问题下的回答&a href=&/question/& class=&internal&&大家怎样看AMD所提出的HSA处理器体系构架? - NVIDIA (英伟达)&/a&,个人认为主机环境较为封闭,更易推行小标准特定优化吧。
首先,GDDR5并不是DDR3的频率加强版,GDDR5的特性更接近于DDR4并非DDR3。 如图所示,GDDR5和DDR4都是采用了类似的Bank Group技术,而DDR3与GDDR5的类似之处只是预读取都为8n(其实DDR4的数据预读也是8n) 第一个问题:其实最早用在显卡上的DDR颗粒与用在内…
感谢邀请。我个人对Intel的MIC不甚了解,所以仅就有限的理解谈一谈。如有不正确的地方,还请各位朋友指正。&br&&br&要回答这个问题,需要从Intel和NVIDIA/AMD等传统显卡制造公司对并行计算的不同看法及实现方法说起。&br&&br&Intel从2007年(或者更早?)开始准备制造自己的GPGPU板卡Larrabee。Larrabee野心很大,旨在保持与x86架构兼容且加入对SIMD和纹理操作的硬件支持。然而,这一项目最终以失败告终。它与GPU及CPU的异同可以参考其维基页面[1]。Intel在2010年宣布的MIC架构[2](基于此架构的产品代号即为Xeon Phi)继承了很多Larrabee的设计思路。MIC架构在设计上仍然基于奔腾P54C,其目的是在保证兼容x86架构的同时,最大限度的利用现有的并行软件架构,如OpenMP,Cilk,ISPC(ISPC作为一个新的并行编程语言,我认为前景很光明。目前它也支持了Xeon Phi[2])和TBB等等。更多的设计细节可以参考维基页面里的描述[3]。我认为Intel在并行计算领域的优势在于这些并行软件平台,如何在提高并行性的同时保持程序员的编码效率才是Intel的着力点。&br&&br&我的一个同事去年夏天曾在Intel实习,以下内容翻译自他给我的一封邮件:&br&&...和GPU不同的是,Xeon Phi是一个CPU,这意味着我们可以在其上运行它自己的操作系统。当我们在Intel使用它时,我们在Xeon Phi板卡上安装了一款linux发行版,并通过PCIe远程连接(ssh)到板卡上运行应用程序。这意味着当我们为板卡上的应用编写代码时,不需要考虑host和device间的内存拷贝(这在传统GPGPU计算中被认为是很大的瓶颈)。&&br&&br&当然,如果在Xeon Phi上从头编写并行应用,并且不满足于OpenMP带来的并行,你可以使用pragma或者Cilk来实现一定程度上的auto-vectorization。如果需要更高的性能,就要用一些更低层的方法,比如Intel Intrinsics。这样一来,也就失去了编码效率。所以,在这一点上,GPU下的编程(OpenCL/CUDA)和Xeon Phi下的编程都无法在性能和编码效率上二者兼得。&br&&br&关于性能问题,据说在传统的并行计算benchmark测试中,Xeon Phi普遍优于多核CPU但性能较之与NVIDIA的同期GPU还有差距。Paralution的这份报告中(第6章)有更详细的性能测评[4](该测评仅限于科学计算相关的kernel,比如BLAS,稀疏矩阵乘法,共轭梯度等)。目前似乎Xeon Phi的测评还比较少,如果过一阵有比较重要的测评我会再来更新。&br&&br&我个人认为Intel在MIC架构上对并行计算的处理思路是很有潜力的。MIC架构的产品在真实感渲染和其他一些GPGPU无法发挥最佳性能的领域还是具有相当的潜力[5]。其对GPGPU的影响,恐怕还需要一些时间才能更好地显现出来。&br&&br&[1] &a href=&///?target=http%3A//en.wikipedia.org/wiki/Larrabee_%28microarchitecture%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Larrabee (microarchitecture)&i class=&icon-external&&&/i&&/a&&br&[2] &a href=&///?target=http%3A//ispc.github.io/ispc.html%23compiling-for-the-intel-xeon-phi-architecture& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&ispc.github.io/ispc.htm&/span&&span class=&invisible&&l#compiling-for-the-intel-xeon-phi-architecture&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&[3] &a href=&///?target=http%3A//en.wikipedia.org/wiki/Intel_MIC%23Design& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Intel MIC&i class=&icon-external&&&/i&&/a&&br&[4] &a href=&///?target=http%3A///downloads/paralution-um.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/download&/span&&span class=&invisible&&s/paralution-um.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&[5] &a href=&///?target=http%3A//embree.github.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Embree&i class=&icon-external&&&/i&&/a&
感谢邀请。我个人对Intel的MIC不甚了解,所以仅就有限的理解谈一谈。如有不正确的地方,还请各位朋友指正。 要回答这个问题,需要从Intel和NVIDIA/AMD等传统显卡制造公司对并行计算的不同看法及实现方法说起。 Intel从2007年(或者更早?)开始准备制造自己…
&p&CPU的硬件资源是动态分配的,或者说,看运气。&/p&&p&超线程这东西并不像想象的那么美好,单核超线程,和双核单线程的性能差距是很大的。&/p&&p&在实时性要求较高的操作系统里,首要的事情就是关闭超线程,因为超线程会让线程的运行时间变得不确定,据说高性能计算的也会关。&/p&&p&表面上看,是一个核跑着两个线程,实际上两个线程哪个线跑完是不确定的,同样的代码的两个线程,跑在一个核上,可能一个已经跑完了,另一个1/3都还没过。&/p&&p&操作系统调度的时候,会根据核的繁忙程度来分配线程。至于会不会让某一个核忙死另一个核在摸鱼,这种事情很难说,看操作系统的调度器如何设计了。理论上说稍微有点脑子的操作系统都会解决这个问题,比如线程按照奇偶数的方式分配核心,先分配1、3、5、7,跑满了以后才是2、4、6、8,这样就可以避免摸鱼的问题了。&/p&&p&反正我手头的WIN7能明显看出来这种现象(CPU为4核 i7-3770,开超线程):&/p&&img src=&/v2-26ab8c9ef5cacec3438b64_b.png& data-rawwidth=&637& data-rawheight=&454& class=&origin_image zh-lightbox-thumb& width=&637& data-original=&/v2-26ab8c9ef5cacec3438b64_r.png&&&p&------------------------&/p&&p&有人贴了AMD的架构,我放一张haswell的图:&/p&&br&&img src=&/v2-3a501efbb9bffb7231ad89_b.png& data-rawwidth=&697& data-rawheight=&1045& class=&origin_image zh-lightbox-thumb& width=&697& data-original=&/v2-3a501efbb9bffb7231ad89_r.png&&&p&可以看到一个核上有不止一个ALU,像x86的LEA指令实际上是有计算的功能的,有单独的ALU负责执行LEA这种指令,所以在任何时刻,一个核里的执行单元都是不可能完全占满的,占不满的情况下,就有能力让另外一个线程执行了,但如果两个线程都需要同样的执行单元(比如都需要进行浮点计算),那么有一个线程就需要等待,此时线程的实际执行时间就是不可控的。&/p&
CPU的硬件资源是动态分配的,或者说,看运气。超线程这东西并不像想象的那么美好,单核超线程,和双核单线程的性能差距是很大的。在实时性要求较高的操作系统里,首要的事情就是关闭超线程,因为超线程会让线程的运行时间变得不确定,据说高性能计算的也会…
&p&66h前缀,用于改变default operand size,如果原来是16位的,则变成32位的,如果是原来是32位或者64位的,则变成16位。&/p&&p&所以,理解的关键就是要判断当前代码的执行模式。&/p&&br&&p&简单的例子:&/p&&p&默认操作数大小是16位的情况下(实模式、V8086模式),加66h则变成32位,例如,在实模式下的汇编指令mov eax,&/p&&p&默认操作数大小是32位的情况下(保护模式),加66h则变成16位,例如,在保护模式下的汇编指令mov ax,&/p&&br&&p&特别要注意的:&/p&&p&1. 66h前缀如果要实现的功能是扩展default operand size,&b&只存在一种情形&/b&就是16-&32的扩展。&/p&&p&2. 66h前缀&b&不能&/b&把default operand size扩展成64位的。&/p&&p&3. 66h前缀在32位或者更宽的default operand size里,只能压缩default operand size到16位,&b&不存在64-&32的压缩方式&/b&。&/p&&p&4. &b&64位模式下&/b&有很多指令的default operand size&b&仍然是&/b&32位的。&/p&&p&---------------------------补充一下具体的编码规则(64位下)----------------------&/p&&p&MOV register1 to register2的编码格式:w : 11 reg1 reg2&/p&&p&OP Code是w&/p&&p&w = 0表示使用8 bit,w = 1表示使用default size&/p&&p&ModRM域是11 reg1 reg2&/p&&p&ModRM.mod = 11 表示两个都是寄存器
ModRM.reg = reg1 (源寄存器ID)
ModRM.r/m = reg2 (目的寄存器ID)&/p&&br&&p&AL/AX/EAX/RAX 寄存器ID是000
BL/BX/EBX/RBX 寄存器ID是011
R8B/R8W/R8D/R8 寄存器ID是000
R9B/R9W/R9D/R9 寄存器ID是001&/p&&p&REX格式:0100WRXB&/p&&p&W---影响operands size
-R--影响ModRM.reg
--XB影响SIB的编码(类似MOV RAX,[RBX + RDX* 8]),控制寄存器寻址里面的两个寄存器的索引,B也影响ModRM.r/m&/p&&br&&p&以下指令在64位模式下编码:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&ModRM.Reg = 011 (BL/BX/EBX/RBX)
ModRM.r/m = 000 (AL/AX/EAX/RAX)
MOV AL, BL
88 D8 w=0,表示用8位寄存器
MOV AX, BX
66 89 D8 w=1,表示用默认寄存器,66前缀表示使用16位寄存器
MOV EAX, EBX
89 D8 w=1,表示用默认(32位)寄存器
MOV RAX, RBX
48 89 D8 REX=0100W---,W位表示使用64位操作数,w=1,表示用默认(64位)寄存器
ModRM.Reg = 000 (R8B/R8W/R8D/R8)
ModRM.r/m = 011 (BL/BX/EBX/RBX)
MOV BL, R8B
44 88 C3 w=0,表示用8位寄存器,REX=0100-R--,R位表示ModRM.reg使用扩展寄存器表(R8)
MOV BX, R8W
66 44 89 C3 w=1,表示用默认寄存器,66前缀表示使用16位寄存器,REX=0100-R--,R位表示ModRM.reg使用扩展寄存器表(R8)
MOV EBX, R8D
44 89 C3 w=1,表示用默认(32位)寄存器,REX=0100-R--,R位表示ModRM.reg使用扩展寄存器表(R8)
MOV RBX, R8
4C 89 C3 REX=0100WR--,W位表示使用64位操作数,R位表示ModRM.reg使用扩展寄存器表(R8),w=1,表示用默认(64位)寄存器
ModRM.Reg = 011 (R9B/R9W/R9D/R9)
ModRM.r/m = 000 (R8B/R8W/R8D/R8)
MOV R8B, R9B
45 88 C1 w=0,表示用8位寄存器,REX=0100-R-B,R位表示ModRM.reg使用扩展寄存器表(R9),B位表示ModRM.r/m使用扩展寄存器表(R9)
MOV R8W, R9W
66 45 89 C1 w=1,表示用默认寄存器,66前缀表示使用16位寄存器,REX=0100-R-B,R位表示ModRM.reg使用扩展寄存器表(R9),B位表示ModRM.r/m使用扩展寄存器表(R9)
MOV R8D, R9D
45 89 C1 w=1,表示用默认(32位)寄存器,REX=0100-R-B,R位表示ModRM.reg使用扩展寄存器表(R9),B位表示ModRM.r/m使用扩展寄存器表(R9)
MOV R8, R9
4D 89 C1 REX=0100WR-B,W位表示使用64位操作数,,R位表示ModRM.reg使用扩展寄存器表(R9),B位表示ModRM.r/m使用扩展寄存器表(R9),w=1,表示用默认(64位)寄存器
&/code&&/pre&&/div&&br&&p&总结,对于MOV指令:&/p&&p&如果是64位操作,需要保证REX里的W位是1;
如果源寄存器使用扩展寄存器,需要保证REX里R位是1;
如果目标寄存器使用了寄存器扩展,需要保证REX里的B位是1;
MOV指令里的w位用来控制是8位还是其它位数;
66前缀用于控制是不是16位;
如果同时存在66前缀和REX前缀,66前缀无效。&/p&
66h前缀,用于改变default operand size,如果原来是16位的,则变成32位的,如果是原来是32位或者64位的,则变成16位。所以,理解的关键就是要判断当前代码的执行模式。 简单的例子:默认操作数大小是16位的情况下(实模式、V8086模式),加66h则变成32位,…
&img src=&/50/v2-0cd6bd7d4e_b.jpg& data-rawwidth=&1000& data-rawheight=&750& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/50/v2-0cd6bd7d4e_r.jpg&&&blockquote&中断系统是现代PC的基础架构之一,我们常常能听到很多相关概念:IRQ,PIRQ,PCI Interrupt PIN,MSI,GSI,Vector(中断向量)。这些术语有些是硬件概念,有些是软件概念,他们时常混在一起,让人十分迷惑。本系列希望能通过三篇文章来帮助大家厘清其中的关联和区别,它们分别是历史和原理篇(偏硬件)、软件篇(关于OS和BIOS如何设置和使用中断)和固件篇(BIOS如何根据硬件配置中断和向OS报告中断表)。&/blockquote&&h2&&strong&历史&/strong&&/h2&&p&当我们在操作电脑时,很多事情在同时发生,磁盘在飞速读写,网络在收发消息,而你也往往开了不少个任务在同时运行。这些能够发生,中断系统扮演了关键角色。在中断系统出现之前,人们(那时都是计算机专家)往往要等上一个任务结束才能进行下一个任务,这在今天是不能想象的。事实上中断系统出现的很早,Intel的传奇中断控制芯片年就被用在8085系列产品中。PC在1981年出生时借鉴了这种思想,8259的升级版8259A被用于中断控制,而其统治PC长达近10年,直到486电脑的诞生!&/p&&b&1。PIC时代&/b&&p&PIC(Programmable Interrupt Controller)就是我们的8259A,让我们来瞻仰一下它的样子:&img src=&/v2-aba8e7d7ab904f77a3c8ad_b.jpg& data-rawwidth=&474& data-rawheight=&289& class=&origin_image zh-lightbox-thumb& width=&474& data-original=&/v2-aba8e7d7ab904f77a3c8ad_r.jpg&&&/p&&p&其中最重要的管脚是IR0~IR7,也就是能相应8个中断。后期由于中断不足,被扩展为级联的形式,如图:&img src=&/v2-dbcd2e263f1023ccdd4bd28_b.jpg& data-rawwidth=&484& data-rawheight=&301& class=&origin_image zh-lightbox-thumb& width=&484& data-original=&/v2-dbcd2e263f1023ccdd4bd28_r.jpg&&&/p&&p&分为主和从两块8259,这样我们就有了16 -1 = 15个中断源。8259一直工作的很好,中断如果还不够我们还可以通过中断共享或者再多级联几个8259,就可解决问题,直到多CPU的出现。这时候问题出现了,我们的主8259到底连接哪个CPU好呢?这是个大问题。&/p&&p&&b&2。APIC来了&/b&&/p&&p&80486DX在1990年上市,其引入了SMP的概念,即多CPU(注意不是多核)。Intel为了适应SMP提出APIC(Advanced Programmable Interrupt Controller,高级中断控制器)的新技术。APIC 由两部分组成,一个称为LAPIC(Local APIC,本地高级中断控制器),一个称为IOAPIC(I/O APIC,I/O 高级中断控制器)。前者位于CPU中,在SMP 平台,每个CPU 都有一个自己的LAPIC(后期多核后,每个逻辑核都有个LAPIC)。后者通常位于外部设备芯片上,例如南桥上。像PIC 一样,连接各个产生中断的设备。而IOAPIC和LAPIC通过APIC Bus连接在一起。如图:&img src=&/v2-ced593f1a5a8b08dafbcb_b.png& data-rawwidth=&514& data-rawheight=&219& class=&origin_image zh-lightbox-thumb& width=&514& data-original=&/v2-ced593f1a5a8b08dafbcb_r.png&&&/p&&p&&b&3。XAPIC,小小的改进&/b&&/p&&p&单独的3根线的APIC bus给系统设计带来了不少困扰,在奔腾4上其被取消而由系统总线代替,其他则区别不大,新的示意图如下:&img src=&/v2-f11ebc71f901_b.png& data-rawwidth=&503& data-rawheight=&302& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&/v2-f11ebc71f901_r.png&&&/p&系统中的IOAPIC可以有很多,在北桥被并入CPU中后,甚至CPU中也有IOAPIC(同时有LAPIC,感觉好方便)。这种架构极具伸缩性,被使用了很多年,直到核战争的爆发。&br&&p&&b&4。X2APIC&/b&&/p&&p&核战争,什么鬼?!其实是内核数目的战争。Intel和AMD不断的增加内核的数目,加上SMT(HT)技术,内核数目不断上升。在服务器上,至强CPU往往提供高达40到60个内核,如果是8路服务器,内核总数目可以高达60 × 8 = 480个!即使实际没有这么多内核,虚拟机技术的出现也往往成倍的需要虚拟内核。而唯一标识CPU内核身份的APIC ID在APIC寄存器中却只有8位(其细分为多个域,这里略过),也就是最多可以有255个内核(1个保留做广播用)。APIC不够用了!Intel大手一挥,推出了X2APIC,把APIC ID从8位扩展为32个bit,这下可以支持4G -1 (1个保留做广播用)个逻辑核,你们该满足了吧!顺便将原来略显怪异的MMIO访问方式变成MSR方式(后文详细介绍)。&/p&&p&我们现在的计算机几乎都是用APIC方式处理中断的,我们接下来看看他们是怎么工作的。&/p&&h2&&strong&原理&/strong&&/h2&&p&CPU在运行目前任务时,当有特别事件发生时,CPU应当暂停正在执行的程序,转向执行处理该事件的子程序;事件处理完毕后,恢复原来的状态,再继续执行原来的程序。这种对这些事件的处理模式,称为程序中断(Interrupt)控制模式,简称中断控制或中断。这种处理紧急事件的服务子程序称为中断子程序。这种引起中断的事件称为中断源。这些事件包括磁盘、键盘等等输入输出设备,异常错误的发生甚至另一个CPU的调用。&/p&&b&1。PIC模式&/b&&p&在PIC时代,外部中断源都要连接到8259的IRQ引脚上,8259会通过INTR告诉CPU发生了中断。这时OS或者BIOS的中断控制程序会检查谁发生了中断,从而调用相应的中断相应历程。 其中的细节我们这里就不细述了,其过程大概分为以下几步:&/p&&p&&strong&1&/strong&、一个或多个IR 引脚被触发中断(脉冲或者边缘),若对应的中断没有被屏蔽,8259 拉高INTR 管脚通知CPU 或上一级8259中断发生。&/p&&p&&strong&2、&/strong&CPU 通过INTA 引脚响应8259,表示中断请求收到。8259则将IRR 中具有最高优先级位 清零,并设置ISR 中对应的位。在CPU发出中断查询脉冲后,8259将中断号提交到数据线上。&/p&&p&&strong&3&/strong&、中断号对应的中断向量处理程序被调用,OS或者BIOS中断处理程序开始处理中断,完毕后写EOI并扫尾。&/p&&p&在这样一个周期完毕后,CPU继续处理之前的任务,像什么事也没有发生一样,一般用户甚至感受不到(实际上OS的中断处理例程有严格的时间要求,处理过长会触发watch dog 导致蓝屏)。&/p&&p&古老的PC留下了很多兼容性的问题,很多古老的设备占据了大量中断源,如图:&img src=&/v2-c3a4bca202b8f6_b.jpg& data-rawwidth=&640& data-rawheight=&436& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-c3a4bca202b8f6_r.jpg&&&/p&&p&现在谁还有这么多串口并口呢,还有键盘和FDD?可是为了向前兼容,这些IRQ都被保留而不能做它用,甚至在APIC模式也是这样。向前兼容真是个沉重的包袱!&/p&&p&注意这里中断是有优先级的,IRQ数字越小优先级就越高。&/p&&p&&b&2。APIC模式&/b&&/p&&p&如前所述,APIC 由两部分组成,一个称为LAPIC(Local APIC,本地高级中断控制器),一个称为IOAPIC(I/O APCI,I/O 高级中断控制器)。前者位于CPU中,在SMP 平台,每个内核都有一个自己的LAPIC。后者通常位于外部设备芯片上,例如南桥上。典型的连接关系如下图:&img src=&/v2-f11ebc71f901_b.png& data-rawwidth=&503& data-rawheight=&302& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&/v2-f11ebc71f901_r.png&&&/p&&p&每个LAPIC都有自己唯一的APIC ID,每个IOAPIC也有自己唯一的ID。和PIC模式显著的区别是连接关系不再是硬件连线而是通过message。IOAPIC内部有个PRT(Programmable Redirection Table)表,里面的Destination Field标识了中断的目的地。在Physical模式下,含有目标APIC ID(Logical模式略)。在中断发生时,IOAPIC收到中断,会将中断转化为message放入系统总线,而CPU中只有APIC ID和Destination Field域中一致的LAPIC才会处理这条中断。用于处理来自IOAPIC 的中断消息的LAPIC内容就更多了,但最重要的寄存器还是IRR、ISR 以及EOI。其流程和PIC类似,这里就不在详述了。OS如何处理我们会在下一篇中介绍。&/p&&p&值得一提的是,为了保证向前兼容性,Intel在1997年发布的MultiProcessor Specification(MP spec)中要求APIC提供PIC兼容模式或Virtual Wire Mode(虚拟连线模式)。PIC模式如下图:&img src=&/v2-5eaa46ca1a0bedcf72af6f_b.jpg& data-rawwidth=&640& data-rawheight=&527& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-5eaa46ca1a0bedcf72af6f_r.jpg&&&/p&虚线代表了中断传递的过程,注意其中的IOAPIC被旁路了,而一个8259A的模拟硬件(通常是南桥芯片内置)则起到作用,它连接了CPU的INTR引脚。这样会对主板电路设计造成很多麻烦,而虚拟连线模式则更加常见,其如下图:&img src=&/v2-40cc62ca84fb82e11eab86b_b.jpg& data-rawwidth=&640& data-rawheight=&478& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-40cc62ca84fb82e11eab86b_r.jpg&&&p&IOAPIC会将8259A模拟硬件的信号放入ICC Bus(后是系统总线),由LAPIC处理交给BSP,处理效果和原来一样而不要增加连线。&/p&&p&&b&3。MSI&/b&&/p&&p&普通的PCI设备支持四个INTx,MSI(Message Signaled Interrupts)在1999年随着PCI 2.2规范被引入,在PCI 3.0中提出了MSI-X。MSI支持32个中断,而MSI-X将其扩展到了2048个。当一个PCI设备想发送中断时,它会向其PCI配置空间Capability结构中的Message Address的地址(通常是0xFEExxxxx)写Message Data数据,消息会被该设备连接的root complex转给LAPIC(多CPU时,有可能要通过QPI),而不需要通过IOAPIC中转。Message Address中和IOAPIC类似,也有目标APIC ID,而message Data中同样有Vector的数目。这样从电气机械的角度,MSI减少了对interrupt pin个数的需求。从而使得连接变得更简单,而且据研究,其相比INTx,有时能提高1/3的效能。&/p&&p&微软在Vista后全面支持MSI和MSI-x,而Linux也早已经支持MSI。&/p&&h2&&strong&其他&/strong&&/h2&&p&还有些杂项这里要特别说明一下&/p&&b&1。APIC ID&/b&&p&APIC ID并一定从0开始,数字也不一定连续,在任何地方的代码里都不能有这种假设。APIC ID可以被BIOS重置,但几乎没有BIOS这样做。&/p&&p&&b&2。IOAPIC ID&/b&&/p&&p&随着北桥被移入了CPU ,一些北桥的除了内存控制器外其他的功能也被引入CPU。其中最重要的是PCIe的root complex和一个至少x16的root port用于连接显卡。如果CPU内置的显卡,也会连接到这个root port上,所以Intel平台除了在南桥外,在CPU内也有IOAPIC。在一个4路的志强服务器中就会有4 + 1 = 5个IOAPIC, 每个IOAPIC有24个入口,就可以支持24 * 5 = 120个中断入口。&/p&&p&&b&3。LAPIC&/b&&/p&&p&除了IOAPIC能发送中断消息外,内核的LAPIC也可以通过发送IPI(Inter-Processor Interrupts)的方式发送中断给其他的内核。这种方式是OS和BIOS调度CPU内核的基本方式。&/p&&h2&&strong&尾声&/strong&&/h2&&p&在下一篇中将介绍IRQ,PIRQ,PCI Interrupt PIN,MSI,GSI,Vector(中断向量)的关系和谁负责设置它们,敬请期待。这里有几个思考问题,大家可以查查资料:&/p&&p&1.
那么对于多CPU的情况下,初始的APIC ID是谁来决定的呢?注意CPU可以互换。&/p&&p&2.
IOAPIC都要有不同的ID,这些ID是谁给设置上去的呢?&/p&&p&中断体系其他文章:&/p&&a href=&/p/& class=&internal&&计算机中断体系二:中断处理 - 知乎专栏&/a&&br&&a href=&/p/& class=&internal&&计算机中断体系三:中断路由 - 知乎专栏&/a&&br&&p&欢迎大家关注微信公众号&UEFIBlog&加入讨论,同时欢迎大家给本专栏和公众号投稿!&/p&
中断系统是现代PC的基础架构之一,我们常常能听到很多相关概念:IRQ,PIRQ,PCI Interrupt PIN,MSI,GSI,Vector(中断向量)。这些术语有些是硬件概念,有些是软件概念,他们时常混在一起,让人十分迷惑。本系列希望能通过三篇文章来帮助大家厘清其中的关…
&img src=&/50/v2-39ed4ef9efce972b8e07760_b.jpg& data-rawwidth=&605& data-rawheight=&478& class=&origin_image zh-lightbox-thumb& width=&605& data-original=&/50/v2-39ed4ef9efce972b8e07760_r.jpg&&&blockquote&本篇文章承接上文继续介绍DDR内存的硬件原理,包括如何寻址,时序和时延以及可以为提高内存的效能可以有哪些方法。&/blockquote&&p&上次虽然解决了小张的问题,却引发了他对内存原理的兴趣。这不他又来找我了,说我还欠他一个解释。这次我们约在一个咖啡馆见面,这次内容有点深入,我带了些图片,小张也点了一大杯美式,计划大干一场。看着他认真的样子,我也决定毁人不倦,把他也带入IT工程师的不归路。。。&br&&/p&&h2&&strong&寻址(addressing)&/strong&&/h2&&p&为了了解前几天说的几个延迟参数,不得不介绍下DIMM的寻址方式。也许你发现了上次介绍Rank和chip的关系时,有个Bank/Column/row我们没有讲到,它们和如何寻址密切相关。还记得上次的图片吗?&img src=&/v2-de27ca3dddf_b.jpg& data-rawwidth=&640& data-rawheight=&353& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-de27ca3dddf_r.jpg&&&/p&&p&这次我们来看看rank和Chip里面有什么,如下图:&img src=&/v2-2c7408fadd05a0951eac529c_b.jpg& data-rawwidth=&550& data-rawheight=&758& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&/v2-2c7408fadd05a0951eac529c_r.jpg&&&/p&&p&这是个DDR3一个Rank的示意图。我们把左边128MB Chip拆开来看,它是由8个Bank组成,每个Bank核心是个一个存储矩阵,就像一个大方格子阵。这个格子阵有很多列(Column)和很多行(Row),这样我们想存取某个格子,只需要告知是哪一行哪一列就行了,这也是为什么内存可以随机存取而硬盘等则是按块存取的原因。&/p&&p&说到这里,小张来了兴致:“我知道,我知道,大学学过,计算机组成原理里面讲过,这是存储单元的行地址线和列地址线,中间那个格子里面是一个Bit!”。小张掌握的知识还不少呢! 但是这里只是有些类似,可以这么想象,但不尽然,CAS#和RAS#只有一根信号线。实际上每个格子的存储宽度是内存颗粒(Chip)的位宽,在这里由8个Chip组成一个Rank,而CPU寻址宽度是64bit,所以64/8=8bit,即每个格子是1个字节。选择每个格子也不是简单的两组信号,是由一系列信号组成,以这个2GB DDR3为例:&/p&&p&1.
&strong& 片选&/strong&(Chip Select)信号,S0#和S1#,每个用于选择是哪个Rank。&/p&&p&2.
&strong&Bank地址线&/strong&,BA0-BA2, 2^3=8,可以选择8个Bank&/p&&p&3.
&strong&列选&/strong& (Column Address Select), CAS#,用于指示现在要选通列地址。&/p&&p&4.
&strong&行选&/strong&(Row Address Select),RAS#用于指示现在要选通行地址。&/p&&p&5.
&strong&地址线&/strong&,A0-A13,用于行和列的地址选择(可并不都用于地址,本处忽略)。&/p&&p&6.
&strong&数据线&/strong&,DQ0-DQ63,用于提供全64bit的数据。&/p&&p&7.
&strong&命令&/strong&,COMMAND,用于传输命令,如读或者写等等。&/p&&p&&strong&注意&/strong&这里没有内存颗粒的选择信号线,只有Rank的选择信号。在Rank选择好后,8个内存颗粒一起被选中,共提供64bit的数据。&/p&&p&读取和写入数据也稍微复杂点,简单来说分为以下三步:&/p&&p&1.
&strong&行有效&/strong&。RAS#低电平,CAS#高电平。意味着现在行地址有效,同时在A0-A13传送地址信号,即2^13个Row可以选择。&/p&&p&2.
&strong& 列有效&/strong&。RAS#高电平,CAS#低电平。意味着列地址有效,这时在A0-A13上传送的是列地址。没错,A0-A13是行列共用的,所以每个格子选择需要有1和2两步才能唯一确定。&/p&&p&3.
&strong&数据读出或写入&/strong&。根据COMMAND进行读取或者写入。在选定好小方格后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据I/O通道(DQ)输出到内存总线上了。&/p&&p&这里只介绍随机访问, Burst模式这里略过。下图是个简单的图示:&img src=&/v2-4a05542dcab766e7c88785_b.jpg& data-rawwidth=&550& data-rawheight=&617& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&/v2-4a05542dcab766e7c88785_r.jpg&&&/p&&h2&&strong&时序(Timing)&/strong&&/h2&&p&一气说了这么多,我不禁口干舌燥,停下来喝了一大口咖啡。小张以为我说完了,着急的问我:“我好像听懂了,不过那好几个数字还没讲呢。”。别着急啊,且听我慢慢道来。正因为访问一个数据需要大致三步,为了保证信号的完整性,步骤直接要有区隔,一起发出来会造成错乱,间隔太近也会为采样带来难度,容易引入噪音。所以时序非常重要,&/p&&p&下面是个背对背(back-to-back)读写的时序图:&img src=&/v2-cfe1ebc6af07f966d3f670d48db7c466_b.jpg& data-rawwidth=&640& data-rawheight=&153& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/v2-cfe1ebc6af07f966d3f670d48db7c466_r.jpg&&&/p&&h2&&strong&时延(Latency)&/strong&&/h2&&p&小张一看到这个图,不禁大叫:”太复杂了,看得我都犯密集恐惧症了,看不懂!“。没关系,我们拆开了一个个看。&/p&&p&&strong&1.
CL:&/strong& CAS Latency。CL是指CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS时延)。由于CL只在读取时出现,所以CL又被称为读取时延(RL,Read Latency)。也就是我们上面第3步读取时需要的时间。CL是延迟里面最重要的参数,有时会单独在内存标签上标出如CLx。它告诉我们多少个时钟周期后我们才能拿到数据,CL7的内存会延迟7个周期才能给我们数据,CL9的则要等9个。所以越小我们越能更快的拿到数据。注意这里的周期是真正的周期而不是标注的DDR3 1333MHz的周期,因为一个周期传输两次,真正的周期只是1/2,这里是666MHz。如下图,是CL7和CL9的例子:&img src=&/v2-c7c86fd2d8c847c41058a24_b.jpg& data-rawwidth=&800& data-rawheight=&465& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-c7c86fd2d8c847c41058a24_r.jpg&&&/p&如果相同频率的内存,CL7可以比CL9有22%的效能提高。&br&&p&&strong&2.
tRCD&/strong&:RAS到CAS时延。在发送列读写命令时必须要与行有效命令有一个间隔,这是根据芯片存储阵列电子元件响应时间所制定的延迟。即步骤1和2要间隔的时间。这个间隔当然也是越快越好了,下面是个tRCD=3的例子:&img src=&/v2-2d2b1f8a8e56db8ab13e_b.jpg& data-rawwidth=&738& data-rawheight=&550& class=&origin_image zh-lightbox-thumb& width=&738& data-original=&/v2-2d2b1f8a8e56db8ab13e_r.jpg&&&/p&你也可以看出这个时间也是激活命令和读命令的间隔。&p&&strong&3.
tRP&/strong&:
预充电有效周期(Precharge command Period)。在上一次传输完成后到下一次行激活前有个预充电过程,要经过一段充电时间才能允许发送RAS。也就是步骤1的准备工作要做多久。下面是个例子:&img src=&/v2-d8dbcbaed9a7f1034dd1b_b.jpg& data-rawwidth=&740& data-rawheight=&284& class=&origin_image zh-lightbox-thumb& width=&740& data-original=&/v2-d8dbcbaed9a7f1034dd1b_r.jpg&&&/p&还有两个类似的时延tRAS和CMD,我看到小张都快睡着了就不讲了。总之,所有这些时延共同构成了整体时延,而时延是越小越好。&br&&h2&&strong&SPD&/strong&&/h2&&p&说了这么多,小张总算搞懂内存标签条上的4-4-4-8, 5-5-5-15, 所代表的 CL-tRCD-tRP-tRAS-CMD都是啥意思了。不过小张有点搞不懂,这些数据印在纸上消费者是看懂了(实际上似乎没多少人了解),可电脑又没长眼睛,它是怎么知道的呢?其实,每个DIMM在板子上都有块小的存储芯片(EEPROM),上面详细记录了包括这些的很多参数,还有生产厂家的代码等等,这也是BIOS为什么能知道我们插了哪种内存的原因。在小张的内存条上,我指给了他看:&img src=&/v2-742fc66b14a8e741eaa19cfe305aa9b9_b.jpg& data-rawwidth=&425& data-rawheight=&319& class=&origin_image zh-lightbox-thumb& width=&425& data-original=&/v2-742fc66b14a8e741eaa19cfe305aa9b9_r.jpg&&&/p&实际上随着DDR的一步步进化,这些延迟的时钟周期个数也在步步提高,但由于频率的加快,实际上是在时间是在慢慢的减少的。&p&&strong&效能提高的其他手段&/strong&&/p&&p&看时间还早,我和小张聊起了除了提高频率,还有什么办法能够提高内存存取速度。&/p&&b&1。多通道(Channel)&/b&&p&现代内存控制器都从北桥移入CPU内部,而且内存控制器都可以同时操作多个通道。典型的台式机和笔记本CPU很早就支持双通道,现在还加入了三通道。如果数据分布在插在不同的通道上的内存条上,内存控制器可以不管上面这些延迟啊时序啊,同时可以读取他们,速度可以翻倍甚至三倍!小张听了跳了起来:”我也要翻倍!”。别急,要启用多通道,首先要插对插槽。现在主板制造商为了让小白用户插对内存条,通常用颜色标识内存通道。注意同一个通道颜色不同!所以要把内存插在颜色相同的内存插槽里,才能让内存占据不同的通道。最好有主板手册检查一下,插好后进入BIOS里面看看现在内存状态是不是多通道模式。&/p&&p&&b&2。Interleave&/b&&/p&&p&看着小张跃跃欲试的样子,我不禁给他泼了盆冷水。幻想美妙,现实残酷。多通道在很多时候用处并不明显!因为程序的局部性,一个程序并不会把数据放到各个地方,从而落入另一个DIMM里,往往程序和数据都在一个DIMM里,加上CPU的Cache本身就会把数据帮你预取出来,这个提高就个不明显了。除非你运行很多巨型任务才行。&/p&&p&“啊,我都是开一个游戏打,对我来说没啥用处啊,简直是鸡肋!”,小张说。也不尽然,还有种办法,就是让同一块内存分布到不同的通道中去,这种技术叫做Interleaving。这样无论Cache命中与否都可以同时存取,多通道的技术才能发挥更大的用处。“太好了,要怎么才能开启这个interleave呢?”,我不禁呵呵了,这个功能一般只有服务器CPU才有,你的i5要是有了,谁去买几千上万的服务器CPU呢?&/p&&p&&b&3。Overclock&/b&&/p&&p&“你这不是废话吗,我要怎么样才能搭建个发烧机才配有的高速内存呢?”。其实小张可以购买发烧级的内存条。这些内存条DDR3标注达到2133以上!但是要注意,如果我们把这些内存插入一般主板,很有可能会运行在1333或者1600上面,因为这是DDR3规定的最高频率。好马配好鞍,要有个能支持超频内存的主板,在主板BIOS里面升压升频才能真正用好这些发烧内存条。&/p&&h2&&strong&尾声&/strong&&/h2&&p&时间差不多了,我向小张保证下次还会介绍神秘的BIOS如何初始化内存,正要离去。小张拉住了我,说:“你上次挖的坑还没填呢!”“什么坑?”也许是我挖坑太多,记不住了。“就是上次你让我回去想的三个问题。第一个我知道了,DIMM有防呆口,几代DDR防呆口位置不同,插不进去,我在网上google过了,后面两个实在想不出来”。好吧,那我们长话短说,实际上两个问题可以一起回答,今天我们知道DDR每代的各种时延参数是上升的,所以如果两代一样的频率,实际上性能有可能还会下降!譬如DDR2 800在很多时候比DDR3 800的时延要小。我们可以认为每代的起点比前一代的低,有一段重合期,在频率上去后会弥补时延的时钟个数差异,比较时延是clock个数,而不是时间,clock快了,有可能时延会更小。而这段重合期,也为不同的商业策略留下了空间。&/p&&p&小张还是抓住我,他不知道从哪里查了些名词,什么预取个数每代增加,而内核频率不同于外部频率等等。我希望他能自己找找资料看看,也顺便挖了个新坑:&/p&&p&1.
为什么每代DDR要升级,不直接把频率向上提高就行了,为什么没有DDR2 3200的内存?&/p&&p&2.
DDR的内存还是并行的数据,串行似乎可以更高速,比格更高,为什么不弄个串行访问的内存呢?&/p&&p&小张陷入了沉思,我也暗喜又骗到一顿咖啡下午茶。不过回去还要准备些材料才能继续混吃混喝,下次介绍完内存的BIOS部分,还有啥题目可以继续吸引小张呢?&/p&&p&欢迎大家关注微信公众号&UEFIBlog&加入讨论,同时欢迎大家给本专栏和公众号投稿!&/p&&p&内存系列其他文章:&/p&&a href=&/p/& class=&internal&&内存系列一:快速读懂内存条标签 - 知乎专栏&/a&&br&&a href=&/p/& class=&internal&&内存系列三:内存初始化浅析 - 知乎专栏&/a&
本篇文章承接上文继续介绍DDR内存的硬件原理,包括如何寻址,时序和时延以及可以为提高内存的效能可以有哪些方法。上次虽然解决了小张的问题,却引发了他对内存原理的兴趣。这不他又来找我了,说我还欠他一个解释。这次我们约在一个咖啡馆见面,这次内容有…
&p&移动GPU和桌面GPU最核心的差别在于渲染流程不同。目前主流的移动GPU,无论ARM、高通还是Imagination,其GPU都是TBR(Tile Based Rendering)。而桌面GPU,无论NVIDIA、AMD还是Intel,都是Immediate Rendering. 下面我就来说说什么叫TBR,什么叫Immediate Rendering。&/p&&p&说在前面:&/p&&p&从opengl定义的GPU pipeline来看,一帧3D场景是通过以下几个过程渲染出来的。&/p&&p&“Vertex前端”(负责准备数据和Vertex Shader指令)-&&Vertex Shader&(计算定点位置,颜色,纹理坐标,光照,等相关工作)-&&Primitive Assembly&(负责组装图元,比如三角形; 坐标系变换,物体坐标-&世界坐标-&透视变换-&屏幕坐标;视锥剪裁;Culling正反面选择)-& “Rasterizing”(光栅化,就是将立体场景投影到二维屏幕的过程)-&&Early Z/S&(前期depth和stencil测试,决定一个fragment是否被渲染,从而降低后期fragment shader的负担)-&&Fragment Shader&(对一个fragment,即像素,进行渲染。可能涉及到读取纹理texture。)-&&Post Z/S&(后期depth和stencil测试,有些应用在fragment shader中可能会改变该像素的深度值)-&&Blending&(将此次渲染结果和之前的渲染结果进行混合)。&/p&&p&1. Immediate Rendering&/p&&p&Ok,说到这所谓的Immediate Rendering,就是将一个图元(最常见的是三角形),从头到尾走完整个Pipeline,中间没有停止。这种结构,控制简单,容易实现。问题是在做blending的时候需要从存储单元中不断读回之前render的结果,可想而知在绘制一个大的场景时这个带宽消耗是比较大的。&/p&&p&那为什么桌面GPU会采用这个架构。首先,历史原因,最开始设计opengl pipeline的人,正是这些设计桌面GPU的大咖们。不过,最重要的一点是,桌面GPU都是有自身显存的,它不需要通过系统总线从系统的DDR memory中读回数据。所以开销比较小,是完全可以接受的。但移动端的处理器(基本是可以认为都是ARM处理器)都是统一寻址的。所有的IP都是使用统一的DDR存储空间,这样读回Pixel进行blending就变成了一件非常奢侈的事情。它会严重占用系统带宽,不但功耗提升,而且会影响整个SOC的处理能力(可以想象北京上海的堵车场景)。为了解决这个问题TBR便应运而生了,下面该TBR出场了。&/p&&p&2. TBR&/p&&p&TBR是Tile Based Rendering的缩写。首先来认识一个概念Tile。什么是Tile,你可以把它看成一小块屏幕区域。比如一个屏幕的分辨率为256x256,假定一个tile的大小是16x16,那么这个屏幕可以看成是由16x16个Tile组成。TBR的精髓就是一个Tile一个Tile的渲染。这样只需要给GPU配上一块很小的片上cache(足够装下一两个Tile的内容就行),就能实现高效的blending。那么,问题来了,根据前面讲述的GPU pipeline来看,只有在光栅化的时候才能知道每一个tile中包含的fragment,如何才能做到一个tile画完再画另一个tile呢。这里就需要一种机制将整个场景的图元信息(最主要的是位置)都保存下来,并且能在做光栅化时快速的检索出属于这个Tile的图元。所以所有的移动GPU中都会有Tiler这个模块,这在桌面GPU中是没有的。每个厂家的Tiler实现都是机密,这里不予讨论。我们只要知道Tiler能接收vertex shader的运算结果,并在光栅化之前,选出属于特定tiler的图元就行了。有了Tiler,这个GPU Pipeline就被分为了两部分,一个场景中所有的vertex计算都在光栅化之前完成,最后再一次性raster一个Tile。这样做还有一个好处就是,可以更有效的在early z中剔除被遮挡的像素,降低了fragment shader的负载。&/p&
移动GPU和桌面GPU最核心的差别在于渲染流程不同。目前主流的移动GPU,无论ARM、高通还是Imagination,其GPU都是TBR(Tile Based Rendering)。而桌面GPU,无论NVIDIA、AMD还是Intel,都是Immediate Rendering. 下面我就来说说什么叫TBR,什么叫Immediate Re…
&blockquote&按照我的理解,OS只要能够支持IA-64就可以了,其他64位软件就都可以使用了&br&&/blockquote&&br&这个理解是错误的。&br&&br&因为&b&64位OS里有大量的32位软件运行&/b&。&br&&br&以WIN7为例,WIN7里有大量的32位软件在运行,比如QQ,比如老版的Office,比如各种老游戏(红警、魔兽)等等。&br&&br&所以&b&x86-64的最大优势是能在64位环境里直接运行32位程序&/b&——也就是兼容性好。&br&&br&但是IA-64做不到这一点,如果一个32位软件非要在IA-64环境里运行,唯一的选择就是重新编译。&br&&br&比如,如果用户要装一个QQ,就要精心挑选匹配IA-64的版本,如果不小心下载了一个32位的,那么这个软件根本无法运行,这样的用户体验是很糟糕的。&br&&br&现在装应用软件会仔细区分32位或者64位吗?一般不会,这就是x86-64的优势。&br&&br&并且,有些软件公司已经倒闭了,根本不会给用户提供IA-64的版本,这样的软件用户根本没办法在IA-64上用,所以就算有人搞出IA-64的操作系统,这种操作系统对于普通用户来说使用起来太难了。&br&&br&后来Intel为了改进这一点,搞出一个x86-to-IA-64的解码器,但效率极低,这样的效率用户也是无法接受的。&br&&br&所以最终微软选择了x86-64,因为它能保证大部分应用软件的兼容性。&br&&br&最后补充点历史资料,这种不兼容的事情在当年从16位扩展到32位的时候就发生过一次。&br&&br&早年的时候,8086 CPU是一款纯16位CPU,当时的计算机从操作系统到硬件都是16位的,后来Intel搞出个80286,里面开始支持32位,但是80286架构有一个很大的问题,一旦切换到32位环境里,就无法再运行16位程序了(或者说运行起来很麻烦),这样的兼容性是用户无法接受的。直到后来Intel推出80386,在80386架构里加入了虚拟8086模式,才算比较彻底的解决了兼容性的问题——历史总是在不停的重演。&br&&br&如果有人记得OS/2这个操作系统的话就会知道,OS/2是最早在80286上运行的32位系统,但是它出现的时代太倒霉了,80286不兼容8086,也就是不兼容DOS程序,这样的后果也影响了后来OS/2的发展。而Windows3.X开始大量发售的时候,已经赶上了80386的好时代,再也没有兼容性的问题了。&br&&br&所以兼容性是一个很重要的东西。
按照我的理解,OS只要能够支持IA-64就可以了,其他64位软件就都可以使用了 这个理解是错误的。 因为64位OS里有大量的32位软件运行。 以WIN7为例,WIN7里有大量的32位软件在运行,比如QQ,比如老版的Office,比如各种老游戏(红警、魔兽)等等。 所以x86-64…
&a data-hash=&9dd9dacb3fe& href=&///people/9dd9dacb3fe& class=&member_mention& data-editable=&true& data-title=&@泰罗Taro& data-tip=&p$b$9dd9dacb3fe& data-hovercard=&p$b$9dd9dacb3fe&&@泰罗Taro&/a& 的答案已经说了个大概了,我再来结合当年几篇经典的原版论文详细地补充一下。&br&&br&首先先说明分支预测的大类,&b&静态预测(static prediction)&/b&和&b&动态预测(dynamic prediction)&/b&。&br&&br&所谓静态预,就是无论执行的是什么指令,分支预测器总是执行相同的prediction strategy。动态预测则会根据执行指令的不同,依据program counter(PC)的值以及历史信息等做出不同的预测。显然后者由于利用了更多的信息,所以在一般情况下会更加精确,但也并不是说前者就完全没用了,毕竟实现起来非常简单,可以降低芯片成本+节省功耗,而且预测准确率其实也不是很差。&br&&br&&ol&&li&&b&静态预测&/b&&br&&/li&&/ol&&a data-hash=&abc4eb5d5b67d47d9a24a9& href=&///people/abc4eb5d5b67d47d9a24a9& class=&member_mention& data-editable=&true& data-title=&@Tianheng Chen& data-tip=&p$b$abc4eb5d5b67d47d9a24a9& data-hovercard=&p$b$abc4eb5d5b67d47d9a24a9&&@Tianheng Chen&/a&的答案中所说的“最简单”的分支预测其实并不是最简单的,最简单的predictor应该是这样的:&br&&ul&&li&&b&预测所有的分支都会跳转(taken)&/b&&/li&&/ul&&br&完了。&br&&br&哈哈是不是有一种“&b&没有设计就是最好的设计&/b&”的感觉?&br&&br&那么这样最简单的分支预测器的准确度是多少呢?来看看James Smith的论文[1]中跑了6个benchmark的结果:&br&&img src=&/8f114fa7d5d2558cab31be6030bda790_b.png& data-rawwidth=&753& data-rawheight=&517& class=&origin_image zh-lightbox-thumb& width=&753& data-original=&/8f114fa7d5d2558cab31be6030bda790_r.png&&&br&卧槽居然都在50%以上,最高的还达到了99.4%!简直有点不科学啊。&br&&br&从概率的角度看,这样预测的准确度期望值也就是50%左右。然而实际上由于程序中的循环很多,比如一个程序里最多的一个loop循环了几十万次,几乎每次都是taken,其他的branch即使预测错了几千个,平均下来预测的准确度还是会很高。&br&&br&类似的静态预测策略还有:&br&&ul&&li&某些指令一律预测跳转,其他指令一律预测不跳转。(例如判断是大于等于的一律跳转,判断是小于的一律不跳转)&/li&&li&做出和上次是否taken相同的预测。&/li&&li&预测向前的分支(backward branch)会跳转,向后的分支(forwad branch)不跳转。(这里的前后指的的是地址空间的前后,针对的情况就是每当到了一个循环的末尾判断是否继续循环时会预测向前跳继续循环)&/li&&/ul&以上这些策略的精确度都还不错,平均值都有70%以上,具体数据可以去看原来的论文[1]。所以当你设计一个对性能要求不是特别高但又要低功耗低成本的时候,采用静态策略是不错的选择。&br&&br&&b&2. 动态预测&/b&&br&在文章[1]中,James Smith就提出了一种简单的 2-bit 状态机(实质上也是一个saturated counter):&br&初始值为00,每当一个branch taken,就+1,branch没有taken则-1。到11和00的时候则加减一则各自维持现状,根据第一位的值来进行预测,例如11预测taken,01预测 not taken。&br&&br&用一个2bit状态机的核心思路就是:&b&这次预测错了不要紧,再给你一次机会,还是预测错了的话那再改变预测结果&/b&。总之就是提供了一定的容错率。可想而知这样的预测准确率自然也是提高了的:&br&&img src=&/5a0becc8ebd91ccfd43b_b.png& data-rawwidth=&732& data-rawheight=&443& class=&origin_image zh-lightbox-thumb& width=&732& data-original=&/5a0becc8ebd91ccfd43b_r.png&&&br&&br&而另外一个Smith:Alan Smith,又在论文[2]中对这个状态机进行了改进和探索,并且在同一篇论文中提出了Target Buffer的设计。以下是他提出的另外一些状态机,比如这种:&br&&img src=&/e11f92bb0dc70ed3337fa8_b.png& data-rawwidth=&434& data-rawheight=&342& class=&origin_image zh-lightbox-thumb& width=&434& data-original=&/e11f92bb0dc70ed3337fa8_r.png&&&br&图比较多就不一一贴了。&br&&br&再再后来就是Yale Patt大神出来放大招了,这里才是 &a data-hash=&9dd9dacb3fe& href=&///people/9dd9dacb3fe& class=&member_mention& data-editable=&true& data-title=&@泰罗Taro& data-tip=&p$b$9dd9dacb3fe& data-hovercard=&p$b$9dd9dacb3fe&&@泰罗Taro&/a& 答案中所说的,称之为 &b&2 Level Adaptive Training&/b&,汲取了上述方法的精华,估计也是目前采用最广泛最成熟的方法。其核心原理如图:(摘自其论文[3])&br&&img src=&/a61fe0ad457c39d1f0988_b.png& data-rawwidth=&605& data-rawheight=&497& class=&origin_image zh-lightbox-thumb& width=&605& data-original=&/a61fe0ad457c39d1f0988_r.png&&左边是一个History Table,记录着每一条branch instruction是否跳转了的历史记录,然后根据这个值,索引到中间的Pattern Table。比如一条指令历史记录一直是跳转的,那么这时候HR的值就是1111 (假设只有4位),然后就会用PT中第16个位置的值做出预测。而做出预测的根据则是前面所说的状态机的方法。同时本次的实际跳转结果也会输入到做出预测的这个状态机中进行training。&br&&br&呼,讲到这终于差不多把主要思路讲完了。。下面看结果:&br&&img src=&/97a556dea_b.png& data-rawwidth=&656& data-rawheight=&562& class=&origin_image zh-lightbox-thumb& width=&656& data-original=&/97a556dea_r.png&&图中每两条虚线之间是4%。可以看到大部分预测的准确率都已经达到了&b&96%&/b&以上了。&br&&br&把research做到这个份儿上,还让不让别人发paper了 (╯' - ')╯︵ ┻━┻&br&&br&所以后续的很多research都是针对这个模型的优化,但上升的空间已经很小了,毕竟你不能把预测率做过100%嘛。。但广大科研青年还是发现即使只有10%的上升空间,也还是大有可为的。&br&&br&比如你把hit rate从99%提高到了99.5%,你也可以宣称把miss rate降低了50%嘛。(严肃脸&br&&br&&img src=&/e0a4bc1282dfe64d7c6b52_b.png& data-rawwidth=&100& data-rawheight=&100& class=&content_image& width=&100&&&br&&br&&br&不过其实这个领域的研究前沿我并不了解,权当抛砖引玉。&br&&br&[1] &a href=&///?target=http%3A//dl.acm.org/citation.cfm%3Fid%3D801871& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&A study of branch prediction strategies&i class=&icon-external&&&/i&&/a&&br&[2] &a href=&///?target=http%3A//ieeexplore.ieee.org/xpl/login.jsp%3Ftp%3D%26arnumber%3Durl%3Dhttp%253A%252F%252Fieeexplore.ieee.org%252Fxpls%252Fabs_all.jsp%253Farnumber%253D1658927& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&IEEE Xplore Abstract&i class=&icon-external&&&/i&&/a&&br&[3] &a href=&///?target=http%3A//dl.acm.org/citation.cfm%3Fid%3D123475& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Two-level adaptive training branch prediction&i class=&icon-external&&&/i&&/a&
的答案已经说了个大概了,我再来结合当年几篇经典的原版论文详细地补充一下。 首先先说明分支预测的大类,静态预测(static prediction)和动态预测(dynamic prediction)。 所谓静态预,就是无论执行的是什么指令,分支预测器总是执行相同的predict…
&a href=&///?target=http%3A///object/justthefacts.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Intel Xeon Phi vs. NVIDIA Tesla GPU: Just the Facts&i class=&icon-external&&&/i&&/a& 从NVIDIA的角度分析了两者的区别。虽然目前NVIDIA在高性能计算的硬件加速领域还占有绝对优势,但是最近的一篇文章似乎对Intel Xeon Phi的下一代更为看好:&a href=&///?target=http%3A///investing/general//intel-corporations-knights-landing-is-a-huge-threa.aspx& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Intel Corporation's Knight's Landing Is a Huge Threat to NVIDIA&i class=&icon-external&&&/i&&/a&&br&简言之,我相信除了针对同一个市场之外,这两款产品在软硬件构架上更多的是不同而非相似。我对体系结构方面的知识缺乏细节了解,所以就不在这里回答了。单从软件角度考虑,就我有限的OpenMP和CilkPlus开发经验来看,这种并行并没有真正从算法和实现角度彻底的颠覆顺行思维,而是通过使用SIMD操作来实现简单的并行。GPU编程是真正的思维转换,从低层的Data Primitive开始就采用完全不同的思路。比如&a href=&///?target=http%3A//http./GPUGems3/gpugems3_ch39.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GPU Gems 3 - Chapter 39. Parallel Prefix Sum (Scan) with CUDA&i class=&icon-external&&&/i&&/a& 以及 &a href=&///?target=http%3A//nvlabs.github.io/moderngpu/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Modern GPU&i class=&icon-external&&&/i&&/a& 中的许多算法,你会发现你基本看不到他顺行的原貌了。Intel表示这是一种麻烦,而我恰恰认为,要真正适应并行架构,必须从思想上彻底并行。在这一点上我十分喜欢GPU的思路。
从NVIDIA的角度分析了两者的区别。虽然目前NVIDIA在高性能计算的硬件加速领域还占有绝对优势,但是最近的一篇文章似乎对Intel Xeon Phi的下一代更为看好:
已有帐号?
无法登录?
社交帐号登录
708 人关注
180 条内容
401 人关注
256 条内容
198 人关注
845 条内容
267 人关注
115 条内容}

我要回帖

更多关于 a computer什么意思 的文章

更多推荐

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

点击添加站长微信