OEMG31主板+金士顿4G内存条+二级缓2M的e5800CPU,若换二级缓6M的e8500CPU,请问运行速度和能力可提高多少?

[编者按:这是Ulrich Drepper写“都该知道存储器”的第二部。那些没有读过的读者可能希望从这一部开始。这本书写的非常好,并且感谢Ulrich授权我们出版。

一点说明:书籍出版时可能会有一些印刷错误,如果你发现,并且想让它在后续的出版中更正,请将意见发邮件到 ,我们一定会更正,并反馈给Ulrich的文档副本,别的读者就不会受到这些困扰。]

现在的CPU比25年前要精密得多了。在那个年代,CPU的频率与内存总线的频率基本在同一层面上。内存的访问速度仅比寄存器慢那么一点点。但是,这一局面在上世纪90年代被打破了。CPU的频率大大提升,但内存总线的频率与内存芯片的性能却没有得到成比例的提升。并不是因为造不出更快的内存,只是因为太贵了。内存如果要达到目前CPU那样的速度,那么它的造价恐怕要贵上好几个数量级。

如果有两个选项让你选择,一个是速度非常快、但容量很小的内存,一个是速度还算快、但容量很多的内存,如果你的工作集比较大,超过了前一种情况,那么人们总是会选择第二个选项。原因在于辅存(一般为磁盘)的速度。由于工作集超过主存,那么必须用辅存来保存交换出去的那部分数据,而辅存的速度往往要比主存慢上好几个数量级。

好在这问题也并不全然是非甲即乙的选择。在配置大量DRAM的同时,我们还可以配置少量SRAM。将地址空间的某个部分划给SRAM,剩下的部分划给DRAM。一般来说,SRAM可以当作扩展的寄存器来使用。

上面的做法看起来似乎可以,但实际上并不可行。首先,将SRAM内存映射到进程的虚拟地址空间就是个非常复杂的工作,而且,在这种做法中,每个进程都需要管理这个SRAM区内存的分配。每个进程可能有大小完全不同的SRAM区,而组成程序的每个模块也需要索取属于自身的SRAM,更引入了额外的同步需求。简而言之,快速内存带来的好处完全被额外的管理开销给抵消了。 基于以上的原因,我们不将SRAM放在OS或用户的控制下,而是将它交由处理器来使用和管理。在这种模式下,SRAM用于对存储在主存中、即将使用的数据进行临时拷贝(换句话说,缓存)。这种做法的依据是程序代码和数据具有时间局部性和空间局部性。也就是说,在一段较短的时间内,同一份代码和数据有很大的可能被重复使用。对代码来说,是循环,即同一段代码被反复执行(完美的 空间局部性)。对数据来说,是反复访问某一小片区域中的数据。即使在短时间内对内存的访问并不连续,但仍有很大可能在不长的时间内重复访问同一份数据( 空间局部性)。这两个局部性是我们理解CPU高速缓存的关键。

我们先用一个简单的计算来展示一下高速缓存的效率。假设,访问主存需要200个周期,而访问高速缓存需要15个周期。如果使用100个数据元素100次,那么在没有高速缓存的情况下,需要2000000个周期,而在有高速缓存、而且所有数据都已被缓存的情况下,只需要168500个周期。节约了91.5%的时间。

用作高速缓存的SRAM容量比主存小得多。以我的经验来说,高速缓存的大小一般是主存的千分之一左右(目前一般是4GB主存、4MB缓存)。这一点本身并不是什么问题。只是,计算机一般都会有比较大的主存,因此工作集的大小总是会大于缓存。特别是那些运行多进程的系统,它的工作集大小是所有进程加上内核的总和。

处理高速缓存大小的限制需要制定一套很好的策略来决定在给定的时间内什么数据应该被缓存。由于不是所有数据的工作集都是在完全相同的时间段内被使用的,我们可以用一些技术手段将需要用到的数据临时替换那些当前并未使用的缓存数据。这种预取将会减少部分访问主存的成本,因为它与程序的执行是异步的。所有的这些技术将会使高速缓存在使用的时候看起来比实际更大。我们将在3.3节讨论这些问题。 我们将在第6章讨论如何让这些技术能很好地帮助程序员,让处理器更高效地工作。

3.1 高速缓存的位置

在深入介绍高速缓存的技术细节之前,有必要说明一下它在现代计算机系统中所处的位置。


图3.1: 最简单的高速缓存配置图

图3.1展示了最简单的高速缓存配置。早期的一些系统就是类似的架构。在这种架构中,CPU核心不再直连到主存。{在一些更早的系统中,高速缓存像CPU与主存一样连到系统总线上。那种做法更像是一种hack,而不是真正的解决方案。}数据的读取和存储都经过高速缓存。CPU核心与高速缓存之间是一条特殊的快速通道。在简化的表示法中,主存与高速缓存都连到系统总线上,这条总线同时还用于与其它组件通信。我们管这条总线叫“FSB”——就是现在称呼它的术语,参见第2.2节。在这一节里,我们将忽略北桥。

在过去的几十年,经验表明使用了冯诺伊曼结构的 计算机,将用于代码和数据的高速缓存分开是存在巨大优势的。自1993年以来,Intel 并且一直坚持使用独立的代码和数据高速缓存。由于所需的代码和数据的内存区域是几乎相互独立的,这就是为什么独立缓存工作得更完美的原因。近年来,独立缓存的另一个优势慢慢显现出来:常见处理器解码 指令的步骤 是缓慢的,尤其当管线为空的时候,往往会伴随着错误的预测或无法预测的分支的出现, 将高速缓存技术用于 指令 解码可以加快其执行速度。

在高速缓存出现后不久,系统变得更加复杂。高速缓存与主存之间的速度差异进一步拉大,直到加入了另一级缓存。新加入的这一级缓存比第一级缓存更大,但是更慢。由于加大一级缓存的做法从经济上考虑是行不通的,所以有了二级缓存,甚至现在的有些系统拥有三级缓存,如图3.2所示。随着单个CPU中核数的增加,未来甚至可能会出现更多层级的缓存。


图3.2: 三级缓存的处理器

图3.2展示了三级缓存,并介绍了本文将使用的一些术语。L1d是一级数据缓存,L1i是一级指令缓存,等等。请注意,这只是示意图,真正的数据流并不需要流经上级缓存。CPU的设计者们在设计高速缓存的接口时拥有很大的自由。而程序员是看不到这些设计选项的。

另外,我们有多核CPU,每个核心可以有多个“线程”。核心与线程的不同之处在于,核心拥有独立的硬件资源({早期的多核CPU甚至有独立的二级缓存。})。在不同时使用相同资源(比如,通往外界的连接)的情况下,核心可以完全独立地运行。而线程只是共享资源。Intel的线程只有独立的寄存器,而且还有限制——不是所有寄存器都独立,有些是共享的。综上,现代CPU的结构就像图3.3所示。


图3.3 多处理器、多核心、多线程

在上图中,有两个处理器,每个处理器有两个核心,每个核心有两个线程。线程们共享一级缓存。核心(以深灰色表示)有独立的一级缓存,同时共享二级缓存。处理器(淡灰色)之间不共享任何缓存。这些信息很重要,特别是在讨论多进程和多线程情况下缓存的影响时尤为重要。

3.2 高级的缓存操作

了解成本和节约使用缓存,我们必须结合在第二节中讲到的关于计算机体系结构和RAM技术,以及前一节讲到的缓存描述来探讨。

默认情况下,CPU核心所有的数据的读或写都存储在缓存中。当然,也有内存区域不能被缓存的,但是这种情况只发生在操作系统的实现者对数据考虑的前提下;对程序实现者来说,这是不可见的。这也说明,程序设计者可以故意绕过某些缓存,不过这将是第六节中讨论的内容了。

如果CPU需要访问某个字(word),先检索缓存。很显然,缓存不可能容纳主存所有内容(否则还需要主存干嘛)。系统用字的内存地址来对缓存条目进行标记。如果需要读写某个地址的字,那么根据标签来检索缓存即可。这里用到的地址可以是虚拟地址,也可以是物理地址,取决于缓存的具体实现。

标签是需要额外空间的,用字作为缓存的粒度显然毫无效率。比如,在x86机器上,32位字的标签可能需要32位,甚至更长。另一方面,由于空间局部性的存在,与当前地址相邻的地址有很大可能会被一起访问。再回忆下2.2.1节——内存模块在传输位于同一行上的多份数据时,由于不需要发送新CAS信号,甚至不需要发送RAS信号,因此可以实现很高的效率。基于以上的原因,缓存条目并不存储单个字,而是存储若干连续字组成的“线”。在早期的缓存中,线长是32字节,现在一般是64字节。对于64位宽的内存总线,每条线需要8次传输。而DDR对于这种传输模式的支持更为高效。

当处理器需要内存中的某块数据时,整条缓存线被装入L1d。缓存线的地址通过对内存地址进行掩码操作生成。对于64字节的缓存线,是将低6位置0。这些被丢弃的位作为线内偏移量。其它的位作为标签,并用于在缓存内定位。在实践中,我们将地址分为三个部分。32位地址的情况如下:

如果缓存线长度为2O,那么地址的低O位用作线内偏移量。上面的S位选择“缓存集”。后面我们会说明使用缓存集的原因。现在只需要明白一共有2S个缓存集就够了。剩下的32 – S – O = T位组成标签。它们用来区分别名相同的各条线{有相同S部分的缓存线被称为有相同的别名。}用于定位缓存集的S部分不需要存储,因为属于同一缓存集的所有线的S部分都是相同的。

当某条指令修改内存时,仍然要先装入缓存线,因为任何指令都不可能同时修改整条线(只有一个例外——第6.1节中将会介绍的写合并(write-combine))。因此需要在写操作前先把缓存线装载进来。如果缓存线被写入,但还没有写回主存,那就是所谓的“脏了”。脏了的线一旦写回主存,脏标记即被清除。

为了装入新数据,基本上总是要先在缓存中清理出位置。L1d将内容逐出L1d,推入L2(线长相同)。当然,L2也需要清理位置。于是L2将内容推入L3,最后L3将它推入主存。这种逐出操作一级比一级昂贵。这里所说的是现代AMD和VIA处理器所采用的独占型缓存(exclusive cache)。而Intel采用的是包容型缓存(inclusive cache),{并不完全正确,Intel有些缓存是独占型的,还有一些缓存具有独占型缓存的特点。}L1d的每条线同时存在于L2里。对这种缓存,逐出操作就很快了。如果有足够L2,对于相同内容存在不同地方造成内存浪费的缺点可以降到最低,而且在逐出时非常有利。而独占型缓存在装载新数据时只需要操作L1d,不需要碰L2,因此会比较快。

处理器体系结构中定义的作为存储器的模型只要还没有改变,那就允许多CPU按照自己的方式来管理高速缓存。这表示,例如,设计优良的处理器,利用很少或根本没有内存总线活动,并主动写回主内存脏高速缓存行。这种高速缓存架构在如x86和x86-64各种各样的处理器间存在。制造商之间,即使在同一制造商生产的产品中,证明了的内存模型抽象的力量。

在对称多处理器(SMP)架构的系统中,CPU的高速缓存不能独立的工作。在任何时候,所有的处理器都应该拥有相同的内存内容。保证这样的统一的内存视图被称为“高速缓存一致性”。如果在其自己的高速缓存和主内存间,处理器设计简单,它将不会看到在其他处理器上的脏高速缓存行的内容。从一个处理器直接访问另一个处理器的高速缓存这种模型设计代价将是非常昂贵的,它是一个相当大的瓶颈。相反,当另一个处理器要读取或写入到高速缓存线上时,处理器会去检测。

如果CPU检测到一个写访问,而且该CPU的cache中已经缓存了一个cache line的原始副本,那么这个cache line将被标记为无效的cache line。接下来在引用这个cache line之前,需要重新加载该cache line。需要注意的是读访问并不会导致cache line被标记为无效的。

更精确的cache实现需要考虑到其他更多的可能性,比如第二个CPU在读或者写他的cache line时,发现该cache line在第一个CPU的cache中被标记为脏数据了,此时我们就需要做进一步的处理。在这种情况下,主存储器已经失效,第二个CPU需要读取第一个CPU的cache line。通过测试,我们知道在这种情况下第一个CPU会将自己的cache line数据自动发送给第二个CPU。这种操作是绕过主存储器的,但是有时候存储控制器是可以直接将第一个CPU中的cache line数据存储到主存储器中。对第一个CPU的cache的写访问会导致本地cache line的所有拷贝被标记为无效。

随着时间的推移,一大批缓存一致性协议已经建立。其中,最重要的是MESI,我们将在第3.3.4节进行介绍。以上结论可以概括为几个简单的规则:

  • 一个脏缓存线不存在于任何其他处理器的缓存之中。
  • 同一缓存线中的干净拷贝可以驻留在任意多个其他缓存之中。

如果遵守这些规则,处理器甚至可以在多处理器系统中更加有效的使用它们的缓存。所有的处理器需要做的就是监控其他每一个写访问和比较本地缓存中的地址。在下一节中,我们将介绍更多细节方面的实现,尤其是存储开销方面的细节。

最后,我们至少应该关注高速缓存命中或未命中带来的消耗。下面是英特尔奔腾 M 的数据:

这是在CPU周期中的实际访问时间。有趣的是,对于L2高速缓存的访问时间很大一部分(甚至是大部分)是由线路的延迟引起的。这是一个限制,增加高速缓存的大小变得更糟。只有当减小时(例如,从60纳米的Merom到45纳米Penryn处理器),可以提高这些数据。

表格中的数字看起来很高,但是,幸运的是,整个成本不必须负担每次出现的缓存加载和缓存失效。某些部分的成本可以被隐藏。现在的处理器都使用不同长度的内部管道,在管道内指令被解码,并为准备执行。如果数据要传送到一个寄存器,那么部分的准备工作是从存储器(或高速缓存)加载数据。如果内存加载操作在管道中足够早的进行,它可以与其他操作并行发生,那么加载的全部发销可能会被隐藏。对L1D常常可能如此;某些有长管道的处理器的L2也可以。

提早启动内存的读取有许多障碍。它可能只是简单的不具有足够资源供内存访问,或者地址从另一个指令获取,然后加载的最终地址才变得可用。在这种情况下,加载成本是不能隐藏的(完全的)。

对于写操作,CPU并不需要等待数据被安全地放入内存。只要指令具有类似的效果,就没有什么东西可以阻止CPU走捷径了。它可以早早地执行下一条指令,甚至可以在影子寄存器(shadow register)的帮助下,更改这个写操作将要存储的数据。


图3.4: 随机写操作的访问时间

图3.4展示了缓存的效果。关于产生图中数据的程序,我们会在稍后讨论。这里大致说下,这个程序是连续随机地访问某块大小可配的内存区域。每个数据项的大小是固定的。数据项的多少取决于选择的工作集大小。Y轴表示处理每个元素平均需要多少个CPU周期,注意它是对数刻度。X轴也是同样,工作集的大小都以2的n次方表示。

图中有三个比较明显的不同阶段。很正常,这个处理器有L1d和L2,没有L3。根据经验可以推测出,L1d有213字节,而L2有220字节。因为,如果整个工作集都可以放入L1d,那么只需不到10个周期就可以完成操作。如果工作集超过L1d,处理器不得不从L2获取数据,于是时间飘升到28个周期左右。如果工作集更大,超过了L2,那么时间进一步暴涨到480个周期以上。这时候,许多操作将不得不从主存中获取数据。更糟糕的是,如果修改了数据,还需要将这些脏了的缓存线写回内存。

看了这个图,大家应该会有足够的动力去检查代码、改进缓存的利用方式了吧?这里的性能改善可不只是微不足道的几个百分点,而是几个数量级呀。在第6节中,我们将介绍一些编写高效代码的技巧。而下一节将进一步深入缓存的设计。虽然精彩,但并不是必修课,大家可以选择性地跳过。

高速缓存的实现者遇到这样的难题:巨大的主内存中每一个单元都潜在的需要缓存。如果程序的工作集足够大,这意味着很多主内存单元竞争高速缓存的每一个地方。先前有过提示,主存和高速缓存的大小比是1000:1,这是不常见的。

可以这样实现一个高速缓存,每个高速缓存段(高速缓存行:cache line)都可以容纳任何内存位置的一个副本。这就是所谓的全关联。要访问一个缓存段,处理器核心不得不用所有缓存段的标签和请求地址的标签一一做比较。标签将包含除去缓存段的偏移量全部的地址,(译注:也就是去除3.2节中图的O)(这意味着,S在3.2节的图中是零)

高速缓存有类似这样的实现,但是,看看在今天使用的L2的数目,表明这是不切实际的。给定4MB的高速缓存和64B的高速缓存段,高速缓存将有65,536个项。为了达到足够的性能,缓存逻辑必须能够在短短的几个时钟周期内,从所有这些项中,挑一个匹配给定的标签。实现这一点的工作将是巨大的。

对于每个高速缓存行,比较器是需要比较大标签(注意,S是零)。每个连接旁边的字母表示位的宽度。如果没有给出,它是一个单比特线。每个比较器都要比较两个T-位宽的值。然后,基于该结果,适当的高速缓存行的内容被选中,并使其可用。这需要合并多套O数据线,因为他们是缓存桶(译注:这里类似把O输出接入多选器,所以需要合并)。实现仅仅一个比较器,需要晶体管的数量就非常大,特别是因为它必须非常快。没有迭代比较器是可用的。节省比较器的数目的唯一途径是通过反复比较标签,以减少它们的数目。这是不适合的,出于同样的原因,迭代比较器不可用:它的时间太长。

全关联高速缓存对 小缓存是实用的(例如,在某些Intel处理器的TLB缓存是全关联的),但这些缓存都很小,非常小的。我们正在谈论的最多几十项。

对于L1i,L1d和更高级别的缓存,需要采用不同的方法。可以做的就是是限制搜索。最极端的限制是,每个标签映射到一个明确的缓存条目。计算很简单:给定的4MB/64B缓存有65536项,我们可以使用地址的bit6到bit21(16位)来直接寻址高速缓存的每一个项。地址的低6位作为高速缓存段的索引。

在图3.6中可以看出,这种直接映射的高速缓存,速度快,比较容易实现。它只是需要一个比较器,一个多路复用器(在这个图中有两个,标记和数据是分离的,但是对于设计这不是一个硬性要求),和一些逻辑来选择只是有效的高速缓存行的内容。由于速度的要求,比较器是复杂的,但是现在只需要一个,结果是可以花更多的精力,让其变得快速。这种方法的复杂性在于在多路复用器。一个简单的多路转换器中的晶体管的数量增速是O(log N)的,其中N是高速缓存段的数目。这是可以容忍的,但可能会很慢,在某种情况下,速度可提升,通过增加多路复用器晶体管数量,来并行化的一些工作和自身增速。晶体管的总数只是随着快速增长的高速缓存缓慢的增加,这使得这种解决方案非常有吸引力。但它有一个缺点:只有用于直接映射地址的相关的地址位均匀分布,程序才能很好工作。如果分布的不均匀,而且这是常态,一些缓存项频繁的使用,并因此多次被换出,而另一些则几乎不被使用或一直是空的。

可以通过使高速缓存的组关联来解决此问题。组关联结合高速缓存的全关联和直接映射高速缓存特点,在很大程度上避免那些设计的弱点。图3.7显示了一个组关联高速缓存的设计。标签和数据存储分成不同的组并可以通过地址选择。这类似直接映射高速缓存。但是,小数目的值可以在同一个高速缓存组缓存,而不是一个缓存组只有一个元素,用于在高速缓存中的每个设定值是相同的一组值的缓存。所有组的成员的标签可以并行比较,这类似全关联缓存的功能。

其结果是高速缓存,不容易被不幸或故意选择同属同一组编号的地址所击败,同时高速缓存的大小并不限于由比较器的数目,可以以并行的方式实现。如果高速缓存增长,只(在该图中)增加列的数目,而不增加行数。只有高速缓存之间的关联性增加,行数才会增加。今天,处理器的L2高速缓存或更高的高速缓存,使用的关联性高达16。 L1高速缓存通常使用8。

Table 3.1: 高速缓存大小,关联行,段大小的影响

给定我们4MB/64B高速缓存,8路组关联,相关的缓存留给我们的有8192组,只用标签的13位,就可以寻址缓集。要确定哪些(如果有的话)的缓存组设置中的条目包含寻址的高速缓存行,8个标签都要进行比较。在很短的时间内做出来是可行的。通过一个实验,我们可以看到,这是有意义的。

