Intel系统编程指南第十一章——11.3 可用的cache方法

翻译 2011年01月23日 00:01:00

处理器允许系统存储器的任一区域被cache在L1、L2、L3 Cache中。在系统存储器单独的页或区域中,它允许cache类型(也称为存储器类型)被指定(见11.5小节)。当前为Intel 64和IA-32架构所定义的存储器类型为:(见表11-2)

 

1、强不可被cache的(UC)——系统存储器位置不被cache。所有出现在系统总线上的读写以程序次序,不带无序被执行。没有投机的存储器访问、页表遍历、或投机目标分支的预取。这种类型的Cache控制对于存储器映射的I/O设备是有用的。当以正常的RAM使用时,这会极大地降低处理器的性能。

注:在UC存储器中作为操作数的FP和SSE/SSE2操作的行为是依赖于实现的。在某些实现中,对UC存储器的访问可能会发生超过一次。为了确保可预测的行为,使用通用目的寄存器的加载和存储来访问UC存储器可能会有读或写副作用。

 

2、不可被cache的(UC-)——与强不可被cache的(UC)存储器类型具有相同特征,除了该存储器类型可以通过对WC存储器类型的MTRR的编程来覆盖。此存储器类型可以用在从奔腾III处理器开始的家族,并只能通过PAT(译者注:页属性表)来选择。

 

3、写绑定(WC)——系统存储器位置不被cache(作为与不可被cache的存储器一起)并且一致性不受处理器的总线一致性协议强迫。投机读被允许。写可以被延迟并联结在写绑定缓存(WC缓存)中,以减少存储器访问。如果WC缓存被部分填充,那么写可以被延迟,直到下一次出现一次串行化事件;诸如SFENCE或MFENCE指令,CPUID执行,一次对非被cache的存储器的读或写,一次中断发生,或一条LOCK指令执行。这种cache控制类型适用于视频帧缓存,对于这种缓存,写次序是不重要的,只要写更新了存储器,这样它们能在图形显示上被看见。见11.3.1小节。这个存储器类型在奔腾Pro以及奔腾II处理器上可用,通过编程MTRR;或在从奔腾III处理器开始的处理器家族,通过编程MTRR或通过PAT来选择它。

 

4、通写(WT)——对系统存储器的读写被cache。基于Cache命中,读来自Cache行;读错过导致Cache填充。投机读被允许。所有写被写到一个Cache行(当可能时)并直通到系统存储器。当写通过存储器时,无效的Cache行不被填充,而有效的 Cache行要么被填充,要么被无效化。写绑定被允许。这种类型的Cache控制适用于帧缓存,或当系统总线上有访问系统存储器的设备,但不执行存储器访问的窥探时。它迫使处理器中的Cache与系统存储器之间的一致性。

 

5、回写(WB)——对系统存储器的读写被cache。来自Cache行的读作为Cache命中;读错过导致Cache填充。投机读被允许。写错过导致Cache行填充(在P6家族处理器开始的处理器家族中),并且写完全在Cache中被执行,当可能时。写绑定被允许。写回存储器类型通过消除许多不必要的对系统存储器的写来减少总线交通。对一个Cache行的写不会立即被转运到系统存储器;取而代之的是它们可以在Cache中被积累。被修改的Cache行稍候被写到系统存储器,当一次写回操作被执行时。当Cache行需要被释放时,写回操作被触发,诸如当新的Cache行正在一个已被填满的Cache中被分配时。它们也被用于维护Cache一致性的机制触发。这种类型的Cache控制提供了最佳性能,但它要求系统总线上的所有访问系统存储器的设备能够窥探存储器访问,以确保系统存储器和Cache一致性。

 

6、受保护的写(WP)——当可能时,读来自于Cache行,而读错过导致Cache填充。写被传播到系统总线,并且使得在总线上的所有处理器上的相应Cache行被无效化。(译者注:比如地址0x1000的数据被分别映射在了处理器0和处理器1各自的L1 Cache。当其中一个处理器对此地址进行WP写操作时,那么这两个处理器的相应与地址0x1000所在的Cache行均被无效化。)投机的读被允许。这个存储器类型在开始于P6家族处理器的处理器家族中可用,通过编程MTRR(见表11-6)。

 

11.3.1 写绑定的存储器位置的缓冲

 

