天天看点

CACHE的一些基本概念

Allocation

         在CACHE中发现一个位置,并把新的cache数据存到这个位置的过程。这个处理过程可能包括evicting(驱逐)cache中已存在的数据,从而为新的数据腾出空间。

Associativity

         指每个Set(集)里包含的line frames(行帧)数。也就是cache的way(路)数。

Capacity miss容量失效

         因为cache的容量限制,导致不能包括一个程序的整个working set(工作集),从而造成cache失效。这是三个cache失效原因(容量、强制、冲突)之一。

Clean干净

         一个有效的cache行,它的内容没有被更高层内存或CPU修改写过,我们称这个cache行是“干净”的,显然相反状态是dirty(“脏”)

Coherence一致性

         如果读内存任意地址的数据返回的总是这个地址的数据最近的更新,我们说内存系统是一致的。存取指CPU和EDMA等的存取。

Compulsory miss强制失效

         有时称为首次引用失效。强制失效是一种肯定发生的一种失效,因为数据事先从没有使用过也就没有机会被cache。但有些情况也被称为强制失效,尽管它们不是第一被引用的数据,比如对非写定位的cache进行同一位置的重复写,以及对一个不被cache内存区域的存取。这是三个cache失效原因(容量、强制、冲突)之一。

Conflict miss 冲突失效

         由于Associativity的限制导致的而非容量限制造成的cache失效。

Direct-mapped cache直接映射cache

         直接映射cache映射低层内存的每个地址到cache的一个单一位置。这样低层内存的多个地址可能被映射到cache中的同一位置上。它相当于1-way set-associative cache。

Dirty脏

         对writeback回写cache,写到达多级存储结构的某一层,并更新这一层内容,但并不更新更低层的内存,这样,当一个cache行有效并包含更新后的数据,但却不更新下一更低层的内存,我们说这个cache是“脏”的,显然一个有效行的相反状态是“干净”。

DMA直接内存存取

         直接内存存取,通常一个DMA操作copy一个内存块从一个区域到另一个区域,或在外设和内存之间传输数据。对C64x DSP,DMA传输使用EDAM,这些DMA传输与程序执行是并行的。从cache一致性角度,EDMA的存取可以看成是另外一个并行处理器。

Eviction驱逐

         从cache移出一个line从而为新的数据腾出空间的过程我们成为Eviction。Eviction可以由用户发出的writeback-invalidate产生,被驱逐的line我们称为victim line。当victim line是dirty(“脏”)的时候,数据必须回写道下一级存储器中以维持内存的一致性。

Execute packet执行包

         在一个周期里并行执行的一个指令块,一个执行包可以包含1-8个指令。

Fetch packet取指包

         1个周期里存取的包含8条指令的指令块。显然一个取指包可以包含多个执行包,这样可能消耗多个周期。

First-reference miss首次引用失效

         是强制失效的一种形式。见强制失效。

Fully-associative cache全关联cache

         任何内存地址都可以被存储在cache的任何位置。这样的cache非常灵活,但通常硬件上不可实现。这种cache同直接映射cache和集关联cache形成鲜明对比,这两种cache在定位策略方面都有更多的限制,全关联cache只具有概念上的意义,当分析直接映射cache和集相关cache性能时对区分冲突失效和容量失效是有用的,全关联cache等价于这样一个集关联cache:它有line frame个way,仅有一个set。

Higher-level memory高层内存

在多级内存系统中,距离CPU较近的内存称为高层内存。在C64x系统中,最高层内存通常是L1层CACHE,这一层的内存直接同CPU相连。较高层内存通常充当较低层内存的CACHE。

Hit命中

         当请求的内存地址的数据在cache中,我们说cache命中。命中的反义词是miss(失效)。Cache的命中使cpu的阻塞时间最短,因为才cache中去数据要比从原始位置取更快。在某一层内存的“失效”可能在较低层“命中”。