表3.1显示一个程序在改变缓存大小,缓存段大小和关联集大小,L2高速缓存的缓存失效数量(根据Linux内核相关的方面人的说法,GCC在这种情况下,是他们所有中最重要的标尺)。在7.2节中,我们将介绍工具来模拟此测试要求的高速缓存。

万一这还不是很明显,所有这些值之间的关系是高速缓存的大小为:

地址被映射到高速缓存使用

在第3.2节中的图显示的方式。

图3.8表中的数据更易于理解。它显示一个固定的32个字节大小的高速缓存行的数据。对于一个给定的高速缓存大小,我们可以看出,关联性,的确可以帮助明显减少高速缓存未命中的数量。对于8MB的缓存,从直接映射到2路组相联,可以减少近44%的高速缓存未命中。组相联高速缓存和直接映射缓存相比,该处理器可以把更多的工作集保持在缓存中。

在文献中,偶尔可以读到,引入关联性,和加倍高速缓存的大小具有相同的效果。在从4M缓存跃升到8MB缓存的极端的情况下,这是正确的。关联性再提高一倍那就肯定不正确啦。正如我们所看到的数据,后面的收益要小得多。我们不应该完全低估它的效果,虽然。在示例程序中的内存使用的峰值是5.6M。因此,具有8MB缓存不太可能有很多(两个以上)使用相同的高速缓存的组。从较小的缓存的关联性的巨大收益可以看出,较大工作集可以节省更多。

在一般情况下,增加8以上的高速缓存之间的关联性似乎对只有一个单线程工作量影响不大。随着介绍一个使用共享L2的多核处理器,形势发生了变化。现在你基本上有两个程序命中相同的缓存, 实际上导致高速缓存减半(对于四核处理器是1/4)。因此,可以预期,随着核的数目的增加,共享高速缓存的相关性也应增长。一旦这种方法不再可行(16 路组关联性已经很难)处理器设计者不得不开始使用共享的三级高速缓存和更高级别的,而L2高速缓存只被核的一个子集共享。

从图3.8中,我们还可以研究缓存大小对性能的影响。这一数据需要了解工作集的大小才能进行解读。很显然,与主存相同的缓存比小缓存能产生更好的结果,因此,缓存通常是越大越好。

上文已经说过,示例中最大的工作集为5.6M。它并没有给出最佳缓存大小值,但我们可以估算出来。问题主要在于内存的使用并不连续,因此,即使是16M的缓存,在处理5.6M的工作集时也会出现冲突(参见2路集合关联式16MB缓存vs直接映射式缓存的优点)。不管怎样,我们可以有把握地说,在同样5.6M的负载下,缓存从16MB升到32MB基本已没有多少提高的余地。但是,工作集是会变的。如果工作集不断增大,缓存也需要随之增大。在购买计算机时,如果需要选择缓存大小,一定要先衡量工作集的大小。原因可以参见图3.10。


图3.9: 测试的内存分布情况

我们执行两项测试。第一项测试是按顺序地访问所有元素。测试程序循着指针n进行访问,而所有元素是链接在一起的,从而使它们的被访问顺序与在内存中排布的顺序一致,如图3.9的下半部分所示,末尾的元素有一个指向首元素的引用。而第二项测试(见图3.9的上半部分)则是按随机顺序访问所有元素。在上述两个测试中,所有元素都构成一个单向循环链表。

用于测试程序的数据可以模拟一个任意大小的工作集:包括读、写访问,随机、连续访问。在图3.4中我们可以看到,程序为工作集创建了一个与其大小和元素类型相同的数组:

n字段将所有节点随机得或者顺序的加入到环形链表中,用指针从当前节点进入到下一个节点。pad字段用来存储数据,其可以是任意大小。在一些测试程序中,pad字段是可以修改的, 在其他程序中,pad字段只可以进行读操作。

在性能测试中,我们谈到工作集大小的问题,工作集使用结构体l定义的元素表示的。2N 字节的工作集包含

个元素. 显然sizeof(struct l) 的值取决于NPAD的大小。在32位系统上,NPAD=7意味着数组的每个元素的大小为32字节,在64位系统上,NPAD=7意味着数组的每个元素的大小为64字节。

最简单的情况就是遍历链表中顺序存储的节点。无论是从前向后处理,还是从后向前,对于处理器来说没有什么区别。下面的测试中,我们需要得到处理链表中一个元素所需要的时间,以CPU时钟周期最为计时单元。图3.10显示了测试结构。除非有特殊说明, 所有的测试都是在Pentium 4 64-bit 平台上进行的,因此结构体l中NPAD=0,大小为8字节。


图 3.11: 顺序读多个字节

一开始的两个测试数据收到了噪音的污染。由于它们的工作负荷太小,无法过滤掉系统内其它进程对它们的影响。我们可以认为它们都是4个周期以内的。这样一来,整个图可以划分为比较明显的三个部分:

  • 工作集小于214字节的。
  • 工作集从215字节到220字节的。
  • 工作集大于221字节的。

这样的结果很容易解释——是因为处理器有16KB的L1d和1MB的L2。而在这三个部分之间,并没有非常锐利的边缘,这是因为系统的其它部分也在使用缓存,我们的测试程序并不能独占缓存的使用。尤其是L2,它是统一式的缓存,处理器的指令也会使用它(注: Intel使用的是包容式缓存)。

测试的实际耗时可能会出乎大家的意料。L1d的部分跟我们预想的差不多,在一台P4上耗时为4个周期左右。但L2的结果则出乎意料。大家可能觉得需要14个周期以上,但实际只用了9个周期。这要归功于处理器先进的处理逻辑,当它使用连续的内存区时,会 预先读取下一条缓存线的数据。这样一来,当真正使用下一条线的时候,其实已经早已读完一半了,于是真正的等待耗时会比L2的访问时间少很多。

在工作集超过L2的大小之后,预取的效果更明显了。前面我们说过,主存的访问需要耗时200个周期以上。但在预取的帮助下,实际耗时保持在9个周期左右。200 vs 9,效果非常不错。

我们可以观察到预取的行为,至少可以间接地观察到。图3.11中有4条线,它们表示处理不同大小结构时的耗时情况。随着结构的变大,元素间的距离变大了。图中4条线对应的元素距离分别是0、56、120和248字节。

图中最下面的这一条线来自前一个图,但在这里更像是一条直线。其它三条线的耗时情况比较差。图中这些线也有比较明显的三个阶段,同时,在小工作集的情况下也有比较大的错误(请再次忽略这些错误)。在只使用L1d的阶段,这些线条基本重合。因为这时候还不需要预取,只需要访问L1d就行。

在L2阶段,三条新加的线基本重合,而且耗时比老的那条线高很多,大约在28个周期左右,差不多就是L2的访问时间。这表明,从L2到L1d的预取并没有生效。这是因为,对于最下面的线(NPAD=0),由于结构小,8次循环后才需要访问一条新缓存线,而上面三条线对应的结构比较大,拿相对最小的NPAD=7来说,光是一次循环就需要访问一条新线,更不用说更大的NPAD=15和31了。而预取逻辑是无法在每个周期装载新线的,因此每次循环都需要从L2读取,我们看到的就是从L2读取的时延。

更有趣的是工作集超过L2容量后的阶段。快看,4条线远远地拉开了。元素的大小变成了主角,左右了性能。处理器应能识别每一步(stride)的大小,不去为NPAD=15和31获取那些实际并不需要的缓存线(参见6.3.1)。元素大小对预取的约束是根源于硬件预取的限制——它无法跨越页边界。如果允许预取器跨越页边界,而下一页不存在或无效,那么OS还得去寻找它。这意味着,程序需要遭遇一次并非由它自己产生的页错误,这是完全不能接受的。在NPAD=7或者更大的时候,由于每个元素都至少需要一条缓存线,预取器已经帮不上忙了,它没有足够的时间去从内存装载数据。 另一个导致慢下来的原因是TLB缓存的未命中。TLB是存储虚实地址映射的缓存,参见第4节。为了保持快速,TLB只有很小的容量。如果有大量页被反复访问,超出了TLB缓存容量,就会导致反复地进行地址翻译,这会耗费大量时间。TLB查找的代价分摊到所有元素上,如果元素越大,那么元素的数量越少,每个元素承担的那一份就越多。

为了观察TLB的性能,我们可以进行另两项测试。第一项:我们还是顺序存储列表中的元素,使NPAD=7,让每个元素占满整个cache line,第二项:我们将列表的每个元素存储在一个单独的页上,忽略每个页没有使用的部分以用来计算工作集的大小。(这样做可能不太一致,因为在前面的测试中,我计算了结构体中每个元素没有使用的部分,从而用来定义NPAD的大小,因此每个元素占满了整个页,这样以来工作集的大小将会有所不同。但是这不是这项测试的重点,预取的低效率多少使其有点不同)。结果表明,第一项测试中,每次列表的迭代都需要一个新的cache line,而且每64个元素就需要一个新的页。第二项测试中,每次迭代都会在一个新的页中加载一个新的cache line。

结果见图3.12。该测试与图3.11是在同一台机器上进行的。基于可用RAM空间的有限性,测试设置容量空间大小为2的24次方字节,这就需要1GB的容量将对象放置在分页上。图3.12中下方的红色曲线正好对应了图3.11中NPAD等于7的曲线。我们看到不同的步长显示了高速缓存L1d和L2的大小。第二条曲线看上去完全不同,其最重要的特点是当工作容量到达2的13次方字节时开始大幅度增长。这就是TLB缓存溢出的时候。我们能计算出一个64字节大小的元素的TLB缓存有64个输入。成本不会受页面错误影响,因为程序锁定了存储器以防止内存被换出。

可以看出,计算物理地址并把它存储在TLB中所花费的周期数量级是非常高的。图3.12的表格显示了一个极端的例子,但从中可以清楚的得到:TLB缓存效率降低的一个重要因素是大型NPAD值的减缓。由于物理地址必须在缓存行能被L2或主存读取之前计算出来,地址转换这个不利因素就增加了内存访问时间。这一点部分解释了为什么NPAD等于31时每个列表元素的总花费比理论上的RAM访问时间要高。

通过查看链表元素被修改时测试数据的运行情况,我们可以窥见一些更详细的预取实现细节。图3.13显示了三条曲线。所有情况下元素宽度都为16个字节。第一条曲线“Follow”是熟悉的链表走线在这里作为基线。第二条曲线,标记为“Inc”,仅仅在当前元素进入下一个前给其增加thepad[0]成员。第三条曲线,标记为”Addnext0″, 取出下一个元素的thepad[0]链表元素并把它添加为当前链表元素的thepad[0]成员。

在没运行时,大家可能会以为”Addnext0″更慢,因为它要做的事情更多——在没进到下个元素之前就需要装载它的值。但实际的运行结果令人惊讶——在某些小工作集下,”Addnext0″比”Inc”更快。这是为什么呢?原因在于,系统一般会对下一个元素进行强制性预取。当程序前进到下个元素时,这个元素其实早已被预取在L1d里。因此,只要工作集比L2小,”Addnext0″的性能基本就能与”Follow”测试媲美。

但是,”Addnext0″比”Inc”更快离开L2,这是因为它需要从主存装载更多的数据。而在工作集达到2 21字节时,”Addnext0″的耗时达到了28个周期,是同期”Follow”14周期的两倍。这个两倍也很好解释。”Addnext0″和”Inc”涉及对内存的修改,因此L2的逐出操作不能简单地把数据一扔了事,而必须将它们写入内存。因此FSB的可用带宽变成了一半,传输等量数据的耗时也就变成了原来的两倍。

决定顺序式缓存处理性能的另一个重要因素是缓存容量。虽然这一点比较明显,但还是值得一说。图3.14展示了128字节长元素的测试结果(64位机,NPAD=15)。这次我们比较三台不同计算机的曲线,两台P4,一台Core 2。两台P4的区别是缓存容量不同,一台是32k的L1d和1M的L2,一台是16K的L1d、512k的L2和2M的L3。Core 2那台则是32k的L1d和4M的L2。

图中最有趣的地方,并不是Core 2如何大胜两台P4,而是工作集开始增长到连末级缓存也放不下、需要主存热情参与之后的部分。

表3.2: 顺序访问与随机访问时L2命中与未命中的情况,NPAD=0

与我们预计的相似,最末级缓存越大,曲线停留在L2访问耗时区的时间越长。在220字节的工作集时,第二台P4(更老一些)比第一台P4要快上一倍,这要完全归功于更大的末级缓存。而Core 2拜它巨大的4M L2所赐,表现更为卓越。

对于随机的工作负荷而言,可能没有这么惊人的效果,但是,如果我们能将工作负荷进行一些裁剪,让它匹配末级缓存的容量,就完全可以得到非常大的性能提升。也是由于这个原因,有时候我们需要多花一些钱,买一个拥有更大缓存的处理器。

单线程随机访问模式的测量

前面我们已经看到,处理器能够利用L1d到L2之间的预取消除访问主存、甚至是访问L2的时延。

但是,如果换成随机访问或者不可预测的访问,情况就大不相同了。图3.15比较了顺序读取与随机读取的耗时情况。

换成随机之后,处理器无法再有效地预取数据,只有少数情况下靠运气刚好碰到先后访问的两个元素挨在一起的情形。

图3.15中有两个需要关注的地方。首先,在大的工作集下需要非常多的周期。这台机器访问主存的时间大约为200-300个周期,但图中的耗时甚至超过了450个周期。我们前面已经观察到过类似现象(对比图3.11)。这说明,处理器的自动预取在这里起到了反效果。

其次,代表随机访问的曲线在各个阶段不像顺序访问那样保持平坦,而是不断攀升。为了解释这个问题,我们测量了程序在不同工作集下对L2的访问情况。结果如图3.16和表3.2。

从图中可以看出,当工作集大小超过L2时,未命中率(L2未命中次数/L2访问次数)开始上升。整条曲线的走向与图3.15有些相似: 先急速爬升,随后缓缓下滑,最后再度爬升。它与耗时图有紧密的关联。L2未命中率会一直爬升到100%为止。只要工作集足够大(并且内存也足够大),就可以将缓存线位于L2内或处于装载过程中的可能性降到非常低。

缓存未命中率的攀升已经可以解释一部分的开销。除此以外,还有一个因素。观察表3.2的L2/#Iter列,可以看到每个循环对L2的使用次数在增长。由于工作集每次为上一次的两倍,如果没有缓存的话,内存的访问次数也将是上一次的两倍。在按顺序访问时,由于缓存的帮助及完美的预见性,对L2使用的增长比较平缓,完全取决于工作集的增长速度。

而换成随机访问后,单位耗时的增长超过了工作集的增长,根源是TLB未命中率的上升。图3.17描绘的是NPAD=7时随机访问的耗时情况。这一次,我们修改了随机访问的方式。正常情况下是把整个列表作为一个块进行随机(以∞表示),而其它11条线则是在小一些的块里进行随机。例如,标签为’60′的线表示以60页(245760字节)为单位进行随机。先遍历完这个块里的所有元素,再访问另一个块。这样一来,可以保证任意时刻使用的TLB条目数都是有限的。 NPAD=7对应于64字节,正好等于缓存线的长度。由于元素顺序随机,硬件预取不可能有任何效果,特别是在元素较多的情况下。这意味着,分块随机时的L2未命中率与整个列表随机时的未命中率没有本质的差别。随着块的增大,曲线逐渐逼近整个列表随机对应的曲线。这说明,在这个测试里,性能受到TLB命中率的影响很大,如果我们能提高TLB命中率,就能大幅度地提升性能(在后面的一个例子里,性能提升了38%之多)。

在我们开始研究多个线程或进程同时使用相同内存之前,先来看一下缓存实现的一些细节。我们要求缓存是一致的,而且这种一致性必须对用户级代码完全透明。而内核代码则有所不同,它有时候需要对缓存进行转储(flush)。

这意味着,如果对缓存线进行了修改,那么在这个时间点之后,系统的结果应该是与没有缓存的情况下是相同的,即主存的对应位置也已经被修改的状态。这种要求可以通过两种方式或策略实现:

写通比较简单。当修改缓存线时,处理器立即将它写入主存。这样可以保证主存与缓存的内容永远保持一致。当缓存线被替代时,只需要简单地将它丢弃即可。这种策略很简单,但是速度比较慢。如果某个程序反复修改一个本地变量,可能导致FSB上产生大量数据流,而不管这个变量是不是有人在用,或者是不是短期变量。

写回比较复杂。当修改缓存线时,处理器不再马上将它写入主存,而是打上已弄脏(dirty)的标记。当以后某个时间点缓存线被丢弃时,这个已弄脏标记会通知处理器把数据写回到主存中,而不是简单地扔掉。

写回有时候会有非常不错的性能,因此较好的系统大多采用这种方式。采用写回时,处理器们甚至可以利用FSB的空闲容量来存储缓存线。这样一来,当需要缓存空间时,处理器只需清除脏标记,丢弃缓存线即可。

但写回也有一个很大的问题。当有多个处理器(或核心、超线程)访问同一块内存时,必须确保它们在任何时候看到的都是相同的内容。如果缓存线在其中一个处理器上弄脏了(修改了,但还没写回主存),而第二个处理器刚好要读取同一个内存地址,那么这个读操作不能去读主存,而需要读第一个处理器的缓存线。在下一节中,我们将研究如何实现这种需求。

在此之前,还有其它两种缓存策略需要提一下:

这两种策略用于真实内存不支持的特殊地址区,内核为地址区设置这些策略(x86处理器利用内存类型范围寄存器MTRR),余下的部分自动进行。MTRR还可用于写通和写回策略的选择。

写入合并是一种有限的缓存优化策略,更多地用于显卡等设备之上的内存。由于设备的传输开销比本地内存要高的多,因此避免进行过多的传输显得尤为重要。如果仅仅因为修改了缓存线上的一个字,就传输整条线,而下个操作刚好是修改线上的下一个字,那么这次传输就过于浪费了。而这恰恰对于显卡来说是比较常见的情形——屏幕上水平邻接的像素往往在内存中也是靠在一起的。顾名思义,写入合并是在写出缓存线前,先将多个写入访问合并起来。在理想的情况下,缓存线被逐字逐字地修改,只有当写入最后一个字时,才将整条线写入内存,从而极大地加速内存的访问。

最后来讲一下不可缓存的内存。一般指的是不被RAM支持的内存位置,它可以是硬编码的特殊地址,承担CPU以外的某些功能。对于商用硬件来说,比较常见的是映射到外部卡或设备的地址。在嵌入式主板上,有时也有类似的地址,用来开关LED。对这些地址进行缓存显然没有什么意义。比如上述的LED,一般是用来调试或报告状态,显然应该尽快点亮或关闭。而对于那些PCI卡上的内存,由于不需要CPU的干涉即可更改,也不该缓存。

在上节中我们已经指出当多处理器开始发挥作用的时候所遇到的问题。甚至对于那些不共享的高速级别的缓存(至少在L1d级别)的多核处理器也有问题。

直接提供从一个处理器到另一处理器的高速访问,这是完全不切实际的。从一开始,连接速度根本就不够快。实际的选择是,在其需要的情况下,转移到其他处理器。需要注意的是,这同样应用在相同处理器上无需共享的高速缓存。

现在的问题是,当该高速缓存线转移的时候会发生什么?这个问题回答起来相当容易:当一个处理器需要在另一个处理器的高速缓存中读或者写的脏的高速缓存线的时候。但怎样处理器怎样确定在另一个处理器的缓存中的高速缓存线是脏的?假设它仅仅是因为一个高速缓存线被另一个处理器加载将是次优的(最好的)。通常情况下,大多数的内存访问是只读的访问和产生高速缓存线,并不脏。在高速缓存线上处理器频繁的操作(当然,否则为什么我们有这样的文件呢?),也就意味着每一次写访问后,都要广播关于高速缓存线的改变将变得不切实际。

多年来,人们开发除了MESI缓存一致性协议(MESI=Modified, Exclusive, Shared, Invalid,变更的、独占的、共享的、无效的)。协议的名称来自协议中缓存线可以进入的四种状态:

  • 变更的: 本地处理器修改了缓存线。同时暗示,它是所有缓存中唯一的拷贝。
  • 独占的: 缓存线没有被修改,而且没有被装入其它处理器缓存。
  • 共享的: 缓存线没有被修改,但可能已被装入其它处理器缓存。
  • 无效的: 缓存线无效,即,未被使用。

MESI协议开发了很多年,最初的版本比较简单,但是效率也比较差。现在的版本通过以上4个状态可以有效地实现写回式缓存,同时支持不同处理器对只读数据的并发访问。