对WC存储器类型的写对于一般被cache的字而言不会被cache。它们被保留在一个内部的写绑定缓存(WC缓存),此缓存从内部的L1、L2、L3 Cache和存储缓存分离开来。WC缓存不被窥探,因而并不提供数据一致性。对WC存储器的写的缓冲被完成,以允许软件在一小段时间提供更多被修改的数据到WC缓存,而剩下的尽可能对软件而言是非侵入的。对WC存储器的写的缓冲也使得数据被破坏;即对同一存储器位置的多次写将留下最后被写到该位置的数据,而其它写将会被丢失。

WC缓存的大小和结构并不是架构上定义的。对于Intel酷睿2 Duo、Intel凌动、Intel酷睿Duo、奔腾M、奔腾4和Intel至强处理器,WC缓存由若干个64字节的WC缓存组成。对于P6家族处理器,WC缓存由若干个32字节 WC缓存组成。

当软件开始写WC存储器时,处理器开始填充WC缓存(译者注:复数),一次一个。当一个或多个WC缓存已被填充好时,处理器可以选择将缓存中的数据驱逐到系统存储器中。驱逐WC缓存的协议是依赖于实现的,并且不应该为系统存储器一致性而依赖于软件。当使用WC存储器类型时,软件必须对写数据到系统存储器正在被延迟这一事实而敏感,并且必须故意清空WC缓存(译者注:通过SFENCE或MFENCE)当系统存储器一致性被要求时。

一旦处理器开始从WC缓存将数据驱逐到系统存储器中时,它将会做出一个总线事务类型的决定,基于缓存含有多少有效数据。如果缓存满了(比如所有字节都是有效的),那么处理器将会在总线上执行一次爆写(burst-write)事务。这导致所有32个字节(P6家族处理器)或64个字节(奔腾4或更新的处理器)在数据总线上以一单次爆发(burst)事务被传输。如果一个或更多的WC缓存的字节是无效的(比如,没有被软件写),那么处理器将此数据使用“部分写”事务传递到存储器,一次一个块(chunk)(而一个“块”是8个字节)。

这将会导致最大4次部分写事务(对于P6家族处理器)或8次部分写事务(对于奔腾4或更新的处理器),对于一个将数据发送到存储器的WC缓存。

WC存储器类型被定义为弱次序的。一旦一个WC缓存的驱逐开始,数据将受到WC存储器定义的弱次序语义的支配。次序在相继的WC缓存的分配/释放之间不被维护(比如对WC缓存1的写,后面紧跟对WC缓存2的写,可能在总线上会出现缓存1跟在缓存2的后面)。当一个WC缓存作为部分写被驱逐到存储器时,不能保证相继部分写之间的次序(比如,一次对块2的部分写可能在总线上会在对块1的部分写之前出现,或反之亦然)。

WC传播到受保障的系统总线的仅有元素是那些由事务原子性提供的。比如,在一个P6家族的处理器中,一个完全填满的WC缓存将总是被传播为一单次32位(译者注:这可能是撰写者的笔误,这里应该为32字节)爆发事务,使用任一块次序。在一个WC缓存驱逐中,在缓存里的数据将作为部分被驱逐,所有被包含在同一个块(0模8对齐)的数据将被同时传播。同样地,对于从基于Intel NetBurst微架构开始的更新的处理器,一个填满的WC缓存将总是作为一单次爆发事务被传播,使用在一事务内的任一块次序。对于部分缓存传播,所有包含在同一块内的数据将被同时传播。

 

11.3.2 选择一种存储器类型

 

最简单的系统存储器模型并不使用带有读或写副作用(译者注:即读或写无法被其它处理器或设备观察到。广义上讲,所谓的“副作用”就是指一个功能或操作执行后会对结果产生不一致性,比如每次的输入都相同,但在某些情况下每次的输出结果并不相同)的存储器映射I/O,并不包含一个帧缓存,并对所有存储器使用写回存储器类型。一个I/O代理可以执行直接存储器访问(DMA)来写回存储器,并且Cache协议维护Cache一致性。

一个系统可以为其它存储器映射I/O使用强不可被Cache存储器,并且总是为带有读副作用的存储器映射I/O使用强不可被Cache的存储器。(译者注:如果对存储器映射I/O使用通写或回写Cache的话,那么如果读访问Cache命中,那么将直接从Cache中获取数据,而不是通过存储器映射I/O,这将导致读副作用。)