Invalidate无效

         将一个有效的行标记为无效行的过程。这相当于废弃了这一行的内容,但并不回写任何更新的数据。当与writeback组合时,会先将dirty数据更新到保存有这个地址的下一层内存。这通常用于维持内存的一致性。

Least Recently Used(LRU)allocation

         对于set-associative和fully-associative cache,最近最少使用原则被用来一个set里选择一个line frame作为被驱逐的line,用来保存新的cache数据。

Line行

         是cache处理的最小单位块。显然一个cache行的尺寸要比CPU或高层内存存取的数据尺寸要大。例如尽管CPU可以进行单字节的存取,但如果发生一次读失效,则cache会将整个cache行的数据读入。

Line frame行帧

         Cache的一个位置,包含被cache的数据(一行)、一个关联的tag地址,这个行的状态信息。状态信息包括这一行是否valid(有效)、dirty(脏)、LRU状态

Line size行尺寸

         一个行的尺寸,单位字节。

Load through

         当CPU请求在第一级和第二级cache中都失效时,数据从外部内存获得,同时会存储在第一级和第二级内存中,如果一个cache,它保存数据并同时把数据送到高一层cache中,这种cache我们称之为load-through cache。相对于那种首先存储数据到低层然后第二步再把数据送到高层的cache,这种cache可以减少阻塞时间。

Long-distance access长距离存取

         CPU对不被cache内存区域数据的存取。显然,由于这种存取,不会影响cache的状态,但速度会比较慢。

Lower-level memory 低层内存

         在多级内存系统中,距离CPU较远的内存称为低层内存。在C64x系统中,最低层内存包括L2以下的外部系统内存和内存映射的外设。

LRU

         表示cache line的最近最少使用的状态信息。

Memory ordering内存访问排序

    定义在内存里以什么样的顺序看内存操作的结果,有时称为consistency(连贯性)。在分级结构的特定层的强内存访问排序表示在这一层上不可能以不同与程序序的顺序来观察内存存取的结果。松散内存访问排序允许内存分级体系结构以不同的顺序看内存操作的结果,注意强排序并不要求系统内存以程序序顺序操作,而仅仅是使操作的结果在其它请求者看来是与程序序一致的。

Miss失效

         当请求的内存地址的数据不在cache中,就是说发生了cache失效。一个cache失效,会引起阻塞请求者直到line frame被定位,数据从低层内存中获得为止。在某些情况下,比如CPU对L1D出现写失效,阻塞CPU是不必要的。Cache失效通常分为三种类型:强制失效、冲突失效和容量失效。

Miss pipelining

         服务单一的cache失效的过程需要多个流水周期。如果对连续的失效处理进行流水线操作,显然就增加对失效处理的效率,降低了阻塞周期。

Read allocate

读失效cache是仅在发生读失效时才在cache中定位空间并把数据读入。写失效发生时不会产生数据读入到cache中,而是直接把写数据送到下一层cache中。

Set集

         Line frames的一个集合。直接映射的cache一个set包含一个line frame,N-way set-associative cache每个set包含N个line frame。Full-associative cache仅有一个set,这个唯一的set包含所有的line frames。

Set-associative cache集相关cache

         一个set-associative cache包含多个line frames用于cache低层内存。当为一个新的line数据定位一个空间时,选择哪个line frame是基于cache的定位策略的。C64x是基于LRU策略的。

Snoop侦测

         是lower-level memory(低层内存)查询higher-level memory(高层内存)以确定高层内存是否包含给定地址的数据的一种方法。Snoop的主要目的是通过允许低层内存请求高层内存进行数据更新来维持内存的一致性,snoop操作可以触发writeback(回写),或更普通的writeback-invalidate(回写并无效),触发writeback-invalidate(回写并无效)操作的snoop有时又称为snoop-invalidates。

Tag标签

         地址高位作为一个Tag存储在line中,在决定cache是否命中的时候,cache控制器会查询Tag。