在协议中,通过处理器监听其它处理器的活动,不需太多努力即可实现状态变更。处理器将操作发布在外部引脚上,使外部可以了解到处理过程。目标的缓存线地址则可以在地址总线上看到。在下文讲述状态时,我们将介绍总线参与的时机。

一开始,所有缓存线都是空的,缓存为无效(Invalid)状态。当有数据装进缓存供写入时,缓存变为变更(Modified)状态。如果有数据装进缓存供读取,那么新状态取决于其它处理器是否已经状态了同一条缓存线。如果是,那么新状态变成共享(Shared)状态,否则变成独占(Exclusive)状态。

如果本地处理器对某条Modified缓存线进行读写,那么直接使用缓存内容,状态保持不变。如果另一个处理器希望读它,那么第一个处理器将内容发给第一个处理器,然后可以将缓存状态置为Shared。而发给第二个处理器的数据由内存控制器接收,并放入内存中。如果这一步没有发生,就不能将这条线置为Shared。如果第二个处理器希望的是写,那么第一个处理器将内容发给它后,将缓存置为Invalid。这就是臭名昭著的”请求所有权(Request For Ownership,RFO)”操作。在末级缓存执行RFO操作的代价比较高。如果是写通式缓存,还要加上将内容写入上一层缓存或主存的时间,进一步提升了代价。 对于Shared缓存线,本地处理器的读取操作并不需要修改状态,而且可以直接从缓存满足。而本地处理器的写入操作则需要将状态置为Modified,而且需要将缓存线在其它处理器的所有拷贝置为Invalid。因此,这个写入操作需要通过RFO消息发通知其它处理器。如果第二个处理器请求读取,无事发生。因为主存已经包含了当前数据,而且状态已经为Shared。如果第二个处理器需要写入,则将缓存线置为Invalid。不需要总线操作。

在Exclusive状态时,本地写入操作不需要在总线上声明,因为本地的缓存是系统中唯一的拷贝。这是一个巨大的优势,所以处理器会尽量将缓存线保留在Exclusive状态,而不是Shared状态。只有在信息不可用时,才退而求其次选择shared。放弃Exclusive不会引起任何功能缺失,但会导致性能下降,因为E→M要远远快于S→M。

从以上的说明中应该已经可以看出,在多处理器环境下,哪一步的代价比较大了。填充缓存的代价当然还是很高,但我们还需要留意RFO消息。一旦涉及RFO,操作就快不起来了。

RFO在两种情况下是必需的:

  • 线程从一个处理器迁移到另一个处理器,需要将所有缓存线移到新处理器。
  • 某条缓存线确实需要被两个处理器使用。{对于同一处理器的两个核心,也有同样的情况,只是代价稍低。RFO消息可能会被发送多次。}

多线程或多进程的程序总是需要同步,而这种同步依赖内存来实现。因此,有些RFO消息是合理的,但仍然需要尽量降低发送频率。除此以外,还有其它来源的RFO。在第6节中,我们将解释这些场景。缓存一致性协议的消息必须发给系统中所有处理器。只有当协议确定已经给过所有处理器响应机会之后,才能进行状态跃迁。也就是说,协议的速度取决于最长响应时间。{这也是现在能看到三插槽AMD Opteron系统的原因。这类系统只有三个超级链路(hyperlink),其中一个连接南桥,每个处理器之间都只有一跳的距离。}总线上可能会发生冲突,NUMA系统的延时很大,突发的流量会拖慢通信。这些都是让我们避免无谓流量的充足理由。

此外,关于多处理器还有一个问题。虽然它的影响与具体机器密切相关,但根源是唯一的——FSB是共享的。在大多数情况下,所有处理器通过唯一的总线连接到内存控制器(参见图2.1)。如果一个处理器就能占满总线(十分常见),那么共享总线的两个或四个处理器显然只会得到更有限的带宽。

即使每个处理器有自己连接内存控制器的总线,如图2.2,但还需要通往内存模块的总线。一般情况下,这种总线只有一条。退一步说,即使像图2.2那样不止一条,对同一个内存模块的并发访问也会限制它的带宽。

对于每个处理器拥有本地内存的AMD模型来说,也是同样的问题。的确,所有处理器可以非常快速地同时访问它们自己的内存。但是,多线程呢?多进程呢?它们仍然需要通过访问同一块内存来进行同步。

对同步来说,有限的带宽严重地制约着并发度。程序需要更加谨慎的设计,将不同处理器访问同一块内存的机会降到最低。以下的测试展示了这一点,还展示了与多线程代码相关的其它效果。

为了帮助大家理解问题的严重性,我们来看一些曲线图,主角也是前文的那个程序。只不过这一次,我们运行多个线程,并测量这些线程中最快那个的运行时间。也就是说,等它们全部运行完是需要更长时间的。我们用的机器有4个处理器,而测试是做多跑4个线程。所有处理器共享同一条通往内存控制器的总线,另外,通往内存模块的总线也只有一条。


图3.19: 顺序读操作,多线程

图3.19展示了顺序读访问时的性能,元素为128字节长(64位计算机,NPAD=15)。对于单线程的曲线,我们预计是与图3.11相似,只不过是换了一台机器,所以实际的数字会有些小差别。

更重要的部分当然是多线程的环节。由于是只读,不会去修改内存,不会尝试同步。但即使不需要RFO,而且所有缓存线都可共享,性能仍然分别下降了18%(双线程)和34%(四线程)。由于不需要在处理器之间传输缓存,因此这里的性能下降完全由以下两个瓶颈之一或同时引起: 一是从处理器到内存控制器的共享总线,二是从内存控制器到内存模块的共享总线。当工作集超过L3后,三种情况下都要预取新元素,而即使是双线程,可用的带宽也无法满足线性扩展(无惩罚)。

当加入修改之后,场面更加难看了。图3.20展示了顺序递增测试的结果。


图3.20: 顺序递增,多线程

图中Y轴采用的是对数刻度,不要被看起来很小的差值欺骗了。现在,双线程的性能惩罚仍然是18%,但四线程的惩罚飙升到了93%!原因在于,采用四线程时,预取的流量与写回的流量加在一起,占满了整个总线。

我们用对数刻度来展示L1d范围的结果。可以发现,当超过一个线程后,L1d就无力了。单线程时,仅当工作集超过L1d时访问时间才会超过20个周期,而多线程时,即使在很小的工作集情况下,访问时间也达到了那个水平。

这里并没有揭示问题的另一方面,主要是用这个程序很难进行测量。问题是这样的,我们的测试程序修改了内存,所以本应看到RFO的影响,但在结果中,我们并没有在L2阶段看到更大的开销。原因在于,要看到RFO的影响,程序必须使用大量内存,而且所有线程必须同时访问同一块内存。如果没有大量的同步,这是很难实现的,而如果加入同步,则会占满执行时间。

最后,在图3.21中,我们展示了随机访问的Addnextlast测试的结果。这里主要是为了让大家感受一下这些巨大到爆的数字。极端情况下,甚至用了1500个周期才处理完一个元素。如果加入更多线程,真是不可想象哪。我们把多线程的效能总结了一下:

表3.3: 多线程的效能

这个表展示了图3.21中多线程运行大工作集时的效能。表中的数字表示测试程序在使用多线程处理大工作集时可能达到的最大加速因子。双线程和四线程的理论最大加速因子分别是2和4。从表中数据来看,双线程的结果还能接受,但四线程的结果表明,扩展到双线程以上是没有什么意义的,带来的收益可以忽略不计。只要我们把图3.21换个方式呈现,就可以很容易看清这一点。


图3.22: 通过并行化实现的加速因子

图3.22中的曲线展示了加速因子,即多线程相对于单线程所能获取的性能加成值。测量值的精确度有限,因此我们需要忽略比较小的那些数字。可以看到,在L2与L3范围内,多线程基本可以做到线性加速,双线程和四线程分别达到了2和4的加速因子。但是,一旦工作集的大小超出L3,曲线就崩塌了,双线程和四线程降到了基本相同的数值(参见表3.3中第4列)。也是部分由于这个原因,我们很少看到4CPU以上的主板共享同一个内存控制器。如果需要配置更多处理器,我们只能选择其它的实现方式(参见第5节)。

可惜,上图中的数据并不是普遍情况。在某些情况下,即使工作集能够放入末级缓存,也无法实现线性加速。实际上,这反而是正常的,因为普通的线程都有一定的耦合关系,不会像我们的测试程序这样完全独立。而反过来说,即使是很大的工作集,即使是两个以上的线程,也是可以通过并行化受益的,但是需要程序员的聪明才智。我们会在第6节进行一些介绍。

由CPU实现的超线程(有时又叫对称多线程,SMT)是一种比较特殊的情况,每个线程并不能真正并发地运行。它们共享着除寄存器外的绝大多数处理资源。每个核心和CPU仍然是并行工作的,但核心上的线程则受到这个限制。理论上,每个核心可以有大量线程,不过到目前为止,Intel的CPU最多只有两个线程。CPU负责对各线程进行时分复用,但这种复用本身并没有多少厉害。它真正的优势在于,CPU可以在当前运行的超线程发生延迟时,调度另一个线程。这种延迟一般由内存访问引起。

如果两个线程运行在一个超线程核心上,那么只有当两个线程合起来运行时间少于单线程运行时间时,效率才会比较高。我们可以将通常先后发生的内存访问叠合在一起,以实现这个目标。有一个简单的计算公式,可以帮助我们计算如果需要某个加速因子,最少需要多少的缓存命中率。

程序的执行时间可以通过一个只有一级缓存的简单模型来进行估算(参见[htimpact]):

缓冲未命中所用的周期数

为了让任何判读使用双线程,两个线程之中任一线程的执行时间最多为单线程指令的一半。两者都有一个唯一的变量缓存命中数。 如果我们要解决最小缓存命中率相等的问题需要使我们获得的线程的执行率不少于50%或更多,如图 3.23.

X轴表示单线程指令的缓存命中率Ghit,Y轴表示多线程指令所需的缓存命中率。这个值永远不能高于单线程命中率,否则,单线程指令也会使用改良的指令。为了使单线程的命中率在低于55%的所有情况下优于使用多线程,cup要或多或少的足够空闲因为缓存丢失会运行另外一个超线程。

绿色区域是我们的目标。如果线程的速度没有慢过50%,而每个线程的工作量只有原来的一半,那么它们合起来的耗时应该会少于单线程的耗时。对我们用的示例系统来说(使用超线程的P4机器),如果单线程代码的命中率为60%,那么多线程代码至少要达到10%才能获得收益。这个要求一般来说还是可以做到的。但是,如果单线程代码的命中率达到了95%,那么多线程代码要做到80%才行。这就很难了。而且,这里还涉及到超线程,在两个超线程的情况下,每个超线程只能分到一半的有效缓存。因为所有超线程是使用同一个缓存来装载数据的,如果两个超线程的工作集没有重叠,那么原始的95%也会被打对折——47%,远低于80%。

因此,超线程只在某些情况下才比较有用。单线程代码的缓存命中率必须低到一定程度,从而使缓存容量变小时新的命中率仍能满足要求。只有在这种情况下,超线程才是有意义的。在实践中,采用超线程能否获得更快的结果,取决于处理器能否有效地将每个进程的等待时间与其它进程的执行时间重叠在一起。并行化也需要一定的开销,需要加到总的运行时间里,这个开销往往是不能忽略的。

在6.3.4节中,我们会介绍一种技术,它将多个线程通过公用缓存紧密地耦合起来。这种技术适用于许多场合,前提是程序员们乐意花费时间和精力扩展自己的代码。

如果两个超线程执行完全不同的代码(两个线程就像被当成两个处理器,分别执行不同进程),那么缓存容量就真的会降为一半,导致缓冲未命中率大为攀升,这一点应该是很清楚的。这样的调度机制是很有问题的,除非你的缓存足够大。所以,除非程序的工作集设计得比较合理,能够确实从超线程获益,否则还是建议在BIOS中把超线程功能关掉。{我们可能会因为另一个原因 开启 超线程,那就是调试,因为SMT在查找并行代码的问题方面真的非常好用。}

我们已经介绍了地址的组成,即标签、集合索引和偏移三个部分。那么,实际会用到什么样的地址呢?目前,处理器一般都向进程提供虚拟地址空间,意味着我们有两种不同的地址: 虚拟地址和物理地址。

虚拟地址有个问题——并不唯一。随着时间的变化,虚拟地址可以变化,指向不同的物理地址。同一个地址在不同的进程里也可以表示不同的物理地址。那么,是不是用物理地址会比较好呢?

问题是,处理器指令用的虚拟地址,而且需要在内存管理单元(MMU)的协助下将它们翻译成物理地址。这并不是一个很小的操作。在执行指令的管线(pipeline)中,物理地址只能在很后面的阶段才能得到。这意味着,缓存逻辑需要在很短的时间里判断地址是否已被缓存过。而如果可以使用虚拟地址,缓存查找操作就可以更早地发生,一旦命中,就可以马上使用内存的内容。结果就是,使用虚拟内存后,可以让管线把更多内存访问的开销隐藏起来。

处理器的设计人员们现在使用虚拟地址来标记第一级缓存。这些缓存很小,很容易被清空。在进程页表树发生变更的情况下,至少是需要清空部分缓存的。如果处理器拥有指定变更地址范围的指令,那么可以避免缓存的完全刷新。由于一级缓存L1i及L1d的时延都很小(~3周期),基本上必须使用虚拟地址。

对于更大的缓存,包括L2和L3等,则需要以物理地址作为标签。因为这些缓存的时延比较大,虚拟到物理地址的映射可以在允许的时间里完成,而且由于主存时延的存在,重新填充这些缓存会消耗比较长的时间,刷新的代价比较昂贵。

一般来说,我们并不需要了解这些缓存处理地址的细节。我们不能更改它们,而那些可能影响性能的因素,要么是应该避免的,要么是有很高代价的。填满缓存是不好的行为,缓存线都落入同一个集合,也会让缓存早早地出问题。对于后一个问题,可以通过缓存虚拟地址来避免,但作为一个用户级程序,是不可能避免缓存物理地址的。我们唯一可以做的,是尽最大努力不要在同一个进程里用多个虚拟地址映射同一个物理地址。

另一个细节对程序员们来说比较乏味,那就是缓存的替换策略。大多数缓存会优先逐出最近最少使用(Least Recently Used,LRU)的元素。这往往是一个效果比较好的策略。在关联性很大的情况下(随着以后核心数的增加,关联性势必会变得越来越大),维护LRU列表变得越来越昂贵,于是我们开始看到其它的一些策略。

在缓存的替换策略方面,程序员可以做的事情不多。如果缓存使用物理地址作为标签,我们是无法找出虚拟地址与缓存集之间关联的。有可能会出现这样的情形: 所有逻辑页中的缓存线都映射到同一个缓存集,而其它大部分缓存却空闲着。即使有这种情况,也只能依靠OS进行合理安排,避免频繁出现。

虚拟化的出现使得这一切变得更加复杂。现在不仅操作系统可以控制物理内存的分配。虚拟机监视器(VMM,也称为 hypervisor)也负责分配内存。

对程序员来说,最好 a) 完全使用逻辑内存页面 b) 在有意义的情况下,使用尽可能大的页面大小来分散物理地址。更大的页面大小也有其他好处,不过这是另一个话题(见第4节)。

其实,不光处理器使用的数据被缓存,它们执行的指令也是被缓存的。只不过,指令缓存的问题相对来说要少得多,因为:

  • 执行的代码量取决于代码大小。而代码大小通常取决于问题复杂度。问题复杂度则是固定的。
  • 程序的数据处理逻辑是程序员设计的,而程序的指令却是编译器生成的。编译器的作者知道如何生成优良的代码。
  • 程序的流向比数据访问模式更容易预测。现如今的CPU很擅长模式检测,对预取很有利。
  • 代码永远都有良好的时间局部性和空间局部性。

有一些准则是需要程序员们遵守的,但大都是关于如何使用工具的,我们会在第6节介绍它们。而在这里我们只介绍一下指令缓存的技术细节。

随着CPU的核心频率大幅上升,缓存与核心的速度差越拉越大,CPU的处理开始管线化。也就是说,指令的执行分成若干阶段。首先,对指令进行解码,随后,准备参数,最后,执行它。这样的管线可以很长(例如,Intel的Netburst架构超过了20个阶段)。在管线很长的情况下,一旦发生延误(即指令流中断),需要很长时间才能恢复速度。管线延误发生在这样的情况下: 下一条指令未能正确预测,或者装载下一条指令耗时过长(例如,需要从内存读取时)。

为了解决这个问题,CPU的设计人员们在分支预测上投入大量时间和芯片资产(chip real estate),以降低管线延误的出现频率。

在CISC处理器上,指令的解码阶段也需要一些时间。x86及x86-64处理器尤为严重。近年来,这些处理器不再将指令的原始字节序列存入L1i,而是缓存解码后的版本。这样的L1i被叫做“追踪缓存(trace cache)”。追踪缓存可以在命中的情况下让处理器跳过管线最初的几个阶段,在管线发生延误时尤其有用。

前面说过,L2以上的缓存是统一缓存,既保存代码,也保存数据。显然,这里保存的代码是原始字节序列,而不是解码后的形式。

在提高性能方面,与指令缓存相关的只有很少的几条准则:

  1. 生成尽量少的代码。也有一些例外,如出于管线化的目的需要更多的代码,或使用小代码会带来过高的额外开销。
  2. 尽量帮助处理器作出良好的预取决策,可以通过代码布局或显式预取来实现。

这些准则一般会由编译器的代码生成阶段强制执行。至于程序员可以参与的部分,我们会在第6节介绍。

在计算机的早期岁月里,内存十分昂贵。人们想尽千方百计,只为了尽量压缩程序容量,给数据多留一些空间。其中,有一种方法是修改程序自身,称为自修改代码(SMC)。现在,有时候我们还能看到它,一般是出于提高性能的目的,也有的是为了攻击安全漏洞。

一般情况下,应该避免SMC。虽然一般情况下没有问题,但有时会由于执行错误而出现性能问题。显然,发生改变的代码是无法放入追踪缓存(追踪缓存放的是解码后的指令)的。即使没有使用追踪缓存(代码还没被执行或有段时间没执行),处理器也可能会遇到问题。如果某个进入管线的指令发生了变化,处理器只能扔掉目前的成果,重新开始。在某些情况下,甚至需要丢弃处理器的大部分状态。

最后,由于处理器认为代码页是不可修改的(这是出于简单化的考虑,而且在99.9999999%情况下确实是正确的),L1i用到并不是MESI协议,而是一种简化后的SI协议。这样一来,如果万一检测到修改的情况,就需要作出大量悲观的假设。

因此,对于SMC,强烈建议能不用就不用。现在内存已经不再是一种那么稀缺的资源了。最好是写多个函数,而不要根据需要把一个函数改来改去。也许有一天可以把SMC变成可选项,我们就能通过这种方式检测入侵代码。如果一定要用SMC,应该让写操作越过缓存,以免由于L1i需要L1d里的数据而产生问题。更多细节,请参见6.1节。

在Linux上,判断程序是否包含SMC是很容易的。利用正常工具链(toolchain)构建的程序代码都是写保护(write-protected)的。程序员需要在链接时施展某些关键的魔术才能生成可写的代码页。现代的Intel x86和x86-64处理器都有统计SMC使用情况的专用计数器。通过这些计数器,我们可以很容易判断程序是否包含SMC,即使它被准许运行。

3.5 缓存未命中的因素

我们已经看过内存访问没有命中缓存时,那陡然猛涨的高昂代价。但是有时候,这种情况又是无法避免的,因此我们需要对真正的代价有所认识,并学习如何缓解这种局面。

3.5.1 缓存与内存带宽

为了更好地理解处理器的能力,我们测量了各种理想环境下能够达到的带宽值。由于不同处理器的版本差别很大,所以这个测试比较有趣,也因为如此,这一节都快被测试数据灌满了。我们使用了x86和x86-64处理器的SSE指令来装载和存储数据,每次16字节。工作集则与其它测试一样,从1kB增加到512MB,测量的具体对象是每个周期所处理的字节数。

Netburst处理器的性能图表。当工作集能够完全放入L1d时,处理器的每个周期可以读取完整的16字节数据,即每个周期执行一条装载指令(moveaps指令,每次移动16字节的数据)。测试程序并不对数据进行任何处理,只是测试读取指令本身。当工作集增大,无法再完全放入L1d时,性能开始急剧下降,跌至每周期6字节。在218工作集处出现的台阶是由于DTLB缓存耗尽,因此需要对每个新页施加额外处理。由于这里的读取是按顺序的,预取机制可以完美地工作,而FSB能以5.3字节/周期的速度传输内容。但预取的数据并不进入L1d。当然,真实世界的程序永远无法达到以上的数字,但我们可以将它们看作一系列实际上的极限值。

