4.2 存储器读写指令的发射与执行1

来源:互联网 发布:柏曼灯具怎么样知乎 编辑:程序博客网 时间:2024/06/08 06:53

CPUCore中,一条存储器指令首先经过取值,译码,Dispatch等一系列操作后,率先到达LSU(Load/Store Unit)部件。LSU部件可以理解为存储器子系统的最高层,在该部件中包含Load QueueStore Queue。其中Load QueueStore Queue之间有着强烈的耦合关系,因此许多处理器系统将其合称为LSQ。在多数处理器的存储器子系统中,LSU是最顶层,也是指令流水线与Cache流水线的联系点。

LSU部件是指令流水线的一个执行部件,其上接收来自CPU的存储器指令,其下连接着存储器子系统。其主要功能是将来自CPU的存储器请求发送到存储器子系统,并处理其下存储器子系统的应答数据和消息。在许多微架构中,引入了AGU计算有效地址以加速存储器指令的执行,使用ALU的部分流水处理LSU中的数据。而从逻辑功能上看,AGUALU所做的工作依然属于LSU

在一个现代处理器系统中,LSU部件实现的功能较为类同。LSU部件首先要根据处理器系统要求的Memory Consistency模型确定Ordering,如果前一条尚未执行完毕存储器指令与当前指令间存在Ordering的依赖关系,当前指令不得被Schedule,此时将Stall指令流水线,从来带来较为严重的系统惩罚;LSU需要处理存储器指令间的依赖关系,如对同一个物理地址的多次读写访问,并针对这种Race Condition进行特殊优化;LSU需要准备Cache Hierarchy使用的地址,包括有效地址的计算和虚实地址转换,最终将地址按照L1 Cache的要求将其分别送入到Tag和状态阵列。

L1 Cache层面需要区分是存储器读和存储器写指令。无论是存储器读还是写指令穿越LSU部件的过程均较为复杂。为缩短篇幅,下文重点关注存储器读指令的执行。存储器读操作获得物理地址后将进行Cache Block的状态检查,是Miss还是Hit,如果Cache Hit,则进行数据访问,在获得所需数据后更新在LSU中的状态信息。

如果在L1CacheMiss,情况略微复杂一些。在现代处理器系统中,Non-Blocking Cache基本上是一个常识般的需求,为此首先需要在MSHR中分配空余Entry,之后通过L1 Cache Controller向其下Memory Hierarchy发送Probe请求。

L1 CacheController中,大多使用Split Transaction发送这个Probe请求,之后经过一系列复杂的操作,这个操作涉及多核之间的Cache一致性,不同的一致性协议对此的处理不尽相同。在获取最终数据之后,回送Reply消息。LSU在收到这个Reply消息后将数据传递给指令流水线,并释放MSHR中的对应Entry

以上这些操作可以并行执行,如使用VirtualCache方式可以直接使用虚拟地址,而无需进行虚实地址转换,可以将数据访问与Tag译码部件重叠,更有一系列预测机制进一步缩短数据Cache访问的延时。

存储器写的过程较存储器读复杂一些,在L1Cache Hit时,会因为状态位的迁移而带来一系列的Bus Traffic;如果在L1 Cache Miss,要首先取得对访问数据的Ownership或者Exclusive。获得Ownership的步骤与存储器读发生Miss时类似,但是只有在存储器写Commitment时,才能将数据真正写入到Cache中。

在微架构的设计中,缩短Cache的访问延时与提高带宽是Cache流水设计的一个永恒话题。这些话题可以空对空的讨论,搭建各类模型得出最后的量化分析报告。但是这些报告面对着ccNUMA处理器多级Cache设计的复杂度时,显得如此苍白无力。

下文以AMDOpteron微架构为主,进一步说明存储器读写的执行过程。我们从Cache Hit时的Load-Use Latency这个重要参数的分析开始,进一步介绍Cache Hierarchy性能的评价标准,最后详细说明Opteron微架构的LSU部件的工作原理。

在多数微架构的数据手册中,Load-UseLatency的计算是从指令进入LSU之后开始计算,以指令从Cache Hierarchy中获得最终数据作为结束。在不同的场景,如其下的Cache Hit或者Miss时,所得到的Load-Use Latency参数并不相同。

CacheHit时,AMD Opteron微架构凭借着Virtual Cache,使得其L1 CacheLoad-Use Latency仅为3Cycle[6],这是一个非常快的实现。在Intel近期发布的Sandy Bridge中,L1 CacheLoad-Use Latency也仅为4Cycle[69]。这个参数不能完全反映在一个处理器系统中Cache Hierarchy的整体Hit Time参数和存储器平均访问时间,远不能仅凭这一个参数得出OpteronCache Hierarchy结构优于Sandy Bridge微架构的结论。