双端口的存储器可以被认为有一个写副作用,使得相对迅速的写是要获得的。因为那些写不能在另一端口被观察到,直到它们到达存储器代理。一个系统可以为含有被显示在一个屏幕上的像素之的帧缓存或双端口存储器使用强不可被cache的,不可被cache的、通写、或写绑定存储器。帧缓存存储器一般较大(几兆字节)并且通常处理器会对它的写比读要多。对一个帧缓存使用强不可被cache存储器会产生非常大量的总线交通,因为对整个缓存的操作是使用部分写而不是行写来实现的。对一个帧缓存使用通写存储器会替换处理器中L2和L3的Cache以及L1的数据Cache的几乎所有其它有用的Cache行。因此,每当可能时,系统应该对帧缓存使用写绑定存储器。

软件可以使用页级Cache控制以分配合适有效的存储器类型,当软件不以从写回cache获利的方式访问数据结构时。比如,软件可能要读一个大的数据结构一次,而并不访问此数据结构,直到此数据结构被另一个代理重写。这样的一个大的数据结构应该被标记为不可被cache的,或者读它将驱逐处理器将会再次引用的那个被cache的行。

一个类似的例子将是一个只写数据结构(将数据输出到另一个代理),但从不被软件读。这样的一个数据结构可以被标记为不可被cache的。因为软件从不读它所写的值(但正如不可被cache的存储器,它将使用部分写被写,而作为写回存储器,它将使用行写被写,而这将不会发生,直到另一个代理读此结构并触发隐式的写回)。

在奔腾III,奔腾4,或更新的处理器上,提供了新的指令给软件对数据的cache、预取以及写回特征更大的控制。这些指令允许软件使用弱次序的或处理器次序的存储器类型来提升处理器性能,而当必要时,迫使对存储器读或写使用强次序。它们也允许软件对cache数据有更大的控制。对于这些指令以及其使用意图,见11.5.5小节。

 

11.3.3 在不可被cache的存储器中的取代码

 

程序可以从不可被cache的(UC)存储器执行代码,但含义与从UC存储器中访问数据不同。当做取代码时,处理器不会投机地从可被cache的代码变迁到UC代码。它也不会投机地取结果为UC代码的分支目标。

处理器可以取同一个UC Cache行多次,为了一次译码一条指令。它可以在一条Cache行中译码连续的UC指令,而不需要在每条指令之间取指。它也可以从同一个或连续的4KB页取额外的Cache行为了译码一条非投机的UC指令(这可以是真的,甚至当该指令被完整地包含在一个行中)。

因为上述所描述的,以及因为Cache行大小在未来的处理中可能会改变,软件应该避免将带有读副作用的存储器映射I/O放在同一个页中,或放在后面的一个页中,用于执行UC代码。

相关文章推荐

Intel系统编程指南第十一章——11.1 内部Cache、TLB和缓存

Intel系统编程指南第十一章——11.1 内部Cache、TLB和缓存

Intel系统编程指南第十一章——存储器Cache控制

Intel系统编程指南第十一章——存储器Cache控制

Intel系统编程指南第十一章——11.11 存储器类型范围寄存器(MTRR)

Intel系统编程指南第十一章——11.11 存储器类型范围寄存器(MTRR)

Intel处理器手册系统编程指南第2章(1)

第2章系统架构概观 IA-32架构(从Intel386处理器系列开始)为系统软件提供了额外的支持。这个额外的支持提供多种操作模式,包括: 实模式、保护模式、虚拟8086模式和系统管理模式。...
  • Firas
  • Firas
  • 2013年02月20日 18:36
  • 1421

linux shell编程指南第十一章------------合并与分割1

j o i n用来将来自两个分类文本文件的行连在一起。如果学过S Q L语言,可能会很熟悉j o i n 命令。 下面讲述j o i n工作方式。这里有两个文件f i l e 1和f i l e 2,...

JNI编程指南-第十一章 JNI设计思想概述

第十一章 JNI设计思想概述   本章是JNI设计思想的一个概述,在讲的过程中,如果有必要的话,还会对底层实现技术的原理做说明。本章也可以看作是JNIEnv指针、局部和全局引用、字段和方法ID等...

Java本地接口(JNI)编程指南和规范(第十一章)

原文链接:http://blog.sina.com.cn/s/blog_53988c0c0100ospe.html 第三部分:规范(Part Three: Specification...

IA-32卷3:系统编程指南

  • 2013年05月04日 23:18
  • 2.44MB
  • 下载

Intel Threading Building Blocks 编程指南:简单循环的并行化

可伸缩并行化的最简单的形式就是能够互不干涉地同时运行的迭代的循环。本节将会说明如何将简单的循环并行化。 定义 Intel Threading Building Blocks(Intel TBB) 组件...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Intel系统编程指南第十一章——11.3 可用的cache方法
举报原因:
原因补充:

(最多只允许输入30个字)