更令人惊讶的是写操作和复制操作的性能。即使是在很小的工作集下,写操作也始终无法达到4字节/周期的速度。这意味着,Intel为Netburst处理器的L1d选择了写通(write-through)模式,所以写入性能受到L2速度的限制。同时,这也意味着,复制测试的性能不会比写入测试差太多(复制测试是将某块内存的数据拷贝到另一块不重叠的内存区),因为读操作很快,可以与写操作实现部分重叠。最值得关注的地方是,两个操作在工作集无法完全放入L2后出现了严重的性能滑坡,降到了0.5字节/周期!比读操作慢了10倍!显然,如果要提高程序性能,优化这两个操作更为重要。

再来看图3.25,它来自同一颗处理器,只是运行双线程,每个线程分别运行在处理器的一个超线程上。


图3.25: P4开启两个超线程时的带宽表现

图3.25采用了与图3.24相同的刻度,以方便比较两者的差异。图3.25中的曲线抖动更多,是由于采用双线程的缘故。结果正如我们预期,由于超线程共享着几乎所有资源(仅除寄存器外),所以每个超线程只能得到一半的缓存和带宽。所以,即使每个线程都要花上许多时间等待内存,从而把执行时间让给另一个线程,也是无济于事——因为另一个线程也同样需要等待。这里恰恰展示了使用超线程时可能出现的最坏情况。

再来看Core 2处理器的情况。看看图3.26和图3.27,再对比下P4的图3.24和3.25,可以看出不小的差异。Core 2是一颗双核处理器,有着共享的L2,容量是P4 L2的4倍。但更大的L2只能解释写操作的性能下降出现较晚的现象。

当然还有更大的不同。可以看到,读操作的性能在整个工作集范围内一直稳定在16字节/周期左右,在220处的下降同样是由于DTLB的耗尽引起。能够达到这么高的数字,不但表明处理器能够预取数据,并且按时完成传输,而且还意味着,预取的数据是被装入L1d的。

写/复制操作的性能与P4相比,也有很大差异。处理器没有采用写通策略,写入的数据留在L1d中,只在必要时才逐出。这使得写操作的速度可以逼近16字节/周期。一旦工作集超过L1d,性能即飞速下降。由于Core 2读操作的性能非常好,所以两者的差值显得特别大。当工作集超过L2时,两者的差值甚至超过20倍!但这并不表示Core 2的性能不好,相反,Core 2永远都比Netburst强。

在图3.27中,启动双线程,各自运行在Core 2的一个核心上。它们访问相同的内存,但不需要完美同步。从结果上看,读操作的性能与单线程并无区别,只是多了一些多线程情况下常见的抖动。

有趣的地方来了——当工作集小于L1d时,写操作与复制操作的性能很差,就好像数据需要从内存读取一样。两个线程彼此竞争着同一个内存位置,于是不得不频频发送RFO消息。问题的根源在于,虽然两个核心共享着L2,但无法以L2的速度处理RFO请求。而当工作集超过L1d后,性能出现了迅猛提升。这是因为,由于L1d容量不足,于是将被修改的条目刷新到共享的L2。由于L1d的未命中可以由L2满足,只有那些尚未刷新的数据才需要RFO,所以出现了这样的现象。这也是这些工作集情况下速度下降一半的原因。这种渐进式的行为也与我们期待的一致: 由于每个核心共享着同一条FSB,每个核心只能得到一半的FSB带宽,因此对于较大的工作集来说,每个线程的性能大致相当于单线程时的一半。

由于同一个厂商的不同处理器之间都存在着巨大差异,我们没有理由不去研究一下其它厂商处理器的性能。图3.28展示了AMD家族10h Opteron处理器的性能。这颗处理器有64kB的L1d、512kB的L2和2MB的L3,其中L3缓存由所有核心所共享。

大家首先应该会注意到,在L1d缓存足够的情况下,这个处理器每个周期能处理两条指令。读操作的性能超过了32字节/周期,写操作也达到了18.7字节/周期。但是,不久,读操作的曲线就急速下降,跌到2.3字节/周期,非常差。处理器在这个测试中并没有预取数据,或者说,没有有效地预取数据。

另一方面,写操作的曲线随几级缓存的容量而流转。在L1d阶段达到最高性能,随后在L2阶段下降到6字节/周期,在L3阶段进一步下降到2.8字节/周期,最后,在工作集超过L3后,降到0.5字节/周期。它在L1d阶段超过了Core 2,在L2阶段基本相当(Core 2的L2更大一些),在L3及主存阶段比Core 2慢。

复制的性能既无法超越读操作的性能,也无法超越写操作的性能。因此,它的曲线先是被读性能压制,随后又被写性能压制。

图3.29显示的是Opteron处理器在多线程时的性能表现。

读操作的性能没有受到很大的影响。每个线程的L1d和L2表现与单线程下相仿,L3的预取也依然表现不佳。两个线程并没有过渡争抢L3。问题比较大的是写操作的性能。两个线程共享的所有数据都需要经过L3,而这种共享看起来却效率很差。即使是在L3足够容纳整个工作集的情况下,所需要的开销仍然远高于L3的访问时间。再来看图3.27,可以发现,在一定的工作集范围内,Core 2处理器能以共享的L2缓存的速度进行处理。而Opteron处理器只能在很小的一个范围内实现相似的性能,而且,它仅仅只能达到L3的速度,无法与Core 2的L2相比。

内存以比缓存线还小的块从主存储器向缓存传送。如今64位可一次性传送,缓存线的大小为64或128比特。这意味着每个缓存线需要8或16次传送。

DRAM芯片可以以触发模式传送这些64位的块。这使得不需要内存控制器的进一步指令和可能伴随的延迟,就可以将缓存线充满。如果处理器预取了缓存,这有可能是最好的操作方式。

如果程序在访问数据或指令缓存时没有命中(这可能是强制性未命中或容量性未命中,前者是由于数据第一次被使用,后者是由于容量限制而将缓存线逐出),情况就不一样了。程序需要的并不总是缓存线中的第一个字,而数据块的到达是有先后顺序的,即使是在突发模式和双倍传输率下,也会有明显的时间差,一半在4个CPU周期以上。举例来说,如果程序需要缓存线中的第8个字,那么在首字抵达后它还需要额外等待30个周期以上。

当然,这样的等待并不是必需的。事实上,内存控制器可以按不同顺序去请求缓存线中的字。当处理器告诉它,程序需要缓存中具体某个字,即「关键字(critical word)」时,内存控制器就会先请求这个字。一旦请求的字抵达,虽然缓存线的剩余部分还在传输中,缓存的状态还没有达成一致,但程序已经可以继续运行。这种技术叫做关键字优先及较早重启(Critical Word First & Early

现在的处理器都已经实现了这一技术,但有时无法运用。比如,预取操作的时候,并不知道哪个是关键字。如果在预取的中途请求某条缓存线,处理器只能等待,并不能更改请求的顺序。


图3.30: 关键字位于缓存线尾时的表现

在关键字优先技术生效的情况下,关键字的位置也会影响结果。图3.30展示了下一个测试的结果,图中表示的是关键字分别在线首和线尾时的性能对比情况。元素大小为64字节,等于缓存线的长度。图中的噪声比较多,但仍然可以看出,当工作集超过L2后,关键字处于线尾情况下的性能要比线首情况下低0.7%左右。而顺序访问时受到的影响更大一些。这与我们前面提到的预取下条线时可能遇到的问题是相符的。

缓存放置的位置与超线程,内核和处理器之间的关系,不在程序员的控制范围之内。但是程序员可以决定线程执行的位置,接着高速缓存与使用的CPU的关系将变得非常重要。

这里我们将不会深入(探讨)什么时候选择什么样的内核以运行线程的细节。我们仅仅描述了在设置关联线程的时候,程序员需要考虑的系统结构的细节。

超线程,通过定义,共享除去寄存器集以外的所有数据。包括 L1 缓存。这里没有什么可以多说的。多核处理器的独立核心带来了一些乐趣。每个核心都至少拥有自己的 L1 缓存。除此之外,下面列出了一些不同的特性:

  • 早期多核心处理器有独立的 L2 缓存且没有更高层级的缓存。
  • 之后英特尔的双核心处理器模型拥有共享的L2 缓存。对四核处理器,则分对拥有独立的L2 缓存,且没有更高层级的缓存。
  • AMD 家族的 10h 处理器有独立的 L2 缓存以及一个统一的L3 缓存。

关于各种处理器模型的优点,已经在它们各自的宣传手册里写得够多了。在每个核心的工作集互不重叠的情况下,独立的L2拥有一定的优势,单线程的程序可以表现优良。考虑到目前实际环境中仍然存在大量类似的情况,这种方法的表现并不会太差。不过,不管怎样,我们总会遇到工作集重叠的情况。如果每个缓存都保存着某些通用运行库的常用部分,那么很显然是一种浪费。

如果像Intel的双核处理器那样,共享除L1外的所有缓存,则会有一个很大的优点。如果两个核心的工作集重叠的部分较多,那么综合起来的可用缓存容量会变大,从而允许容纳更大的工作集而不导致性能的下降。如果两者的工作集并不重叠,那么则是由Intel的高级智能缓存管理(Advanced Smart Cache management)发挥功用,防止其中一个核心垄断整个缓存。

即使每个核心只使用一半的缓存,也会有一些摩擦。缓存需要不断衡量每个核心的用量,在进行逐出操作时可能会作出一些比较差的决定。我们来看另一个测试程序的结果。


图3.31: 两个进程的带宽表现

这次,测试程序两个进程,第一个进程不断用SSE指令读/写2MB的内存数据块,选择2MB,是因为它正好是Core 2处理器L2缓存的一半,第二个进程则是读/写大小变化的内存区域,我们把这两个进程分别固定在处理器的两个核心上。图中显示的是每个周期读/写的字节数,共有4条曲线,分别表示不同的读写搭配情况。例如,标记为读/写(read/write)的曲线代表的是后台进程进行写操作(固定2MB工作集),而被测量进程进行读操作(工作集从小到大)。

图中最有趣的是220到223之间的部分。如果两个核心的L2是完全独立的,那么所有4种情况下的性能下降均应发生在221到222之间,也就是L2缓存耗尽的时候。但从图上来看,实际情况并不是这样,特别是背景进程进行写操作时尤为明显。当工作集达到1MB(220)时,性能即出现恶化,两个进程并没有共享内存,因此并不会产生RFO消息。所以,完全是缓存逐出操作引起的问题。目前这种智能的缓存处理机制有一个问题,每个核心能实际用到的缓存更接近1MB,而不是理论上的2MB。如果未来的处理器仍然保留这种多核共享缓存模式的话,我们唯有希望厂商会把这个问题解决掉。

推出拥有双L2缓存的4核处理器仅仅只是一种临时措施,是开发更高级缓存之前的替代方案。与独立插槽及双核处理器相比,这种设计并没有带来多少性能提升。两个核心是通过同一条总线(被外界看作FSB)进行通信,并没有什么特别快的数据交换通道。

未来,针对多核处理器的缓存将会包含更多层次。AMD的10h家族是一个开始,至于会不会有更低级共享缓存的出现,还需要我们拭目以待。我们有必要引入更多级别的缓存,因为频繁使用的高速缓存不可能被许多核心共用,否则会对性能造成很大的影响。我们也需要更大的高关联性缓存,它们的数量、容量和关联性都应该随着共享核心数的增长而增长。巨大的L3和适度的L2应该是一种比较合理的选择。L3虽然速度较慢,但也较少使用。

对于程序员来说,不同的缓存设计就意味着调度决策时的复杂性。为了达到最高的性能,我们必须掌握工作负载的情况,必须了解机器架构的细节。好在我们在判断机器架构时还是有一些支援力量的,我们会在后面的章节介绍这些接口。

FSB在性能中扮演了核心角色。缓存数据的存取速度受制于内存通道的速度。我们做一个测试,在两台机器上分别跑同一个程序,这两台机器除了内存模块的速度有所差异,其它完全相同。图3.32展示了Addnext0测试(将下一个元素的pad[0]加到当前元素的pad[0]上)在这两台机器上的结果(NPAD=7,64位机器)。两台机器都采用Core 2处理器,一台使用667MHz的DDR2内存,另一台使用800MHz的DDR2内存(比前一台增长20%)。

图上的数字表明,当工作集大到对FSB造成压力的程度时,高速FSB确实会带来巨大的优势。在我们的测试中,性能的提升达到了18.5%,接近理论上的极限。而当工作集比较小,可以完全纳入缓存时,FSB的作用并不大。当然,这里我们只测试了一个程序的情况,在实际环境中,系统往往运行多个进程,工作集是很容易超过缓存容量的。

如今,一些英特尔的处理器,支持前端总线(FSB)的速度高达1,333 MHz,这意味着速度有另外60%的提升。将来还会出现更高的速度。速度是很重要的,工作集会更大,快速的RAM和高FSB速度的内存肯定是值得投资的。我们必须小心使用它,因为即使处理器可以支持更高的前端总线速度,但是主板的北桥芯片可能不会。使用时,检查它的规范是至关重要的。

}
  1。CPU即中央处理器,是英语“Central Processing Unit”的缩写。CPU从内存或缓存中取出指令,放入指令寄存器,并对指令译码分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行。
2。但是,CPU并不能直接调用存储在硬盘上的系统、程序和数据,必须首先将硬盘的有关内容存储在内存中,这样才能被CPU读取运行。因而,内存(即物理内存,是相对于硬盘这个“外存”而言)作为硬盘和CPU的“中转站”,对电脑运行速度有较大影响。 3。当运行数据超出物理内存容纳限度的时候,部分数据就会自行“溢出”,这时系统就会将硬盘上的部分空间模拟成内存——,并将暂时不运行的程序或不使用的数据存放到这部分空间之中,等待需要的时候方便及时调用。 4。由于内存是带电存储的(一旦断电数据就会消失),而且容量有限,所以要长时间储存程序或数据就需要使用硬盘()。硬盘也会影响系统速度,因为系统从硬盘中读取数据并通过总线存入内存的速度也会影响系统运行的快慢。 5。缓存是CPU的一部分,它存在于CPU中 CPU存取数据的速度非常的快,一秒钟能够存取、处理十亿条指令和数据而内存就慢很多,快的内存能够达到几十兆就不错了,可见两者的速度差异是多么的大 缓存是为了解决CPU速度和内存速度的速度差异问题 内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中 去取就行了,而缓存的速度要比内存快很多
缓存(ram: random-access memory):
一级L1缓存,SRAM(static ram)--cpu与内存交换数据的地方,速度最快
二级L2缓存,DRAM(Dynamic ram)-- L1缓存与内存交换数据的地方,速度比L1慢,但也远远大于内存速度(L3缓存也远远大于内存速度)
(物理)内存+缓存 = 内存储器 硬盘 是外存储器
文章: /bpssy/article/details/
下面是百度百科的解释,挺不错的
/link?url=_vLMH-czSHHS3yseZ33J3PuY6pMRf4LJKUzpSFxH5DpRH0mNIo0Yc9LgMsh60spxKxqznnKLWJeaSugFMxkkSK

缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。

(断电即掉的非永久储存),所以在用完后还是会把文件送到

里永久存储。电脑里最大的缓存就是

上镶的L1和L2缓存,

的显存是给显卡运算芯片用的缓存,

上也有16M或者32M的缓存。

的容量和结构对CPU的性能影响较大,不过