从许多Benchmark的指标上看,Sandy Bridge微架构在Cache Hierarchy中的表现远胜于OpteronVirginia STREAM的测试结果表明OpteronCopyScaleAndTraid测试指标上优于Pentium4,却落后于使用Nehalem XeonApple Mac Pro 2009,如4-1所示。

 

4-1STREAM "standard"results[71]

Data

Machine ID

ncpus

COPY

SCALE

ADD

TRAID

2000.12.23

Generic_Pentium4-1400

1

1437.2

1431.6

1587.7

1575.4

2005.02.04

AMD_Opteron_848

1

4456.0

4503.6

4326.3

4401.4

2009.10.23

Apple_Mac_Pro_2009

1

8427.6

8054.4

8817.4

8953.4

 

CopyScaleAndTraidVirginia STREAM定义的4个操作。其中Copy操作与a(i) = b(i)等效;Scalea(i) = q×b(i)等效;Adda(i) =b(i) + c(i)等效;而Traida(i) =b(i) + q×c(i)等效。由以上操作可以发现,STREAM的测试结果不仅和Cache层次结构相关,而且与主存储器带宽和浮点运算能力相关。这一测试指标并不能作为OpteronNehalem微架构Cache层次结构孰优孰劣的依据。与存储器测试相关的另一个工具是lmbench,不再细述。

这些Benchmark程序在相当程度上反映了Cache和存储器子系统的性能。但是在一个实际项目的考核中依然只能作为参考。对于这个设计,最好的指标一定从自身的应用程序中得出的。很多人会对这个说法质疑,因为许多应用程序的书写异常糟糕,没有用到很多的优化手段。但是面对着由数千万行组成,积重难返的应用程序,更多的人剩下的只有无奈。

IntelNehalemSandy Bridge微架构中,FLC访问延时均为4Cycle[12][69],一个可能的原因是,Intel x86处理器在Pentium IV后并没有采用VIPT(Virtually Indexed and PhysicallyTagged)方式[12][68]组织L1 Cache,而采用了PIPT(Physically Indexed and PhysicallyTagged)方式[1]Opteron微架构使用VIPT方式,访问L1 Cache时可以直接使用Virtual Address,从而可以节省一个时钟周期。但是Opteron的总线位数只有为64位。AMD最新的Bulldozer微架构,将总线位数提高为128b后,Load-Use Latency提高为4

确定存储器平均访问时间除了需要考虑Hit Time参数之外,还需要考虑Miss Penalty参数,Virtual Cache并不能解决所有问题。当L1 Cache Miss时,Opteron微架构访问PIPT结构的L2 Cache时,依然需要使用TLBTLB译码过程最终不会省略。

采用Virtual Cache还会带来CacheSynonym/Alias问题,需要设置RTB(Reverse TranslationBuffer)解决这一问题。使用这种方法除了要使用额外的硬件资源,而且在多核系统中还引入了TLB Consistency的问题。在一个微架构的设计中,Virtual CachePhysical Cache间的选择依然是一个Trade-Off

在抛开VirtualCache的讨论后,我们专注讨论LSU部件。在现代处理器系统中,为了提高存储器读写指令的执行效率,一个微架构通常设置多个LSU部件,这些LSU不是简单的对等关系,而是有相互的依赖关系。

简单对等相当于在一个微架构中设置了多个功能一致,异步执行的LSU部件。为了保证处理器系统Memory Consistency Model的正常运行,这些异步操作需要在运行的某个阶段进行同步处理,从而带来了较大的系统复杂度。这不意味着不采用这种对等设计可以避免这些同步问题,只是相对容易处理。

在多数微架构中,多个LSU部件间通常是各司其职,并非完全对等。Opteron微架构的LSU部件也是采用了非对等的两个LSU部件。在介绍这些内容之前,我们需要了解Opteron微架构的基本组成结构和流水线示意,如42所示。


4.2 <wbr>存储器读写指令的发射与执行1

Opteron微架构中,存储器指令通过FetchdecodeDispatch阶段,并在所有Operands准备就绪后,经由Scheduler launch到对应的执行部件。上图中的Res部件全称为Reservation Station,这是Scheduler的一个重要组成部件。其中存储器读写指令需要使用Integer Scheduler,在这个Scheduler中包含一个AGU和一个ALU

Opteron微架构与存储器指令执行相关的部件由Integer SchedulerLoad/Store QueueL1 Cache和其下的存储器子系统组成。Load/Store Queue即为上文多次提及的LSQ,是Opteron LSU部件的重要组成部分。在LSU部件中除了具有LSQ之外,还有许多异常复杂的控制逻辑和与指令流水线进行数据交换的数据通路,是一个微架构的存储器子系统设计的起始点,是存储器指令的苦难发源地。



[1]尚无可靠详细资料说明SandyBridgeL1 CacheVIPT还是PIPT

0 0
原创粉丝点击