Thrash

         当存取操作引起cache性能遭受严重损坏,我们说thrash cache了。Thrash的原因可以有很多:一个可能是算法在短时间存取太多的数据而很少或根本不重复使用。也就是说working set太大。这样的算法将引起非常严重的容量失效。另一种情况是算法重复存取一小组不同地址的数据,这些数据映射到cache的相同set,这样就人为造成严的冲突失效。

Touch

         对一个给定地址的存储器操作,我们称之为touch那个地址。Touch也可以指读数组元素或存储器地址的其它范围,定位它们在一个特定层cache的唯一目的。一个CPU中心环用作touch一个范围的内存是为了定位它到cache经常被引用作为一个touch环。Touching一个数组是软件控制预取数据的一种形式。

Valid有效

         当一个cache line保存从下一级内存取的数据,那么这个line frame就是有效的。无效状态发生在line frame不保存任何数据,或者说还没有被cache的数据,或先前cache的数据由于某种原因(内存一直性要求、程序要求等)被无效。有效的状态并不表示数据是否已经被修改(其实这有另外的状态来表示,即dirty或clean)。

Victim

从cache移出一个line从而为新的数据腾出空间的过程我们成为Eviction。Eviction可以由用户发出的writeback-invalidate产生,被驱逐的line我们称为victim。当victim line是dirty(“脏”)的时候,数据必须回写到下一级存储器中以维持内存的一致性。

Victim Buffer

         保存victim直到它们背回写的特殊buffer。Victim lines被移到victim buffer,这样位新的数据腾出空间。

Victim Writeback

         当victim line是dirty(“脏”)的时候,数据必须回写道下一级存储器中以维持内存的一致性。我们称这个过程为Victim Writeback

Way

         对set-associative cache,每个set包含多个line frames。每个set包含的line frames数被称为way。以set做为行,line frame作为列,那么一列的line frames集合称为一个way。例如,一个4-way set-associative cache有4个way,每个set有4个关联的line frames,结果,对于一个可cache的内存地址,在cache中有4个可能的映射位置。

Working Set

         程序或算法就是数据和指令代码的集合。在一个特定时间内被引用的这个集合我们称为working set(工作集)。通常,对于一个算法,我们需要考虑高层内存的工作集,对于整个程序我们需要考虑底层内存的工作集。

Write allocate

         对于一个write allocate cache,如果发生写失效,就会定位一个空间并将失效的数据读入到cache中。空间定位按照LRU原则。一旦数据被读入到cache中,就进行写操作,对write allocate cache,仅更新当前层的内存,写的数据并不立刻送到下一层更低的内存。

Writeback回写

         将一个有效的但为脏的cache line回写到较低层内存的过程。回写后的这个cache line我们称之为clean(“干净”)。回写后的cache line状态依然为有效。

Writeback cache回写cache

         回写cache仅修改它自己的写命中的数据,它不会立刻更新下一级较低层内存的内容。数据在将来某时被回写,如:当这个cache line被驱逐时,或当低层内存向高层内存snoop这个地址时,当然也可以直接通过程序发送writeback命令。一个写命中,会引起对应的line被标记为dirty(“脏”),也就是说数据被更新了,但还没来得及更新低层内存。

Writeback-invalidate回写后使无效

将一个有效的但为脏的cache line回写到较低层内存并置这些cache line为无效状态的过程。对C64x,对一组cache line进行Writeback-invalidate时,仅回写那些有效且为脏的cache lines,但却置那一组中的所有cache lines为无效。

Write merging

         Write merging是组合多个独立的写操作成一个、位宽更大的写操作。显然这可以改善了内存系统的性能。例如,对C64x CPU,L1D写缓冲在某些情况下(如果它们是对同一个双字地址的写)能合并多个写。

Write-through cache

         对于一个write-through cache,能把所有的写直接旁路到较低层内存。Cache中永远不包含更新的数据,这样做的结果是cache line永远不会是dirty。C64x的cache并不使用这种cache。

继续阅读