均由静态RAM组成,结构较复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做得太大。一般L1缓存的容量通常在32—256KB。L2 Cache(

,分内部和外部两种芯片。内部的芯片

相同,而外部的二级缓存则只有主频的一半。L2

容量也会影响CPU的性能,原则是越大越好,普通

CPU的L2缓存一般为128KB到2MB或者更高,笔记本、

的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到

就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。随着时间的变化,被访问得最频繁的

不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的

,又不频繁了,所以说缓存中的数据要经常按照一定的

来更换,这样才能保证缓存中的数据是被访问最频繁的。

缓存的工作原理是当CPU要读取一个

时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理;没有找到,就从速率相对较慢的

中读取并送给CPU处理,同时把这个

调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的

90%都在CPU缓存中,只有大约10%需要从

读取。这大大节省了CPU直接读取

的时间,也使CPU读取

时基本无需等待。总的来说,CPU读取

要比后者快得多,使用的

一般都是动态RAM。为了增加系统的

,把缓存扩大就行了,扩的越大,缓存的

越多,系统就越快了,缓存通常都是静态RAM,速率是非常的快, 但是静态RAM

度低(存储相同的数据,静态RAM的

是动态RAM的6倍), 价格高(同容量的静态RAM是动态RAM的四倍), 由此可见,扩大静态RAM作为缓存是一个非常愚蠢的行为, 但是为了提高系统的性能和速率,必须要扩大缓存, 这样就有了一个折中的方法,不扩大原来的静态RAM缓存,而是增加一些高速动态RAM做为缓存, 这些高速动态RAM速率要比常规动态RAM快,但比原来的静态RAM缓存慢, 把原来的静态RAM缓存叫

,而把后来增加的动态RAM叫

受到CPU指令控制开始读取

的下一个或者几个簇中的数据读到缓存中(由于硬盘上数据存储时是比较连续的,所以读取命中率较高),当需要读取下一个或者几个簇中的数据的时候,硬盘则不需要再次读取数据,直接把缓存中的数据传输到

中就可以了,由于缓存的

远远高于磁头读写的速率,所以能够达到明显改善性能的目的。

的指令之后,并不会马上将数据写入到

 先暂时存储在缓存里,然后发送一个“数据已写入”的

给系统,这时系统就会认为数据已经写入,并继续执行下面的工作,而硬盘则在空闲(不进行读取或写入的时候)时再将缓存中的数据写入到盘片上。虽然对于写入

的性能有一定提升,但也不可避免地带来了

——数据还在缓存里的时候突然掉电,那么这些数据就会丢失。对于这个问题,

厂商们自然也有解决办法:掉电时,

以外的暂存区域,等到下次启动时再将这些数据写入目的地。

是会经常需要访问的,像

内部的缓存(暂存器的一种)会将读取比较频繁的一些数据存储在缓存中,再次读取时就可以直接从缓存中直接传输。缓存就像是一台计算机的内存一样,在硬盘读写数据时,负责数据的存储、寄放等功能。这样一来,不仅可以大大减少数据读写的时间以提高硬盘的使用效率。同时利用缓存还可以让硬盘减少频繁的读写,让硬盘更加安静,更加省电。更大的硬盘缓存,你将读取游戏时更快,拷贝文件时候更快,在系统启动中更为领先。[1]

、不同型号的产品各不相同,早期的

基本都很小,只有几百KB,已无法满足用户的需求。16MB和32MB缓存是现今主流

或特殊应用领域中还有缓存容量更大的产品,甚至达到了64MB、128MB等。大容量的缓存虽然可以在

进行读写工作状态下,让更多的

在缓存中,以提高硬盘的访问

,但并不意味着缓存越大就越出众。缓存的应用存在一个算法的问题,即便缓存容量很大,而没有一个高效率的算法,那将导致应用中缓存

的命中率偏低,无法有效发挥出大容量缓存的优势。算法是和缓存容量

,大容量的缓存需要更为有效率的算法,否则性能会大大折扣,从技术角度上说,高容量缓存的算法是直接影响到

性能发挥的重要因素。更大容量缓存是未来

是个整体的,而且容量很低,英特尔公司从Pentium时代开始把缓存进行了分类。当时

在CPU内核中的缓存已不足以满足CPU的需求,而

上的限制又不能大幅度提高缓存的容量。因此出现了

上或主板上的缓存,此时就把 CPU内核集成的缓存称为

的指令,而且两者可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。英特尔公司在推出Pentium 4处理器时,用新增的一种一级

替代指令缓存,容量为12KμOps,表示能存储12K条微指令。

在CPU内核中,容量也在逐年提升。再用

在CPU内部与否来定义一、

的情况也被改变,此时其以相同于

工作,可以为CPU提供更高的传输

是CPU性能表现的关键之一,在CPU核心不变化的情况下,增加二级缓存

能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在

上有差异,由此可见二级缓存对于CPU的重要性。

CPU在缓存中找到有用的

,当缓存中没有CPU所需的数据时(这时称为未命中),CPU才访问

。从理论上讲,在一颗拥有

的命中率为80%。也就是说

总量的80%,剩下的20%从

中读取。由于不能准确预测将要执行的

的命中率也在80%左右(从二级缓存读到有用的

占总数据的16%)。那么还有的

调用,但这已经是一个相当小的比例了。较高端的CPU中,还会带有

设计的—种缓存,在拥有三级缓存的CPU中,只有约3%的

中调用,这进一步提高了CPU的效率。为了保证CPU访问时有较高的命中率,缓存中的内容应该按一定的

替换。一种较常用的算法是“最近最少使用算法”(LRU算

),它是将最近一段时间内最少被访问过的行淘汰出局。因此需要为每行设置一个

,LRU算法是把命中行的计数器清零,其他各行计数器加1。当需要替换时淘汰行计数器计数值最大的

行出局。这是一种高效、科学的算法,其计数器清零过程可以把一些频繁调用后再不需要的

淘汰出缓存,提高缓存的利用率。CPU产品中,

的容量基本在4KB到64KB之间,

容量各产品之间相差不大,而

则是提高CPU性能的关键。

的提升是由CPU制造工艺所决定的,容量增大必然导致CPU内部

数的增加,要在有限的CPU面积上

更大的缓存,对制造工艺的要求也就越高。主流的

都在2MB左右,其中英特尔公司07年相继推出了

用的4MB、6MB二级缓存的高性能CPU,不过价格也是相对比较高的,对于对配置要求不是太高的朋友,一般的2MB二级缓存的

基本也可以满足日常上网需要了。

缓存工作的原则,就是“引用的局部性”,这可以分为时间局部性和空间局部性。空间局部性是指CPU在某一时刻需要某个

,那么很可能下一步就需要其附近的数据;时间局部性是指当某个数据被访问过一次之后,过不了多久时间就会被再一次访问。对于

都会出现引用的局部性现象。

举个简单的例子,比如在播放DVD影片的时候,DVD

组成,这个时候CPU会依次从头处理到尾地调用DVD数据,如果CPU这次读取DVD数据为1分30秒,那么下次读取的时候就会从1分31秒开始,因此这种情况下有序排列的数据都是依次被读入CPU进行处理。从

上来看,对于Word一类的应用程序通常都有着较好的空间局部性。用户在使用中不会一次打开7、8个文档,不会在其中某一个文档中打上几个词就换另一个。大多数用户都是打开一两个文档,然后就是长时间对它们进行处理而不会做其他事情。这样在

都会集中在一个区域中,也就可以被CPU集中处理。

从程序代码上来考虑,设计者通常也会尽量避免出现程序的跳跃和分支,让CPU可以不中断地处理大块连续

处理程序通常都是这方面的代表,以小段代码连续处理大块

。不过在办公运用程序中,情况就不一样了。改动

,都需要程序代码不同部分起作用,而用到的指令通常都不会在一个连续的区域中。于是CPU就不得不在

中不断跳来跳去寻找需要的代码。这也就意味着对于办公程序而言,需要较大的缓存来读入大多数经常使用的代码,把它们放在一个连续的区域中。如果缓存不够,就需要缓存中的

,而如果缓存足够大的话,所有的代码都可以放入,也就可以获得最高的效率。同理,高端的

应用以及游戏应用则需要更高容量的缓存。

,它的容量比内存小的多但是交换

却比内存要快得多。缓存的出现主要是为了解决CPU运算速率与内存读写速率不匹配的矛盾,因为CPU运算速率要比

读写速率快很多,这样会使CPU花费很长时间等待

到来或把数据写入内存。在缓存中的

是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取

。由此可见,在CPU中加入缓存是一种高效的解决方案,这样整个

(缓存+内存)就变成了既有缓存的高

了。缓存对CPU的性能影响很大,主要是因为CPU的

交换顺序和CPU与缓存间的

,SRAM是英文Static RAM的缩写,它是一种具有静态存取功能的存储器,不需要刷新电路即能保存它内部存储的

那样需要刷新电路,每隔一段时间,固定要对DRAM刷新充电一次,否则内部的

即会消失,因此SRAM具有较高的性能,但是SRAM也有它的缺点,即它的

度较低,相同容量的DRAM内存可以设计为较小的

,但是SRAM却需要很大的体积,这也是不能将缓存容量做得太大的重要原因。它的特点归纳如下:优点是节能、

电路、可提高整体的工作效率,缺点是

较大、而且价格较高,只能少量用于关键性系统以提高效率。

CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理;如果没有找到,就用相对慢的速度从

中读取并送给CPU处理,同时把这个数据所在的

调入Cache中,可以使得以后对整块数据的读取都从Cache中进行,不必再调用内存。

正是这样的读取机制使CPU读取Cache的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的

90%都在Cache中,只有大约10%需要从内存读取。这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。总的来说,CPU读取数据的顺序是先Cache后

L1和二级高速缓存L2。在以往的观念中,L1 Cache是

在CPU中的,被称为片内Cache。在L1中还分

Cache(D-Cache)和指令Cache(I-Cache)。它们分别用来存放数据和执行这些数据的指令,而且两个Cache可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。

CPU在Cache中找到有用的数据被称为命中,当Cache中没有CPU所需的数据时(这时称为未命中),CPU才访问内存。从理论上讲,在一颗拥有2级Cache的CPU中,读取L1 Cache的命中率为80%。也就是说CPU从L1 Cache中找到的有用数据占数据总量的80%,剩下的20%从L2 Cache读取。由于不能准确预测将要执行的

,读取L2的命中率也在80%左右(从L2读到有用的数据占总数据的16%)。那么还有的数据就不得不从内存调用,但这已经是一个相当小的比例了。在一些高端领域的CPU(像Intel的Itanium)中,我们常听到L3 Cache,它是为读取L2 Cache后未命中的数据设计的—种Cache,在拥有L3 Cache的CPU中,只有约5%的数据需要从内存中调用,这进一步提高了CPU的效率。

(Level 1 Cache)简称L1 Cache,位于CPU内核的旁边,是与CPU结合最为紧密的CPU缓存,也是历史上最早出现的CPU缓存。由于

的技术难度和制造成本最高,提高容量所带来的技术难度增加和成本增加非常大,所带来的性能提升却不明显,性价比很低,而且现有的一级缓存的命中率已经很高,所以一级缓存是所有缓存中容量最小的,比

以及对执行这些数据的指令进行即时解码,而且两者可以同时被CPU访问,减少了争用Cache所造成的冲突,提高了处理器效能。大多数CPU的一级

和一级指令缓存具有相同的容量,例如

的Athlon XP就具有64KB的一级数据缓存和64KB的一级指令缓存,其

就以64KB+64KB来表示,其余的CPU的一级缓存表示方法以此类推。

的采用NetBurst架构的CPU(最典型的就是

有点特殊,使用了新增加的一种一级追踪缓存(Execution Trace Cache,T-Cache或ETC)来替代一级指令缓存,容量为12KμOps,表示能存储12K条即12000条解码后的

。一级追踪缓存与一级指令缓存的运行机制是不相同的,一级指令缓存只是对指令作即时的解码而并不会储存这些指令,而一级追踪缓存同样会将一些指令作解码,这些指令称为微指令(micro-ops),而这些微指令能储存在一级追踪缓存之内,无需每一次都作出

的程序,因此一级追踪缓存能有效地增加在高工作频率下对指令的解码能力,而μOps就是micro-ops,也就是微型操作的意思。它以很高的

。Intel NetBurst微型架构使用执行跟踪缓存,将

从执行循环中分离出来。这个跟踪缓存以很高的带宽将uops提供给核心,从本质上适于充分利用

中的指令级并行机制。Intel并没有公布一级追踪缓存的实际容量,只知道一级追踪缓存能储存12000条微指令(micro-ops)。所以,不能简单地用微指令的数目来比较指令缓存的大小。实际上,单核心的NetBurst架构CPU使用8Kμops的缓存已经基本上够用了,多出的4kμops可以大大提高

技术的话,12KμOps就会有些不够用,这就是为什么有时候Intel处理器在使用超线程技术时会导致性能下降的重要原因。例如

为8KB+12KμOps,就表示其一级数据缓存为8KB,一级追踪缓存为12KμOps;而Prescott核心的一级缓存为16KB+12KμOps,就表示其一级数据缓存为16KB,一级追踪缓存为12KμOps。在这里12KμOps绝对不等于12KB,单位都不同,一个是μOps,一个是Byte(字节),而且二者的运行机制完全不同。所以那些把Intel的CPU

简单相加,例如把Northwood核心说成是20KB一级缓存,把Prescott核心说成是28KB一级缓存,并且据此认为

的一级缓存容量远远低于

的看法是完全错误的,二者不具有可比性。在架构有一定区别的CPU对比中,很多缓存已经难以找到对应的东西,即使类似名称的缓存在设计思路和功能定义上也有区别了,此时不能用简单的算术加法来进行对比;而在架构极为近似的CPU对比中,分别对比各种功能缓存大小才有一定的意义。

(Level2cache),它是处理器内部的一些缓冲

一样。上溯到上个世纪80年代,由于

越来越快,慢慢地,处理器需要从

的速率需求就越来越高了。然而

的内存价格又非常高昂,不能大量采用。从性能价格比的角度出发,英特尔等处理器设计生产公司想到一个办法,就是用少量的高速

和大量的低速内存结合使用,共同为处理器提供

。这样就兼顾了性能和使用成本的最优。而那些高速的

和内存之间的位置,又是临时存放

了,简称“缓存”。它的作用就像仓库中临时堆放货物的地方一样,货物从运输车辆上放下时临时堆放在缓存区中,然后再搬到内部存储区中长时间存放。货物在这段区域中存放的时间很短,就是一个临时货场。 最初缓存只有一级,后来处理器

不够用了,于是就添加了

,主要就是做一级缓存和内存之间

临时交换的地方用。为了适应

更快的处理器p4ee,已经出现了三级缓存了,它的容量更大,速率相对

可快多了。 缓存的出现使得

处理器的运行效率得到了大幅度的提升,这个区域中存放的都是cpu频繁要使用的

,所以缓存越大处理器效率就越高,同时由于缓存的

复杂很多,所以其成本也很高。

带来的结果是处理器运行效率的提升和成本价格的大幅度不等比提升。举个例子,

处理器和普通的p4处理器其内核基本上是一样的,就是

是2mb~16mb,p4的二级缓存是512kb,于是最便宜的至强也比最贵的p4贵,原因就在二级缓存不同。即l2cache。由于l1级

容量的限制,为了再次提高

,在cpu外部放置一高速

同频,也可不同。cpu在读取

时,先在l1中寻找,再从l2寻找,然后是

。所以l2对系统的影响也不容忽视。

缓存是个整体的,而且容量很低,英特尔公司从pentium时代开始把缓存进行了分类。当时

内核中的缓存已不足以满足

的需求,而制造工艺上的限制又不能大幅度提高缓存的容量。因此出现了

在与cpu同一块电路板上或

内核集成的缓存称为一级缓存,而外部的称为二级缓存。随着

制造工艺的发展,二级缓存也能轻易的

内核中,容量也在逐年提升。再用

在cpu内部与否来定义一、二级缓存,已不确切。而且随着二级缓存被

入cpu内核中,以往二级缓存与cpu大差距分频的情况也被改变,此时其以相同于主频的速率工作,可以为cpu提供更高的传输速率。

L3 Cache(三级缓存),分为两种,早期的是外置,现在的都是内置的。而它的实际作用即是,L3缓存的应用可以进一步降低

量计算时处理器的性能。降低

量计算能力对游戏都很有帮助。而在

领域增加L3缓存在性能方面仍然有显著的提升。比方具有较大L3缓存的配置利用

会更有效,故它比较慢的磁盘I/O子系统可以处理更多的

请求。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器

其实最早的L3缓存被应用在AMD发布的K6-III处理器上,当时的L3缓存受限于制造工艺,并没有被

进芯片内部,而是集成在主板上。在只能够和

其实差不了多少。后来使用L3缓存的是

但基本上L3缓存对处理器的性能提高显得不是很重要,比方配备1MB L3缓存的Xeon MP处理器却仍然不是Opteron的对手,由此可见

的增加,要比缓存增加带来更有效的性能提升。

而言,硬盘上没有文件的概念,只是用户指定大小的一个一个小格子,例如32k,硬盘上某个小格子里面的内容被读取了,则被缓存在

里面,下次还读这个小格子的时候,直接从内存读取,硬盘没有任何动作,从而达到了加速的目的。有两种缓存模式,1、MFU模式,每个小格子被读取的时候,做一个简单的计数,当缓存满的时候,计数值小的先被清出缓存;2、MRU模式,简单的队列,先进先出。

WWW是互联网上最受欢迎的应用之一,其快速增长造成网络拥塞和服务器超载,导致客户访问延迟增大,WWW服务质量日益显现出来。缓存技术被认为是减轻服务器负载、降低网络拥塞、增强WWW可扩展性的有效途径之一,其基本思想是利用客户访问的时间局部性(Temproral Locality)原理,将客户访问过的内容在Cache中存放一个副本,当该内容下次被访问时,不必连接到驻留网站,而是由Cache中保留的副本提供。

Web内容可以缓存在客户端、代理服务器以及服务器端。研究表明,缓存技术可以显著地提高WWW性能,它可以带来以下好处:

(1)减少网络流量,从而减轻拥塞。

(2)降低客户访问延迟,其主要原因有:①缓存在代理服务器中的内容,客户可以直接从代理获取而不是从远程服务器获取,从而减小了传输延迟②没有被缓存的内容由于网络拥塞及服务器负载的减轻而可以较快地被客户获取。

(3)由于客户的部分请求内容可以从代理处获取,从而减轻了远程服务器负载。

(4)如果由于远程服务器故障或者网络故障造成远程服务器无法响应客户的请求,客户可以从代理中获取缓存的内容副本,使得WWW服务的鲁棒性得到了加强。

Web缓存系统也会带来以下问题:

(1)客户通过代理获取的可能是过时的内容。

(2)如果发生缓存失效,客户的访问延迟由于额外的代理处理开销而增加。因此在设计Web缓存系统时,应力求做到Cache命中率最大化和失效代价最小化。

(3)代理可能成为瓶颈。因此应为一个代理设定一个服务客户数量上限及一个服务效率下限,使得一个代理系统的效率至少同客户直接和远程服务器相连的效率一样。[2]

将CPU比作一个城里的家具厂,而将存储系统比作

的木料厂,那么实际情况就是木料厂离家具厂越来越远,即使使用更大的

来运送木料,家具厂也得停工来等待木料送来。在这样的情况下,一种解决方法是在市区建立一个小型

,在里面放置一些家具厂最常用到的木料。这个仓库实际上就是家具厂的“Cache”,家具厂就可以从仓库不停的及时运送需要的木料。当然,仓库越大,存放的木料越多,效果就越好,因为这样即使是些不常用的东西也可以在仓库里找到。需要的

仓库里没有,就要从城外的木料厂里继续找,而家具厂就得等着了。仓库就相对于L1缓存,可以由CPU及时快速的读写,所以存储的是CPU最常用代码和

(后面会介绍一下如何挑选“最常用”)。L1缓存的

快的多是因为使用的是SRAM,这种内存单晶元使用四到六个

。这也使得SRAM的造价相当的高,所以不能拿来用在整个存储系统上。在大多数CPU上,L1缓存和核心一起在一块芯片上。在家具厂的例子中,就好比工厂和仓库在同一条街上。这样的设计使CPU可以从最近最快的地方得到

,但是也使得“城外的木料厂”到“仓库”和到“家具厂”的距离差不多远。这样CPU需要的

不在L1缓存中,也就是“Cache Miss”,从存储设备取数据就要很长时间了。处理器

越快,两者之间的差距就越大。使用Pentium4那样的高

就相当于“木料厂”位于另一个国家。

其实,缓存是CPU的一部分,它存在于CPU中 CPU存取

非常的快,一秒钟能够存取、处理十亿条指令和数据(术语:

就慢很多,快的内存能够达到几十兆就不错了,可见两者的速率差异是多么的大 缓存是为了解决CPU速率和

速率的速率差异问题 内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存,这样CPU就可以不经常到象“蜗牛”一样慢的内存中去取数据了,CPU只要到缓存中去取就行了,而缓存的速率要比内存快很多 这里要特别指出的是: 1.因为缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据,这样系统的速率就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。 2.因为随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,现在又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的 3.关于

为了分清这两个概念,我们先了解一下RAM ram和ROM相对的,RAM是掉电以后,其中信息才消失的那一种,ROM是在掉电以后信息也不会消失的那一种。RAM又分两种: 一种是静态RAM、SRAM;一种是动态RAM、DRAM。[3]

磁盘缓存分为读缓存和写缓存。读缓存是指,操作系统为已读取的文件

较空闲的情况下留在内存空间中(这个内存空间被称之为“

”),当下次软件或用户再次读取同一文件时就不必重新从

上读取,从而提高速率。写缓存实际上就是将要写入磁盘的

先保存于系统为写缓存分配的

空间中,当保存到内存池中的数据达到一个程度时,便将数据保存到

中。这样可以减少实际的磁盘操作,有效的保护磁盘免于重复的读写操作而导致的损坏,也能减少写入所需的时间。

的不同,有写通式和回写式两种。写通式在读

时,系统先检查请求指令,看看所要的数据是否在缓存中,在的话就由缓存送出响应的数据,这个过程称为命中。这样系统就不必访问

比磁介质快很多,因此也就加快了数据传输的速率。

时也在缓存中找,找到就由缓存就数据写入盘中,多数硬盘都是采用的回写式缓存,这样就大大提高了性能。缓存

则是操作系统为磁盘输入输出而在普通物理

中分配的一块内存区域。

转化为电信号后,通过缓冲区一次次地填充与清空,再填充,再清空,一步步按照PCI总线的周期送出,可见,缓冲区的作用是相当重要的。它的作用也是提高性能,但是它与缓存的不同之处在于:一、它是容量固定的硬件,而不像缓存是可以由

中动态分配的。二、它对性能的影响大大超过

对性能的影响,因为没有缓冲区,就会要求每传一个字(通常是4字节)就需要读一次磁盘或写一次磁盘。

的缓存可能有2种形式:其实主要区别就是CMS是否自己负责关联内容的缓存更新管理。

缓存:是在新内容发布的同时就立刻生成相应内容的

,比如:2003年3月22日,管理员通过

内容管理界面录入一篇文章后,并同步更新相关索引页上的链接。

2、动态缓存:是在新内容发布以后,并不预先生成相应的

,直到对相应内容发出请求时,如果前台

找不到相应缓存,就向后台内容管理服务器发出请求,后台系统会生成相应内容的静态页面,用户第一次访问页面时可能会慢一点,但是以后就是直接访问缓存了。

复杂的触发更新机制:这两种机制在

比较简单的时候都是非常适用的。但对于一个关系比较复杂的网站来说,页面之间的逻辑引用关系就成为一个非常非常复杂的问题。最典型的例子就是一条新闻要同时出现在新闻首页和相关的3个新闻专题中,在静态缓存模式中,每发一篇新文章,除了这篇新闻内容本身的页面外,还需要系统通过

,这些相关逻辑的触发也往往就会成为内容管理系统中最复杂的部分之一。

旧内容的批量更新: 通过

缓存发布的内容,对于以前生成的

的内容很难修改,这样用户访问旧页面时,新的模板根本无法生效。

在动态缓存模式中,每个

只需要关心,而相关的其他页面能自动更新,从而大大减少了设计相关页面更新触发器的需要。

是把最常用的东西放在最容易取得的地方。

可以被分为不用的类,包括直接映射缓存,组相联缓存和全相联缓存。

这种缓存中,每个组只有一行,E = 1,结构很简单,整个缓存就相当于关于组的一维

。不命中时的行替换也很简单,就一个行嘛,哪不命中替换哪。为了适应容量小的情况,第n+1层

,你只能被替换到上一层(也就是第n层)存储器中的某个位置的子集中。现在假设一个直接映射的

是4位(16个),有四个组,每个组一行,每个块两个字节。由于有16个地址,表征16个字节,所以总共有8个块,但只有4个组,也就是4行。只能把多个块映射到相同的缓存组,比如0和4都映射到组1,1和5都映射到组2,等等。这下问题就来了,比如先读块0,此时块0的

被cache到组0。然后我再读块4,因为块4也是被映射到组0的,组0又只有一行,那就只有把以前块0的

覆盖了,要是之后我又读块0,就 miss了,只能到下级的

去找。实际的循环程序中,很容易引起这种情况,称其为抖动。这种情况的存在,自然大大影响了性能。所以,需要更好的映射方案。

在组相联缓存里,E大于1,就是说一个组里面有多个cacheline。E等于多少,就叫有多少路,所以叫E路组相联。

组相联的行匹配就要复杂一些了,因为要检查多个行的标记位和有效位。如果最终找到了,还好。当然,找不到会从下一级

的行来替换,但一个组里面这么多行,替换哪个行。如果有一个空行,自然就是替换空行,如果没有空行,那就引发了一些其他的替换策略了。除了刚才介绍过的随机策略,还有最不常使用策略,最近最少使用策略。这些策略本身是需要一定开销的,但要知道,不命中的开销是很大的,所以为了保证命中率,采取一些相对复杂的策略是值得的。

所谓全相联,就是由一个包含所有缓存行的组组成的缓存。由于只有一个组,所以组选择特别简单,此时地址就没有组索引了,只有标记和偏移,也就是t部分和b部分。其他的步骤,行匹配和

选择,和组相联原理是一样的,只是规模大得多了。如果说上面关于这三种

方法的描述非常抽象,为了能理解得更加透彻,把

比作一家大超市,超市里面的东西就是一个个字节或者

。为了让好吃好玩受欢迎的东西能够容易被看到,超市可以将这些东西集中在一块放在一个专门的推荐柜台中,这个柜台就是缓存。如果仅仅是把这些货物放在柜台中即完事,那么这种就是完全关联的方式。

可是如果想寻找自己想要的东西,还得在这些推荐货物中寻找,而且由于位置不定,甚至可能把整个推荐柜台寻找个遍,这样的效率无疑还是不高的。于是超市老总决定采用另一种方式,即将所有推荐货物分为许多类别,如“

饼干”,“巧克力饼干”,“

牛奶”等,柜台的每一层存放一种货物。这就是直接关联的访问原理。这样的好处是容易让顾客有的放矢,寻找更快捷,更有效。

但这种方法还是有其缺点,那就是如果需要果酱饼干的顾客很多,需要巧克力饼干的顾客相对较少,显然对果酱饼干的需求量会远多于对巧克力饼干的需求量,可是放置两种

的空间是一样大的,于是可能出现这种情况:存放的果酱饼干的空间远不能满足市场需求的数量,而

饼干的存放空间却被闲置。为了克服这个弊病,老板决定改进存货方法:还是将货物分类存放,不过分类方法有所变化,按“饼干”,“牛奶”,“果汁”等类别存货,也就是说,无论是什么饼干都能存入“ 饼干”所用空间中,这种方法显然提高了空间利用的充分性,让存储以及查找方法更有弹性。

CPU产品中,一级缓存的容量基本在4kb到64kb之间,

的容量则分为128kb、256kb、512kb、1mb、2mb等。一级缓存容量各产品之间相差不大,而二级缓存容量则是提高

性能的关键。二级缓存容量的提升是由

制造工艺所决定的,容量增大必然导致cpu内部晶体管数的增加,要在有限的cpu面积上

更大的缓存,对制造工艺的要求也就越高

处理器缓存的基本思想是用少量的sram作为

与dram存储系统之间的缓冲区,即cache系统。80486以及更高档

的一个显著特点是处理器芯片内

cache技术,相对而言,片内cache的容量不大,但是非常灵活、方便,极大地提高了微处理器的性能。片内cache也称为一级cache。由于486,586等高档处理器的

频率很高,一旦出现一级cache未命中的情况,性能将明显恶化。在这种情况下采用的办法是在处理器芯片之外再加cache,称为二级cache。二级cache实际上是

和主存之间的真正缓冲。由于

,没有二级cache就不可能达到486,586等高档处理器的理想速率。二级cache的容量通常应比一级cache大一个数量级以上。在系统设置中,常要求用户确定二级cache是否安装及尺寸大小等。二级cache的大小一般为128kb、256kb或512kb。在486以上档次的

同步工作。相对于异步cache,性能可提高30%以上。pc及其

越做越高,系统架构越做越先进,而主存dram的结构和

改进较慢。因此,缓存(cache)技术愈显重要,在pc系统中cache越做越大。广大用户已把cache做为评价和选购pc系统的一个重要指标。

光存储驱动器都带有内部缓冲器或

给PC之前可能准备或存储更大的

。CD/DVD典型的缓冲器大小为128KB,不过具体的驱动器可大可小(通常越多越好)。可刻录

驱动器一般具有2MB-4MB以上的大容量缓冲器,用于防止

(buffer underrun)错误,同时可以使刻录工作平稳、恒定的写入。一般来说,驱动器越快,就有更多的缓冲

具有很多好处。缓冲可以保证PC以固定

时,数据可能位于分散在

读取时会使驱动器不得不间隔性向PC发送数据。

的缓冲在软件的控制下可以预先读取并准备光盘的内容目录,从而加速第一次

的规律是首先在缓存里寻找,如果在缓存中没有找到才会去光盘上寻找,大容量的缓存可以预先读取的数据越多,但在实际应用中

、DVD-ROM等读取操作时,读取重复信息的机会是相对较少的,大部分的光盘更多的时候是一次读取数量较多的文件内容,因此在CD-ROM、DVD-ROM驱动器上缓存重要性得不到体现,因此大多此类产品采用较小的缓存容量。CD-ROM一般有128KB、256KB、512KB几种;而DVD一般有128KB、256KB、512KB,只有个别的外置式DVD光驱采用了较大容量的缓存。

在刻录机或COMMBO产品上,缓存就变得十分重要了。在

时,系统会把需要刻录的

预先读取到缓存中,然后再从缓存读取数据进行刻录,缓存就是数据和刻录盘之间的桥梁。系统在传输

到缓存的过程中,不可避免的会发生传输的停顿,如在刻录大量小容量文件时,

很可能会跟不上刻录的速率,就会造成缓存内的数据输入输出不成比例,如果这种状态持续一段时间,就会导致缓存内的数据被全部输出,而得不到输入,此时就会造成缓存欠载错误,这样就会导致

失败。因此刻录机和COMMBO产品都会采用较大容量的缓存容量,再配合防刻死技术,就能把刻

的几率降到最低。同时缓存还能协调

,保证数据传输的稳定性和可靠性。

刻录机产品一般有2MB、4MB、8MB,

产品一般有2MB、4MB、8MB的缓存容量,受制造成本的限制,缓存不可能制作到足够大。但适量的缓存容量还是选择光储需要考虑的关键之一

World Wide Web(WWW)正在演绎一种新的人类生活,Internet在以前所未有的势头推进,一方面,人们为五彩缤纷的网络世界所陶醉,另一方面又为日渐变慢的访问

访问网站的过程是通过建立在TCP/IP协议之上的

开始,用户所经历的等待时间主要决定于DNS和网站的响应时间。网站域名首先必须被

解析为IP地址,HTTP的延时则由在客户端和服务器间的若干个往返时间所决定。

往返时间是指客户端等待每次请求的响应时间,平均往返时间取决于三个方面:

造成的延时在往返时间中占主要比例。当某个

收到多个并发HTTP请求时,会产生排队延时。由于响应一个HTTP请求,往往需要多次访问本地

,所以即使是一台负载并不大的

,也可能产生几十或几百微秒的延时。

之间的路径上会存在多个

、代理和防火墙等。它们对经过的IP包都要做存储/转发的操作,于是会引入排队延时和处理延时。在

,此时会寄希望于客户端和

通过端到端的协议来恢复通信。

是决定往返时间的一个重要因素。但基本带宽的作用并不是像人们想象的那么重要,一项测试表明,当网站采用T3

接入Internet时,也仅有2%的网页或

能以64kbps的速率提供给客户端,这显然表明,带宽在网络性能上不是最关键的因素。

今天Internet在向世界的每一个角落延伸,用户向一个

发出的 请求可能会经过8000公里到1.6万公里的距离,光速带来的延时和网络设备的延时是网络如此缓慢的最根本原因。

的原因是由距离和光速引起,那么加速Web访问的唯一途径就是缩短客户端与网站之间的距离。通过将用户频繁访问的页面和对象存放在离用户更近的地方,才能减少光速引入的延时,同时由于减少了路由中的环节,也相应地减少了路由器、防火墙和代理等引入的延时。

来达到缩短距离的目的。但这个办法存在很大的不足,对于某个站点而言,不可能在离每个用户群较近的地方都建立

,若对大多数网站都用这样的办法就更不经济,同时管理和维护镜像站点是一项非常困难的工作。

网络缓存是一种降低Internet流量和提高终端用户响应时间的新兴网络技术。它的观念来自于

和网络的其他领域,如目前流行的Intel架构的CPU中就存在缓存,用于提高

;各种操作系统在进行磁盘存取时也会利用缓存来提高速率;

通常也通过缓存来提高客户机和

几乎目前所有的浏览器都有一个内置的缓存,它们通常利用客户端本地的

来完成缓存工作,同时允许用户对缓存的内容大小作控制。浏览器缓存是网络缓存的一个极端的情况,因为缓存设在客户机本地。通常一个客户端只有一个用户或几个共享计算机用户,浏览器缓存要求的

空间通常在5MB到50MB的范围内。但是浏览器缓存在用户之间难以共享,不同客户端的缓存无法实现交流,因而缓存的内容与效果相当有限。

则是一种独立的应用层网络服务,它更像E-mail、Web、DNS等服务。许多用户不仅可以共享缓存,而且可以同时访问缓存中的内容。企业级

一般需要配置高端的处理器和存储系统,采用专用的软件,要求的

之间,在某些情况下,这种连接是不允许的,如网站在防火墙内,这时客户端必须与代理建立TCP连接,然后由代理建立与网站服务器的TCP连接。代理在

接力的作用。代理发出的HTTP请求与一般的HTTP请求有细小的不同,主要在于它包含了完整的URL,而不只是URL的路径。

收到客户端的请求时,它首先检查所请求的内容是否已经被缓存。如果没有找到,缓存必须以客户端的名义转发请求,并在收到

发出的文件时,将它以一定的形式保存在本地

,并将其发送给客户端。

如果客户端请求的内容已被缓存,还存在两种可能:其一,缓存的内容已经过时,即缓存中保存的内容超过了预先设定的时限,或网站

的网页已经更新,这时缓存会要求原服务器验证缓存中的内容,要么更新内容,要么返回“未修改”的消息;其二,缓存的内容是新的,即与原网站的内容保持同步,此时称为缓存命中,这时缓存会立即将已保存的内容送给客户端。

在客户端的请求没有命中时,反而增加了缓存存储和转发的处理时间。在这种情况下,

是否仍有意义呢?实际上,代理缓存能够同时与网站

建立多个并发的TCP/IP连接,并行获取网站上的内容。缓存的存在从整体上降低了对网站访问的次数,也就降低了单位时间内

端的排队数目,因而这时

的排队延时要小得多。优秀的缓存甚至能实现对网页内相关链接内容的预取以加快连接的

的文件修改或被删除后,缓存又如何知道它保存的拷贝已经作废呢?HTTP协议为

提供了基本的支持,它使缓存能向原服务器查询,某个文件是否更改,如果缓存的拷贝过时则进行有条件下载。仅当原

文件超过指定的日期时,才会发出新的文件。

造成的负载几乎和获取该文件差不多,因此不可能在客户端向缓存发起请求时都执行这样的操作。HTTP协议使得

可以有选择地为每个文档指定生存时间,即清楚地指出某个文件的有效生命周期,生存时间很短即意味着“不要对其缓存”。拷贝的保留时间可以是固定的,也可以是通过这个文件的大小、来源、生存时间或内容计算出来的。

分布式缓存系统是为了解决

和web服务器之间的瓶颈。如果一个网站的流量很大,这个瓶颈将会非常明显,每次

库查询耗费的时间将会非常可观。对于更新速度不是很快的网站,我们可以用

库查询。对于更新速度以秒计的网站,

化也不会太理想,可以用缓存系统来构建。如果只是单台

用作缓存,问题不会太复杂,如果有多台服务器用作缓存,就要考虑

,而达到各个功能模块都能够跨省份、跨

共享本次会话中的私有数据的目的。每个省份使用一台

来做为Memcached服务器来存储用话的会话中的

,当然也可以多台服务器,但必须确保每个省份的做Memcached服务器数量必须一致,这样才能够保证Memcached客户端操作的是同一份数据,保证数据的一致性。

会话数据的添加、删除、修改

Memcached客户端,添加、删除和、修改会话信息

时,不仅要添加、删除、修改本省的Memcached

数据,而且同时要对其它省份的Memcahed服务器做同样的操作,这样用户访问其它省份的服务器的功能模块进也能读取到相同的会话数据。Memcached

的Memcached客户端服务器列表都设为本省Memcached服务器地址的内网IP来向Memcahed服务器中读取会话数据。

使用Cookie来保持客户与

的联系。每一次会话开始就生成一个GUID作为SessionID,保存在客户端的Cookie中,作用域是顶级域名,这样二级、三级域名就可以共享到这个Cookie,系统中就使用这个SessionID来确认它是否是同一个会话。

上的唯一键Key也就是会话数据数据的唯一ID定义为:SessionID_Name, SessionID就是保存在客户端Cookie中的SessionID,Name就是会话数据的名称,同一次会话中各个会话数据的Name必须是唯一的,否则新的会话数据将覆盖旧的会话数据。

会话的失效通过控制Cookie的有效时间来实现,会话的时间设为SessionID或Cookie中的有效时间,且每一次访问SessionID时都要重新设置一下Cookie的有效时间,这样就达到的会话的有效时间就是两次间访问Cookie中SessionID值的的最长时间,如果两次访问的间隔时间超过用效时间,保存在SessionID的Cookie将会失效,并生成新的SessionID存放在Cookie中,

的失效,每一次向Memcache服务器中添加会话数据时,都把有效时间设为一天也就是24小时,让Memcached服务使用它内部的机制去清除,不必在程序中特别做会话数据的删除操作。数据在Memcache

中有有效时间只是逻辑上的,就算是过了24 小时,如果分配给Memcached服务的

还够用的话,数据还是保存在内存当中的,只是Memcache客户端读取不到而已。只有到了分配给Memcached服务的

不够用时,它才会清理没用或者比较旧的

CPU的缓存分二级:L1(一级缓存)和L2(二级缓存),当处理器要读取数据时,首先要在L1缓存中查找,其次才是L2缓存,最后才是系统内存。如果有一天你发觉自己的电脑慢了很多,进入到Windows桌面也要几分钟,这时候就要检查一下CPU的一、二级缓存有没有打开。在BIOS设置中的StandardCMOSSetup(标准CMOS设定)有两项是用来打开或关闭缓存的:CPUInternalCache设为Enable时开启CPU内部的一级缓冲区,若设置为Disabl则为关闭,这时系统性能将大大降低;ExternalCache选项是控制主板上二级缓冲区,如果主板上有二级缓存则应设成Enable。

点击电脑桌面上的“开始”/“运行”,键入“Msconfig”启动“系统配置实用程序”,跟着选中“system.ini”标签下的“Vcache”项,就可以根据系统的实际情况来调节硬盘的缓存了。在该选项中一般会有三行内容:ChunkSize=1024、MaxFileCache=10240和MinFileCache=10240;其中第一行是缓冲区读写单元值,第二、三行是硬盘的最大和最小缓冲值,等号后的数值都是可以修改的,只要右键单击选中任一行就可以进行修改了。如果你的内存是128MB的话,上面这三行的取值就比较合理了,当然也可以自定。如果不知道该如何设置合适的缓冲值,请“Windows优化大师”帮忙吧,这个软件中有一个“磁盘缓存优化”项,用鼠标就可以方便地设置好缓存;又或者让“Windows优化大师”自动帮你进行优化设置。当硬盘的缓存值足够大时,硬盘就不用频繁地读写磁盘,一来可以延长硬盘的寿命,二来也可以提高数据的传输速度。

另外,将硬盘的“文件系统缓存”设置为“网络服务器”,可以加快系统对硬盘的访问速度,因为文件系统缓存里存放了硬盘最近被访问过的文件名和路径,缓存越大所能储存的内容也就越多。如果点击“控制面板”/“系统”/“性能”/“文件系统”/“硬盘”,将“此计算机的主要用途”由“台式机”改为“网络服务器”,可以将原来10K左右的缓存增加至近50K左右。

一般来说,软驱读写数据的速度都比较慢,这是因为盘片的转速不能太高,但是,我们可以提高软驱的读写缓存,让软驱一次读写更多的数据。方法是:在桌面上的“开始”/“运行”框中键入“Regedit”运行注册表编辑器,依次进入HKEY-LOCAL-MACHINE\System\CurrentControlSet\Services\Class\FDC\0000,新建一个为ForeFifo的“DWORD值”,将其值设为“0”,这样就对软驱进行了软提速。很多人都知道右键单击桌面“我的电脑”图标,选“属性”/“性能”/“文件系统”/“CD-ROM”,将最佳的访问方式设为“四倍速或更高速”,将追加的高速缓存大小滑块拖到最大处,可以明显提高光驱的读盘速度。除了这种方式,我们还可以在注册表中设置缓冲值,方法是:进入到注册表,在HKEY-LOCAL-MACHINE\System\CurrentControlSet\Control\FileSystem\CDFS下,将CacheSize(缓存值的大小)和Prefetch(预读文件大小)两项进行手工调整,只要右键单击要选的项就可以进行修改了。[4]

}

AMD提出3A平台的新标志,在笔记本领域有“AMD

”标志的就表示该电脑采用3A构建方案(CPU、

、主板芯片组均由AMD制造提供)。

成就今日 启迪未来 [1]
游戏主机/PC/服务器

AMD创办于1969年,当时公司的规模很小,甚至总部就设在一位创始人的家中。但是从1969年到2013年,AMD一直在不断地发展,2012年已经成为一家年收入高达24 亿美元的跨国公司。

公司刚成立时,所有员工只能在创始人之一的 JohnCarey 的起居室中办公,但不久他们便迁往美国加州圣克拉拉,租用一家地毯店铺后面的两个房间作为办公地点。到当年9 月份,AMD已经筹得所需的资金,可以开始生产,并迁往

在AMD创立五周年时,AMD已经拥有1,500名员工,生产200 多种不同的产品—— 其中很多都是AMD自行开发的,年销售额将近2650万美元。

AMD宣布2016年第四季度营业额为11.1亿美元,经营亏损300万美元,净亏损5100万美元,每股亏损0.06美元。非GAAP经营收入2600万美元,净亏损800万美元,每股亏损0.01美元。

营业额为42.7亿美元,年度增长7%,CG以及EESC部门均有增长。

基于GAAP,毛利润率为23%,较上一年下降4%,主要由于签订的晶圆供应协议带来的费用。经营亏损3.72亿美元,上一年度经营亏损4.81亿美元。经营亏损的改善主要归功于营业额增加、重组费用减少及IP许可收益冲抵了晶圆供应协议的费用。净亏损4.97亿美元,上一年度净亏损6.60亿美元。每股亏损0.60美元,2015年每股亏损0.84美元。

在创办初期,AMD的主要业务是为Intel公司重新设计产品,提高它们的速度和效率,并以"第二供应商"的方式向市场提供这些产品。AMD当时的口号是"更卓越的参数表现"。为了加强产品的销售优势,该公司提供了业内前所未有的品质保证—— 所有产品均按照严格的MIL-STD-883 标准进行生产及测试,有关保证适用于所有客户,并且不会加收任何费用。

截至2013年年底,在CPU 市场上的占有率仅次于

,但仍有不少差距,AMD的市场占有率勉强超过20%,而Intel拥有将近80%的市场占有率。

)后,其在处理器市场的表现为AMD带来了新的发展机遇,仅2011年第一季度,APU的出货量达到300万颗,是2010年第四季度的3倍,AMD2011年第一季度的营收达到16.1亿美元。

领域中则表现得非常优异,独立显示核心的性能已远远超过其竞争对手

。2010年二季度GPU份额为:Intel54.3%,AMD24.5%、NVIDIA19.8%。这一排名体现了AMD/NVIDIA两家位置的转换。如果只算独立显卡份额的话,2010年二季度AMD在独立显卡市场的份额为51%,刚刚好超过NVIDIA的49%。仅仅是这2%的差距,却完成了市场占有率一二名的质变转换。如今在对手NVIDIA费米架构产品刚刚起步的时候,AMD又展开一场大规模的显卡降价活动,部分高端显卡甚至降幅达到了500元的幅度,紧随其后的还有快要发布的新一代显卡,这将又一次对NVIDIA造成不少的冲击。

、马来西亚槟城还建有大容量封装测试工厂,正式更换大股东。来自AMD官方的最新消息,公司已同

(以下简称“通富微电”)签署一份最终协议,双方将就组装、测试、标记和打包(ATMP)等业务组建合资公司。据悉,此次易的总价为4.36亿美元,通富微电将拥有合资公司85%的股权,AMD将收到3.71亿美元现金。

新的合资公司共包含5个设施,总员工预计约为5800名。根据双方公开信息,该交易最早将于2016年上半年完成。

AMD在全球各地设有业务机构,在美、德、日、中和南亚部分国家设有制造工厂,并在全球各大主要城市设有销售办事处, 拥有超过1万名员工。 2013年,AMD的营收为53亿美元,是一家真正意义上的

2004年9月,AMD公司大中华区正式成立,总部设在北京(中国总部位于北京中关村),现由AMD全球高级副总裁

先生担任AMD大中华区总裁,统辖AMD在中国大陆、香港和台湾地区的所有业务,进一步把握“中国机会”。

落成,2006年,AMD在美国本土以外最大的研发中心——上海研发中心正式运营,2008年3月AMD成都分公司成立,与AMD上海、深圳、香港、台湾等地分支机构共同勾画AMD的中国战略版图。2010年11月8日AMD 对位于苏州的封装测试场进行扩建,此次扩建将把AMD苏州工厂打造成集组装、测试、打标和封装职能于一身的综合工厂,使其同时具备对

(GPU)以及加速处理器(

)进行封装和测试的能力。

现任总裁兼首席执行官:Lisa Su

,Lisa Su博士为AMD总裁兼首席执行官,同时担任AMD公司董事会成员。升任总裁兼首席执行官之前,Lisa Su博士担任AMD首席运营官一职, 负责将AMD事业部、销售、全球运营,与基础架构实现团队整合成一个面向市场的单一组织,负责全方位的产品策略与执行。Lisa Su博士于2012年1月加入AMD,担任全球事业部高级副总裁兼总经理,负责推动AMD产品与解决方案的端到端业务执行。

2012年12月20日,AMD公司宣布,AMD全球副总裁、大中华区总裁

由于个人职业发展原因离职;AMD全球副总裁、大中华区董事总经理

出任AMD大中华区新的领导人。

AMD作出每一个决定时,都会考虑"以客户为中心进行创新",并以此作为指导思想,让公司员工清晰知道产品的发展方向,也让公司能够在这个基础上与业务伙伴、客户以及用户建立更密切的合作关系。

迄今为止,全球已经有超过2000家软硬件开发商、

全球2000强中排名前100位的公司中,75%以上在使用基于AMD

处理器的系统运行企业应用,且性能获得大幅提高。

AMD在2010年底彻底放弃收购多年的“ATI”商标,而后随着官方新LOGO的出炉。

编写领域的Ontario定于2010年第四季度出货,面向主流桌面和移动的Llano定于2011年上半年出货。

新的logo以统一的底型为样板设计。在中间进行型号标识,下部进行特殊标识(UNLOCK云云)与APU交火的独立显卡以独特的标识出现。不同的底色表达了产品不同的定位,非常容易识别。

从左到右从上到下依次是:嵌入式方案(总体)、嵌入式G系列APU(A/X不同暂时不详可能是等级不同)、嵌入式Geode处理器(看出嵌入式生命力的持久了吧)、嵌入式R系列APU、9系列芯片组、A88X芯片组(Richland带出来的A85X升级版)、A75芯片组。

AMD采用了一种高效的、基于合作伙伴的研发模式,确保它的产品和解决方案可以始终在性能和功率方面保持领先。借助于行业伙伴的技术和资源,AMD为它的产品集成了先进的亚微米技术。它的产品通常领先于行业总体水平,而且成本远低于平均成本。

为了在批量生产过程中无缝地采用这些先进的技术,AMD开发和采用了数百种旨在自动确定最复杂的制造决策的

。这些功能被统称为自动化精确生产(

)。它们为AMD提供了前所未有的生产速度、准确性和灵活性。

  • 1969年5月1日,公司成立。

  • 1972年9月,开始生产晶圆,同年发行股票。

  • 1976年,与Intel公司签署专利相互授权协议。

  • 1977年,与西门子公司创建AMC公司。

  • 1978年,一个组装生产基地的落成在马尼拉。同年AMD公司年营业额达1亿美元。

  • 1979年,股票在纽约上市,奥斯丁生产基地落成。

  • 1981年,AMD制造的芯片被用于建造航天飞机,同年决定与Intel公司扩大合作。

  • 1982年,新式生产线(MMP)开始投入使用。

  • 1983年,新加坡分公司成立,同年推出INT.STD.1000质量标准。

  • 1984年,曼谷生产基地建设并扩建奥斯丁工厂。

  • 1985年,被列入财富500强。同年启动自由芯片计划。

  • 1986年10月,AMD公司首次裁员。

  • 1987年,索尼公司合作生产CMOS芯片,4月向INTEL提起诉讼,这场官司持续5年,以AMD胜诉告终。

  • 1988年10月,SDC基地开始动工。

  • 1992年2月,AMD对Intel法律诉讼结束,AMD胜诉,获得生产386处理器的资格。

  • 1993年4月,开始生产闪存,同月,推出AM486

  • 1998年,K7处理器发布。

  • 1999年,Athlon(速龙)处理器问世。

  • 2000年,AMD在第一季度的销售额首次超过了10亿美元,打破了公司的销售记录,同年Fab 30开始投入生产。

  • 2003年,AMD推出面向服务器Opteron(皓龙)处理器,同年9月,推出第一款桌面级的64位微处理器。

  • 要求在新加坡举办双核比试,AMD以Socket 939登报围剿英特尔发出双核决斗挑战。

  • 2008年10月8日,AMD宣布分拆成两家公司,一家专注于处理器设计,另一家负责生产。

  • 2010年,AMD(ATI)独立显示核心出货量取代NVIDIA成为世界第一。

  • 2011年1月,AMD推出Fusion系列Bobcat APU芯片,是一颗芯片包含CPU(中央处理器)及GPU(图像处理器)的组合,第一轮会有共4颗型号的芯片,GPU部份也能真正支持1080p高清播放(硬件解码)。

  • 2011年3月6日迪拜新进技术投资公司(ATIC)以4.25亿美元收购了 AMD 拥有的

    余下的 8.8% 的股份,成为一家独立的芯片制造商,使ATIC成为持股者。

  • 2011年9月30日,Bulldozer(推土机)产品以全新架构问世,并采用全新插槽AM3+。该架构其实自2003年就已经有研发计划,唯因为经费不足,搁置到2011年发布。

  • 2012年,Plidiver(打桩机)架构自改良推土机架构而生。

  • 2013年,AMD再次更换产品标识。

  • 作为该主机的单芯片解决方案。

两家公司的高层主管首次会面,探讨了一个共同的梦想:创建一种能够在市场中再次引入竞争的微处理器系列。这些会谈促使AMD 在1996 年收购了NexGen 公司,并成功地推出了AMD-K6 处理器。AMD-K6 处理器不仅实现了这些起点很高的目标,而且可以充当一座桥梁,帮助 AMD 推出它的下一代AMD 速龙处理器系列。这标志着该公司的真正成功。

年的成功推出标志着AMD 终于实现了自己的目标:设计和生产一款业界领先、自行开发、兼容

的处理器。AMD 首次推出了一款能够采用针对AMD 处理器进行了专门优化的

和主板、业界领先的处理器。AMD 速龙处理器将继续为该公司和整个行业创造很多新的记录,其中包括第一款达到历史性的 1 GHz(1000MHz)主频的处理器,这使得它成为了行业发展历史上最著名的处理器产品之一。AMD 速龙处理器和基于 AMD 速龙处理器的系统已经获得了全球很多独立刊物和组织颁发的 100 多项著名大奖。

在推出这款创新的产品系列的同时,该公司还具备了足够的生产能力,可以满足市场对于其产品的不断增长的需求。1995 年,位于

奥斯丁的Fab 25 顺利建成。在Fab 25建成之前,AMD已经为在德国

建设它的下一个大型生产基地做好了充分的准备。与

的战略性合作让AMD 可以开发出基于铜互连、面向未来的处理器技术,从而让AMD 成为了第一个能够利用铜互连技术开发兼容

的处理器的公司。这种共同开发的处理技术将能够帮助AMD 在Fab 30 稳定地生产大批的AMD 速龙处理器。

为了寻找新的竞争手段,AMD 提出了"影响范围"的概念。对于改革AMD 而言,这些范围指的是兼容IBM计算机的微处理器、网络和通信芯片、可编程逻辑设备和高性能内存。此外,该公司的持久生命力还来自于它在亚微米处理技术开发方面取得的成功。这种技术将可以满足该公司在下一个世纪的生产需求。

在 AMD 创立25 周年时,AMD 已经动用了它所拥有的所有优势来实现这些目标。AMD 在芯片和显卡市场中都名列第一或者第二,其中包括Microsoft Windows 兼容市场。该公司在这方面已经成功地克服了法律障碍,可以生产自行开发的、被广泛采用的Am386 和Am486 微处理器。AMD 已经成为

、网络、电信和可编程逻辑芯片的重要供应商,而且正在致力于建立另外一个专门生产亚微米设备的大批量生产基地。在过去三年中,该公司获得了创纪录的销售额和运营收入。

尽管 AMD 的形象与25 年前相比已经有了很大的不同,但是它仍然像过去一样,是一个顽强、坚决的竞争对手,并可以通过它的员工的不懈努力,战胜任何挑战。

通过提供针对双运行闪存设备的行业标准,AMD 继续保持着它在闪存技术领域的领先地位。闪存已经成为推动当时的技术繁荣的众多技术的重要组件。手提电话和互联网加大了市场对于闪存的需求,而且它的应用正在变得日益普遍。AMD 范围广泛的闪存设备产品线当时已经能够满足手提电话、

、互联网设备、有线电视机顶盒、有线

和很多其他应用的内存要求。

通过多种可以为客户提供显着竞争优势的闪存和微处理器产品,能稳定生产大量产品、业界领先的全球性生产基地,以及面向未来、富有竞争力的产品和制造计划,AMD 得以在成功地渡过一个繁荣时期之后,顺利地进入新世纪。

1995 ——富士-AMD 半导体有限公司(FASL)的联合生产基地开始动工。

1998 ——AMD 在微处理器论坛上发布AMD 速龙处理器(以前的代号为K7)。

1998 ——AMD 和Motorola 宣布就开发铜互连技术的开发建立长期的伙伴关系。

2000 ——AMD 日本分公司庆祝成立25 周年。

2000 ——AMD 在第一季度的销售额首次超过了10 亿美元,打破了公司的销售记录。

2001 ——AMD 推出面向服务器和

的AMD 速龙MP 双处理器。

2002 ——AMD 和UMC 宣布建立全面的伙伴关系,共同拥有和管理一个位于新加坡的300 mm

制造中心,并合作开发先进的处理技术设备。

2003 ——AMD 推出面向台式电脑和笔记簿电脑的 AMD 速龙(TM)64处理器。

(TM)64FX处理器. 使基于AMD 速龙(TM)64FX处理器的系统能提供影院级计算性能。

,新公司将以AMD 的名义运作。

AMD 2006 年10 月25 日宣布完成对加拿大ATI 公司价值约54 亿美元的并购案,ATI 也从即日起启用全新设计的官方网站。

根据双方交易条款,AMD 以42 亿美元现金和5700 万股AMD 普通股收购截止2006 年7 月21 日发行的ATI 公司全部的普通股,通过此次并购,AMD 在处理器领域的领先技术将与ATI 公司在图形处理、芯片组和消费电子领域的优势完美结合,AMD 将于2007年推出以客户为导向的技术平台,满足客户开发差异化解决方案的需求。

AMD 同时将继续开发业界最好的处理器产品,让客户可以根据自身需求选择最佳的技术组合;从2008 年起,AMD 将超越现有的技术布局,改造处理器技术,推出整合处理器和绘图处理器的芯片平台。

2008 年10 月8 日,全球第二大电脑芯片商AMD 闪电宣布分拆其制造业务,与

一家简称ATIC 的高科技投资公司合资成立名为Foundry 的新制造公司,引起全球IT界的轰动。根据协议,AMD 将把德国德累斯顿的两家生产工厂以及相关的资产及知识产权全盘转入合资公司。AMD 将拥有合资公司44.4%股份,ATIC则持有其余股份。AMD从此彻底转型为一家

公司。AMD 位于苏州的封装厂并不在剥离之列。随着全球半导体产业一波整合并购浪潮汹涌而至,传统“制造加 设计”的模式是否在走向终结?

(*2013年2月21日,由于AMD经营不善,被迫被

1986 年ATI 获得了自己的第一笔订单,每周被预订了7000 块芯片,那一年年底,ATI 赚了1,000 万美元。

80 年代末90 年代初的时候,ATI 营业额几乎达到1 亿美元,跻身加拿大50大高科技公司的名单。

1991 年ATI 公司推出了自己的第一块图形加速卡—— Mach8。这块图形加速卡有板载和独立两种版本,能够独立于CPU 之外显示图形。

1993 年,在年营业额突破2.3 亿加元后,ATI 在

证交所上市,之后由于股灾,ATI 一度面临生死存亡的局面。在Mach64 诞生后,由其带来的成功,ATI 所有的麻烦都迎刃而解。ATI 开始成立了自己的3D部门,这为后来的ATI 奠定了基础。

1994 年,首块能够对影像提供加速功能的显卡Mach64 诞生。这块显卡是计算机图形发展历史上的一块里程碑。Mach64 所使用的Graphics Xpression 和Graphics Pro Turbo 技术能够支持YUV 到RGB的色彩空间转换,使得PC获得了MPEG 的视频加速能力。

1995 年诞生Mach64-VT 版本。其完全将CPU 解压的负担承担了起来,由于VT版本的Mach64提供了对视频中的X轴和Y轴的过滤得能力,所以对分辨率为320x240 的视频图像重新调整大小至 时也不会出现因为放大所产生的任何马赛克。

1996 年1 月,ATI 推出3D Rage 系列。开始提供对MPEG-2的解码支持。通过后来引入Rage 系列显示芯片的 iDCT 等先进技术更大大降低了CPU 在播放MPEG-2 视频时的负担。

1997 年4 月发布3D Rage Pro。四千五百万像素填充率,VQ的材质压缩功能,每秒能够生成一百二十万的三角形,8MBSGRAM或者16MBWRAM的高速显存,这些数字给了当时3D图形芯片的王者Voodoo以很大压力。

1997 年,在2D 时代非常强大的Tseng Labs 公司被ATI 收购,40 名经验丰富的显卡工程师加入了ATI 的开发团队。

1999年,ATI采用AFR技术将两块Rage 128 Pro芯片管理起来,共同参与3D运算,这就是拥有两颗显示芯片的显卡RAGE Fury MAXX,曙光女神。RAGE Fury MAXX成为单卡双芯的始祖,并且也对今后的双卡或多卡并联技术产生了一定的影响。

上市,开始以美元计算自己的价值。

2000 年4 月,ATI 的第6 代图形芯片Radeon256 诞生。其提供了对DDR-RAM的支持,节省带宽的HyperZ 技术,完整地T&L 硬件支持,Dot3,环境贴图和凹凸贴图,采用2 管线,单管道 3 个材质贴图单元(TMU)的独特硬件架构。由于架构过于特殊,第三个贴图单元直到Radeon256 退市的时候也没有任何程序支持它。Radeon256 的渲染管线非常强大,甚至可以进行可编程的着色计算。

2001 年,宣布自己将采用类似NVIDIA的芯片生产运作模式,开放旗下芯片的显示卡生产授权,让第三方厂商可以生产基于ATI 图形芯片的显示卡产品,以加强自己图形芯片的销售以及缩短图形芯片新品的研发周期。

公司,并将其设计的“Flipper”卖给了

作为其游戏机“GameCube”的显示芯片。

2002 年8 月,ATI显卡芯片史上最具有传奇色彩的R300 核心问世。

2003 年2 月,ATI 推出超频版R300,命名为 R350 与R360,在市场上仍然获得了成功。

2005 年10 月,ATI 发布R520 。与R420 一样只有16 条渲染管线,在采用极线程分派处理器后,R520 能够最多同时处理512 个线程,先进的线程管理机制使得每条渲染管线的效率大为提升;8 个引入SM3.0 的

,动态流控指令得到了支持,采用R2VB 的方式绕过了SM3.0 对VTF 的规定;采用了256 位的环形总线尽管增加了内存的延时,却灵活了数据的调度;支持FP32 及HDR+AA;而先进的Avivo 技术使得ATI 产品的视频质量更上了一个新的台阶。ATI 认为未来游戏将会对Shader 的要求更高,所以像素着色单元与TMU 的比值应该更大。于是R580 采用了48个3D+1D 像素着色单元,却使用了与R520 相同的16TMU 。这种奇特的3:1 架构被证明在如极品飞车10和上古卷轴4等PS 资源吃紧的新游戏中能够获得比传统的1:1 架构更为优秀的表现。先进的软阴影过滤技术Fetch4 则让R580 对阴影的处理更有效率。

2006 年7 月24 日,AMD 正式宣布以总值54 亿美元的现金与股票并购ATI。10 月25 日,AMD 宣布,对ATI 的并购已经完成,ATI 作为一个独立的品牌已经成为了历史。AMD 公司也成为PC 发展史上第一家可以同时提供CPU,GPU 以及芯片组的公司,这在PC 发展史上具有里程碑意义。

2007 年,AMD ( ATI )公司发布了R600 核心。继承了ATI 重视视频播放能力的传统,R600 系列的所有产品都具有内置的5.1 声道的音频芯片,将音频与视频信号通过HDMI 接口输送出去,R600 与G80 一样,都属于完整支持DX10 的硬件设计。64 个US 共320SP,浮点运算能力达到了 475GFLOPS,大大超过了G80 345GFLOPS 的水平。512 位回环总线为芯片提供了更大的显示带宽。采用了新的UVD 视频方案,支持对VC-1 与AVC/H.264 的

的HDMI 音视频输出完整支持,通过DVI ——HDMI 的转接口能够同时输出5.1 环绕立体声的音频和HDTV 的视频信号。

也由320 个增加到800 个。而且每组SIMD 还绑定了专属的缓存及纹理单元,寄存器的容量也有所增加,纹理单元相应增加到10 组,总数达到40 个。此外,RV770 的

能力大幅增强。RV770 还是保持4 组后处理单元,也就是通常所说的16 个ROPs(光栅单元),但 AMD 重新设计了光栅单元的内部结构,改善了之前较弱的AA 反锯齿性能。R00/670 每组后处理单元内部包括了8 个Z模板采样,而RV770 则提高到16 个,因此它的多重采样(MSAA)速度几乎可以达到以前的2倍。当然,RV770 的反锯齿算法最终还是要由Shader 来处理,而RV770 的800 个流处理器正好可以派上用场,最终抗锯齿性能有不小的提升。RV770 可以依靠800 的流处理器的处理能力轻松突破1TFlop 的浮点运算能力。成为第一款成功达到1TFlop 的

核心,这是显卡史上具有里程碑意义的突破。并且内建第二代UVD 视频解码引擎。相对于第一代UVD 技术而言,主要在以下有所改进:

1、更好地支持超高码率的视频编码与播放;

2、支持2160P 及更高分辨率视频编码;

3、支持多流解码,即可同时解码多部高清影片,比NVIDIA 在GTX280 上实现的

4、继续内置高清音频模块并可以通过HDMI 接口输出7.1 声道的AC3 和DTS 编码音频流。

在制程方面,AMD公司在业界率先采用55 nm 制造工艺的GPU 核心,使晶圆成本得以降低,以控制成本,同时,55 nm 制程的热功耗设计比此前的显卡更出色,可以有效的降低发热量和提高超频能力。最后要说的是,RV770 支持DirectX 10.1 。DX10.1改善了Shader 资源存取功能,在进行多样本反锯齿时间少了性能损失。它还能够提高新游戏的阴影过滤效率,进一步提高光影效果。此外DirectX 10.1还支持32 位浮点过滤,能够提高渲染精度,改善HDR 画质。

2011年1月,AMD正式发布世界上首款加速处理器(APU)。这是唯一一款为嵌入式系统推出的APU。基于AMD Fusion技术,AMD嵌入式G系列APU在一颗芯片上融合了基于“Bobcat”核心的全新低功耗x86 CPU,支持DirectX® 11的领先GPU及其并行处理引擎,带来完整的、全功能的嵌入式平台。6月,AMD更趁势推出面向主流消费类计算的下一代高性能AMD Fusion A系列加速处理器(APU)。AMD A系列APU具有出色的高清图像显示功能、超算级的性能和超过10个半小时的电池续航时间,可为消费类笔记本和台式机用户带来真正身临其境的计算体验。

系列芯片。AMD宣称,搭载Trinity的电脑比英特尔芯片电脑便宜,但运行速度相当。Trinity运行速度比Llano快25%,图形核心的运算速度快50%。2013年6月AMD又推出全新一代APU,分别为至尊四核 richland、经典四核kabini和至尊移动四核temashi,分别成为桌面版APU和移动版APU的最新领军产品。AMD预计将于2014年推出Kaveri系列APU。

2011年10月,发布FX系列CPU,为台式机PC用户带来了全面无限制的个性化定制体验。AMD推出的这款台式机处理器是世界上首款8核台式机处理器。

和IT 基础设施的企业用户来说,AMD 提供一系列解决方案。

80287 核心。产品的市场定位和性能与Intel80287 基本相同。也是迄今为止AMD 公司唯一生产过的FPU产品,十分稀有。

■AMD 年)、年)、年)、年)、年)、80188、80286微处理器,使用Intel8080 核心。产品的市场定位和性能与Intel同名产品基本相同。

P9,有SX 和DX 之分,分别与

32位,外部16位)。AMD 386DX的性能与Intel80386DX相差无己,同为当时的主流产品之一。AMD也曾研发了386 DE等多种型号基于386核心的

■AMD 486DX(1993年)微处理器,核心代号P4,AMD 自行设计生产的第一代486产品。而后陆续推出了其他486级别的产品,常见的型号有:486DX2,核心代号P24;486DX4,核心代号P24C;486SX2,核心代号P23等。其它衍生型号还有486DE、486DXL2等,比较少见。AMD 486的最高频率为120MHz(DX4-120),这是第一次在频率上超越了强大的竞争对手Intel 。

)推出了高性价比的TI486DX2-80,很快占领了中低端市场,Intel 也推出了高端的Pentium系列。AMD为了抢占市场的空缺,便推出了5x86系列CPU(几乎是与Cyrix 5x86同时推出)。它是486级最高频的产品----33*4、133MHz,0.35微米制造工艺,内置16KB一级回写缓存,性能直指Pentium75,并且功耗要小于Pentium。

■AMD K5(1997年)微处理器,1997年发布。因为研发问题,其上市时间比竞争对手

的"奔腾"晚了许多,再加上性能并不十分出色,这个不成功的产品一度使得AMD 的市场份额大量丧失。K5的性能非常一般,整数运算能力比不上Cyrix x86,但比"奔腾"略强;浮点预算能力远远比不上"奔腾",但稍强于Cyrix 6x86。综合来看,K5属于实力比较平均的产品,而上市之初的低廉的价格比其性能更加吸引消费者。另外,最高端的K5-RP200产量很小,并且没有在中国大陆销售。

,融入当时先进的NexGen 686技术之后的力作。它同样包含了

!整体比较而言,K6是一款成功的作品,只是在性能方面,浮点运算能力依旧低于Pentium MMX 。

,普遍被奉为经典产品。

系列微处理器在K6的基础上做了大幅度的改进,其中最主要的是加入了对"3DNow!"指令的支持。"3DNow!"指令是对X86体系的重大突破,此项技术带给我们的好处是大大加强了计算机的3D处理能力,带给我们真正优秀的3D表现。当你使用专门"3DNow!"优化的软件时就能发现,K6-2的潜力是多么的巨大。而且大多数K6-2并没有锁频,加上0.25微米制造工艺带给我们的低发热量,能很轻松的

使用。也就是从K6-2开始,超频不再是

的专有名词。同时,K6-2也继承了AMD 一贯的传统,同频型号比Intel 产品价格要低25% 左右,市场销量惊人。K6-2系列上市之初使用的是"K6 3D"这个名字("3D"即"3DNow!"),待到正式上市才正名为"K6-2"。正因为如此,大多数K6 3D为ES(少量正式版,毕竟没有量产)。K6 3D曾经有一款非标准的250MHz 产品,但是在正式的K6-2系列中并没有出现。K6-2的最低频率为200MHz,最高达到550MHz。

是128KB),并以CPU 的主频速度运行。而曾经Socket 7主板上的L2此时就被K6-3自动识别为了L3,这对于高频率的CPU来说无疑很有优势,虽然K6-3的浮点运算依旧差强人意。因为各种原因,K6-3投放市场之后难觅踪迹,价格也并非平易近人,即便是更加先进的K6-3+出现之后。

在某段时间内对数据的访问,称之为全历史计数缓冲器)比起Athlon来足足大了4倍,并在分支测错前流水线中可以容纳更多指令数,AMD 在整数调度程序上的改进让K8的管线深度比Athlon多出2级。增加两级线管深度的目的在于提升K8的核心频率。在K8中,AMD 增加了后备式转换缓冲,这是为了应对

在服务器应用中的超大内存需求。

,原生架构基于65nm 工艺技术。和Intel Kentsfield 四核不同的是,Barcelona并不是将两个双核封装在一起,而是真正的单芯片四核心。

Barcelona中的一项重要改进是被 AMD 称为“SSE128”的技术,在K8架构中,处理器可以并行处理两个SSE指令,但是SSE执行单元一般只有64位

。对于128位的SSE操作,K8处理器需要将其作为两个64位指令对待。也就是说,当一个128位SSE指令被取出后,首先需要将其解码为两个micro-ops,因此一个单指令还占用了额外的解码端口,降低了执行效率。

当年当AMD 将内存控制器集成至CPU 内部时,我们看到了崭新而强大的K8构架。如今,

的内存控制器在设计上将又一次极大的改进其内存性能。

受工艺技术方面的影响,

的缓存容量一直都要落后于Intel,AMD 自己也清楚自己无法在宝贵的die上加入更多的晶体管来实现大容量的缓存,但是擅长创新的AMD却找到了更好的办法——集成内存控制器。

■领先的性能满足当今最迫切的商务需求

数据中心的管理者们面对日益增长的压力,诸如网络服务、数据库应用等的企业工作负载对计算的需求越来越高;而在当前的IT支出环境下,还要以更低的投入实现更高的产出。迅速增长的新计算技术如云计算和虚拟化等,在2012第二季度实现了60%的同比增长率3%,这些技术在迅速应用的同时也迫切需要一个均衡的系统解决方案。最新的四核AMD皓龙处理器进一步增强了AMD独有的直连架构优势,能够为包括云计算和虚拟化在内的日渐扩大的异构计算环境提供具有出色稳定性和扩展性的解决方案。

具有改进的 AMD 直连架构和AMD 虚拟化技术(AMD-V(TM)),45nm四核皓龙处理器成为已有的基于AMD 技术的虚拟化平台的不二选择,2012年全球的OEM厂商已基于上一代AMD 四核皓龙处理器推出了9款专门为虚拟化应用而设计的服务器。新一代处理器可提供更快的

转换时间,并优化快速虚拟化索引技术(RVI)的特性,从而提高虚拟机的效率,AMD 的AMD-V(TM)还可以减少软件虚拟化的开销。

与历代的 AMD 皓龙处理器相比,新一代四核皓龙处理器带来了前所未有的性能和每瓦性能比显著增强,包括:

1.以与上代四核皓龙处理器相同的功耗设计,大幅提高 CPU

和超强的处理器设计与验证能力。

容量提高200%,达到6MB,增强虚拟化、数据库和Java等内存密集型应用的性能。

3.支持 DDR2-800 内存,与现有AMD 皓龙处理器相比内存带宽实现了大幅提高,并且比竞品使用的Fully-Buffered DIMM 具有更高的能效。

■ 无可匹敌的节能特性

AMD 皓龙处理器业已带来了业界领先的X86 服务器处理器每瓦性价比,与之相比,新一代45 nm 四核AMD 皓龙处理器在空载状态的

可以大幅降低35% ,而性能可提高达35% 。“上海”采用了众多的新型节能技术:AMD 智能预取技术,可允许

在空载时进入“暂停”状态,而不会对应用性能和

中的数据有任何影响,从而显著降低能耗;AMD CoolCore(TM) 技术能够关闭处理器

工作区域以进一步节省能耗。

在平台配置相似的情况下,基于 75 瓦AMD 四核皓龙处理器的平台,与基于50 瓦处理器的竞争平台相比,具有高达30% 的每瓦性能比优势。相似平台配置下,基于AMD 四核皓龙处理器2380 的平台,空载状态的

为138 瓦;与之对比,基于

■前所未有的平台稳定性

作为唯一用相同的架构提供2 路到8 路服务器处理器的X86

制造商,AMD 新一代45 nm 四核皓龙处理器在插槽和散热设计与上代四核和双核AMD 皓龙处理器兼容,延续了AMD 的领先地位。这可以帮助消费者减少平台管理的复杂性和费用,增强数据中心的正常运行时间和生产力。新的45 nm 处理器适用于现有的Socket 1207 插槽架构,未来代号为“Istan”bul”的AMD 下一代皓龙处理器也计划使用相同插槽。

作为业内最易于管理和一致的x86服务器平台,由于采用AMD皓龙处理器,至少是部分原因,全球OEM和系统开发商能够迅速完成验证流程,并预计从本月起开始交付基于增强的四核AMD皓龙处理器的下一代系统。本季度和2009年第一季度,基于增强的四核AMD皓龙处理器的系统的供应量有望迅速增长。

惠普工业标准服务器业务部营销副总裁Paul Gottsegen 表示:“通过采用基于新‘上海’处理器的 HP ProLiant 服务器,客户可以降低成本,同时使能效和性能更上层楼。在与AMD公司过去的4年合作中,我们为各种规模的客户提供了基于AMD 皓龙处理器的平台,并取得了空前的成功。初期反馈结果表明‘上海’将成为赢者。”

1.采用直连架构的 AMD

)(TM) 处理器可以提供领先的多技术。使IT管理员能够在同一服务器上运行32 位与64 位应用软件,前提是该服务器使用的是64 位操作系统。

2.AMD速龙(Athlon64),又叫阿斯龙(TM) 64 处理器可以为企业的台式电脑用户提供卓越的性能和重要的投资保护,具有出色的功能和性能,可以提供栩栩如生的数字媒体效果包括音乐、视频、照片和DVD 等。

3.AMD双核速龙(TM) 64(AthlonX2 64 )处理器可以提供更高的多任务性能,帮助企业在更短的时间内完成更多的任务(包括业务应用和视频、照片编辑,内容创建和音频制作等)。这些强大的功能使其成为那些即将上市的新型媒体中心的最佳选择。

(TM)64(Turion64)移动计算技术可以利用移动计算领域的最新成果,提供最高的移动办公能力,以及领先的64 位计算技术。

(TM)(Sempron64)处理器不仅可以为企业提供出色的性价比,而且可以提高员工的日常工作效率。

(TM)(Phenom)处理器全新架构的 4 核处理器,进一步满足用户需求(在命名中取消“64”,因为现今的CPU 都是64 位的,不必再标明)。为满足消费者的不同需求,AMD 于2008年5月也推出了3 核羿龙产品。

对于消费者,AMD 也提供全系列64 位产品。

* AMD 毒龙(TM) (Duron)处理器可以说是雷鸟的精简便宜版,架构和雷鸟处理器一样,其差别除了时脉较低之外,就是内建的L2 Cache,只有64 K 。

AMD 的嵌入式解决方案以

以外的上网设备为目标市场,锁定的目标产品包括平板电脑、汽车导航及娱乐系统、家庭与小型办公室网络产品以及通信设备。AMD

(TM) 解决方案系列不仅包括基于

的嵌入式处理器,还包括多种系统解决方案。AMD 的一系列Alchemy(TM) 解决方案有低功率、高性能的MIPS(TM) 处理器、无线技术、开发电路板及参考设计套件。随着这些新的解决方案相继推出,AMD 的产品将会更加多元化,有助确立AMD 在新一代产品市场上的领导地位。

芯片,将具有多达16个核心,该amd芯片预计将在2014下半年投入到服务器应用中。因由此款

芯片的推出,amd也正在成为首家针对低功耗和高性能服务器提供

架构的处理器解决方案的公司,这样amd的产品线将会扩充为由

amd推出超低功耗处理器至尊移动

来应对快速发展的移动互联网市场,amd在获得

选择大奖的同时得到了合作伙伴的高度肯定。

amd面向高密度服务器市场的

处理器,也随着amd在2014年服务器战略和路线图的公布揭开了神秘面纱,amd也成为第一家提供

服务器处理器的公司,amd产品首先应用于云计算和数据中心服务器,适用于大数据分析的场景。

amd坚持服务器领域的

双架构战略。amd还明确表示不会把

放在消费级市场。由于已经有很多企业为消费类产品提供

,并且其中一些消费类应用对处理能力需求不高,因此amd会把

主要应用到企业端,以及嵌入式和半定制化这三大市场上。

的处理器,amd应用于全新的皓龙产品线,amd将致力于

高端服务器,增加高性能市场投入。

amd还将推出第一个自主设计的

架构核心,也会将应用于服务器。除此之外,amd还适用于嵌入式、半定制、超低功耗等场景。

AMD史上最强催化剂驱动!

,没有按照数字序列命名,而是叫做“Catalyst Omega”。

它和N年前同名的改版催化剂并无关系,而更新内容之丰富、之重要,绝对是催化剂史上独一份。

驱动已在2014年12月9日正式发布。

比多数高端电视都更好的画质,低功耗APU流畅播放蓝光

自动视频改善,改进压缩视频算法。

- 移除压缩带来的残影

- 让低分辨率视频媲美1080p压缩视频的感官

- 改进频率响应,消除过曝、噪点

以高分辨率渲染游戏,然后显示在低分辨率显示器上。

- 能在游戏设置中选择更高分辨率

- 与游戏、引擎无关,全部支持

- 可通过催化剂控制中心开启和控制

- 模拟超采样抗锯齿(SSAA)暂不支持

(DSR),AMD则回应以视觉超分辨率(VSR)。事实上,高分辨率渲染、低分辨率输出并不是新鲜事儿,不过都开始大力宣传了。

更新日志里说了好处,这里补充一下不足,尤其是

很多游戏对更高分辨率的优化不到位,反而还不如开启抗锯齿效果更好

定制,提升其A卡性能。

- 同步兼容显示器与显示内容的帧率

- 显示器合作伙伴认证与驱动支持

-显示器产品2015年第一季度上市,三星首发

因为基于行业标准,FreeSync无需额外硬件,只要有最新的DisplayPort接口就好。

NVIDIA技术虽然先行,但是比较封闭、复杂,成本也较高。会低头吗?

支持最多24个屏幕!需要四颗GPU,仅限Windows

- 快速设置覆盖、混合参数

- 统一系统配置,定制更强

- 无需第三方硬件和软件

1、显示模式枚举,缩短显示器接入、使用时间。

3、R9 285支持旋转宽域,可混合使用横屏、竖屏显示器。

4、第一阶段视频解码支持VAAPI(视频加速API),Linux系统。

5、可配置的UVD(统一视频解码器)会话,最多20个同步视频流,尤其适合视频监控。

6、颜色伽马重绘,OEM可使用新的API在宽伽马显示器上增强sRGB色彩,使之更加自然。

8、Windows安装程序改进,点击数更少,窗口尺寸匹配显示器。

9、Windows自动检测软件工具,改进硬件检测功能。

2、R9 290X发布以来性能已经累计提升19%。

1、14.9正式版安装后间歇性崩溃或黑屏。

3、开启硬件加速观看YouTube视频有时崩溃。

4、开启硬件加速通过Google Chrome观看Flash在线视频有时导致浏览器假死。

5、显示器间歇性休眠无法唤醒。

6、AHCI芯片组驱动有时导致系统启动时崩溃。

7、144Hz显示器交火系统启动D3D程序时可能间歇性崩溃。

8、四路交火游戏卡顿或屏幕撕裂。

10、电视关闭再开启后,HDMI音频始终关闭。

,进入0.18 微米制程时代,并首次配备了PowerNow 降频技术。

在笔记本电脑市场获得热烈的市场反响。

2003 年9 月AMD 正式推出支持64 位技术的移动版本的Athlon 64 系列处理器,移动处理器正式进入64 位运算时代。

2005 年4 月AMD 发布Turion 64 移动处理器,引起市场广泛关注,AMD 的移动平台从此成为一个独立的整体,与桌面平台从名称方面完全分离。

2008 年6 月AMD 发布Puma 移动平台,标志着AMD 也正式进入移动平台时代。

HD7970基于全新的GCN图形构架,拥有超过43亿的晶体管规模。与上代的

Unit由Cayman的96个增加到了128个,但同时构成后端的ROP与Cayman维持相同,均为32个。HD7970拥有全新设计的MC结构,6个64bit双通道显存控制器组合形成了全新的384bit显存控制单元,HD7970也因此采用了容量达3072MB的显存体系。

3、负责处理运算任务及Pixel Shader的32个CU(Compute Unit)集群,包含在CU内部负责处理材质以及特种运算任务如卷积、快速傅里叶变换等的Texture Array,二级线程管理机制以及与它们对应的shared+unified cache等缓冲体系。

5、负责视频回放及处理的UVD3.0单元,以及全新的负责视频编码部分的VCE。

7、在功耗控制、实际生产成本控制方面、可持续扩展等比较实际的方面,AMD的GPU架构设计具有极其明显的优势。

Fusion 并非单颗处理器的代号,而是一系列CPU/GPU 整合平台的总称。

AMD于2011年1月5日,终于在CES 2011开幕之际正式发布了筹备多年的Fusion APU融合加速处理器,也宣告了融合时代的正式带来。

)处理器架构、DX11 GPU图形核心的低功耗版本,最多两个处理器核心,采用台积电40nm工艺制造。AMD称,山猫是其2003年以来的首个全新x86内核,专为低功耗便携式设备而设计。

AMD Fusion APU首套平台代号“Brazos”,又称“2011低功耗平台”,芯片组统一采用单芯片设计的Hudson-M1,处理器包括两个子系列:

-Ontario C系列:C-50 1.0GHz双核心、C-30 1.2GHz单核心,热设计功耗9W,面向高清上网本、平板机和其他新兴设备

在2011Computex 台北电脑展上AMD又推出了针对平板机市场的Z系列APU:

-Z系列:AMD Z-01 APU,隶属于Brazos平台,拥有两个山猫架构处理器核心,主频1.0GHz,整合图形核心Radeon HD 6250,80个流处理器,热设计功耗5.9W,搭配AM50 FCH芯片组。Z0-1是AMD第一款专门针对平板机推出的APU产品。

2011年6月,AMD在首届Fusion 开发者峰会上,AMD推出了基于K10处理器架构、DX11独立显卡级别图形核心的高性能版本“Llano”APU,最多四个处理器核心,GlobalFoundries 32nm工艺制造。Llano APU处理器被命名为A系列,组建“2011主流平台”。

-Llano A系列:Llano A系列APU是专为高效能笔记型计算机与桌上型计算机设计的产品它分为A4、A6、A8 三个系列:

VISION A4系列电脑将满足Brilliant HD日常应用需求,最适合网页浏览、基本的多任务处理与社交网络。

VISION A6系列电脑将带来Brilliant HD 卓越娱乐性能,让消费者能同时进行

、照片编辑与高清影片播放。

VISION A8系列电脑将带来Brilliant HD至尊性能,让消费者能同时进行多任务处理、在线游戏与视频编辑。

AMD还提出了新的功耗管理概念“AllDay”,声称AMD Fusion技术可带来全天候的电池待机,续航时间长达10小时甚至更久。AMD Fusion APU主打高清应用,包括DX11游戏、网络视频、蓝光节目等等,而这些都得益于其VISION视觉引擎,包括DX11图形核心、UVD3视频解码引擎、并行处理加速能力、一体化显卡驱动等等。

AMD Fusion APU已经得到了整个业界大量硬件、软件厂商的普遍支持,都正在或即将在高性价比或主流价位上发布各种相关产品。

2011年6月AMD正式发布了全新的主流笔记本平台——“

”,Sabine平台采用了代号为

的A系列APU。本次AMD一共发布了七款APU。

  • .凤凰网[引用日期]
  • 3. .网易科技[引用日期]
  • 4. .维基百科(英文)[引用日期]
  • .驱动之家[引用日期]
}

我要回帖

更多关于 金士顿4g 的文章

更多推荐

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

点击添加站长微信