Gem5:Minor CPU 模型内幕 ( Inside the Minor CPU model )

原文出处:http://www.gem5.org/docs/html/minor.html

Minor 简介:

       Minor是有序执行的CPU模型(in-order CPU,有序执行技术的CPU,对应out of order,乱序执行),模型有固定的流水线,和可配置的数据结构和执行行为。模型对严格执行顺序的处理器进行建模,可以通过 minortrace / minorview.py 工具可视化 指令在 pipeline 中的位置。目的是提供一个描述微结构的框架,去对应具有类似功能的处理器。

设计哲学:

多线程:

该模型目前不支持多线程处理,但在关键位置(有THREAD注释的地方),需要重组stage数据(理解为 pipeline 的 stage)以支持多线程处理

数据结构:

       避免使用大量指令周期信息来修饰数据结构。只有指令(MinorDyinst)包含其数据内容的很大一部分,这些数据内容的值在构造时没有设置

       所有内部结构都有固定的施工尺寸。队列和FIFOS(minorbuffer,fupipeline)中保存的数据应该有一个bubbleif接口,以便为每种类型提供一个不同的“bubble”/无数据值选项。  

       阶段间“struct”数据打包在按值传递的结构中。只有minordyinst、forwardLineData中的行数据和内存接口对象fetch1::fetchRequest和lsq::lsqRequest是在运行模型时分配的“::new”。

Model structure:

       minorpu类是Gem5中的一个CPU对象。minorpu实现了(cpu.hh)的接口,可以为连接到缓存系统提供数据和指令接口。该模型通过python以类似于其他gem5模型的方式配置。该配置被传递给minorpu::pipeline(属于类pipeline),后者实际上实现了处理器管道。

MinorCPU 的主要层次结构如下:

  • MinorCPU
    • Pipeline - container for the pipeline, owns the cyclic 'tick' event mechanism and the idling (cycle skipping) mechanism.
      • Fetch1 - instruction fetch unit responsible for fetching cache lines (or parts of lines from the I-cache interface)
      • Fetch2 - line to instruction decomposition
      • Decode - instruction to micro-op decomposition
      • Execute - instruction execution and data memory interface

         

Key Data Structures

Instruction and line identity: InstId (dyn_inst.hh)

instid包含序列号和线程号,这些序列号和线程号描述单个提取的缓存线和指令的生命周期和指令流关联。

InstID以以下形式之一打印:

- T/S.P/L - for fetched cache lines

- T/S.P/L/F - for instructions before Decode

- T/S.P/L/F.E - for instructions from Decode onwards

例子:

- 0/10.12/5/6.7

InstId's fields are:

FieldSymbolGenerated byChecked by

Function

 

InstId::threadIdTFetch1Everywhere the thread number is needed

Thread number (currently always 0).

 

InstId::streamSeqNumSExecuteFetch1, Fetch2, Execute (to discard lines/insts)

Stream sequence number as chosen by Execute. Stream sequence numbers change after changes of PC (branches, exceptions) in Execute and are used to separate pre and post branch instruction streams.

 

InstId::predictionSeqNumPFetch2Fetch2 (while discarding lines after prediction)

Prediction sequence numbers represent branch prediction decisions. This is used by Fetch2 to mark lines/instructions according to the last followed branch prediction made by Fetch2. Fetch2 can signal to Fetch1 that it should change its fetch address and mark lines with a new prediction sequence number (which it will only do if the stream sequence number Fetch1 expects matches that of the request).

 

InstId::lineSeqNumLFetch1(Just for debugging)

Line fetch sequence number of this cache line or the line this instruction was extracted from.

 

InstId::fetchSeqNumFFetch2Fetch2 (as the inst. sequence number for branches)

Instruction fetch order assigned by Fetch2 when lines are decomposed into instructions.

 

InstId::execSeqNumEDecodeExecute (to check instruction identity in queues/FUs/LSQ)

Instruction order after micro-op decomposition.

序列号字段彼此独立,尽管例如,指令的instid::execseqnum始终大于等于instid::fetchseqnum,但比较并不有用。

每个序列号字段的起始阶段为该字段保留一个计数器,该计数器可以递增以生成新的唯一编号。 

The pipeline

------------------------------------------------------------------------------
    Key:

    [] : inter-stage BufferBuffer
    ,--.
    |  | : pipeline stage
    `--'
    ---> : forward communication
    <--- : backward communication

    rv : reservation information for input buffers

                ,------.     ,------.     ,------.     ,-------.
 (from  --[]-v->|Fetch1|-[]->|Fetch2|-[]->|Decode|-[]->|Execute|--> (to Fetch1
 Execute)    |  |      |<-[]-|      |<-rv-|      |<-rv-|       |     & Fetch2)
             |  `------'<-rv-|      |     |      |     |       |
             `-------------->|      |     |      |     |       |
                             `------'     `------'     `-------'
------------------------------------------------------------------------------

这四个管道级通过minorbuffer-fifo(stage.hh,最终从timebuffer派生)结构连接在一起,这些结构允许对级间延迟进行建模。在向前方向的相邻阶段(例如:从fetch1到fetch2的线路)之间有一个minorbuffers,在fetch2和fetch1之间有一个反向缓冲区,承载分支预测。

阶段fetch2、解码和执行具有输入缓冲区,每个周期都可以接受上一阶段的输入数据,如果阶段尚未准备好处理该数据,则可以保存该数据。输入缓冲区以接收到的相同形式存储数据,因此解码和执行的输入缓冲区包含前一阶段的输出指令向量(forwardinstdata(pipe_data.hh)),指令和气泡与单个缓冲区条目位于同一位置。

阶段输入缓冲区提供一个与前一阶段的可保留(stage.hh)接口,以允许在其输入缓冲区中保留插槽,并向后通信其输入缓冲区占用情况,以允许前一阶段计划是否应在给定的周期中进行输出。

 

gem5学习基础完整版,介绍了gem5环境的安装,以及一些基本概念。 gem5仿真器是用于计算机系统体系结构研究的模块化平台,涵盖系统级体系结构以及处理器微体系结构。1、多个可互换的CPU型号。 gem5提供了四种基于解释的CPU模型:简单的单CPI CPU; 有序CPU的详细模型和无序CPU的详细模型。 这些CPU模型使用通用的高级ISA描述。 此外,gem5具有基于KVM的CPU,该CPU使用虚拟化来加速仿真。 2、完全集成的GPU模型,可以执行真实计算机ISA,并支持与主机CPU共享的虚拟内存。 3、NoMali GPU模型gem5带有集成的NoMali GPU模型,该模型与Linux和Android GPU驱动程序堆栈兼容,因此无需进行软件渲染。 NoMali GPU不产生任何输出,但可以确保以CPU为中心的实验产生代表性的结果。 4、事件驱动的内存系统。 gem5具有详细的,事件驱动的内存系统,包括高速缓存,交叉开关,探听过滤器以及快速而准确的DRAM控制器模型,用于捕获当前和新兴内存的影响,例如内存。 LPDDR3 / 4/5,DDR3 / 4,GDDR5,HBM1 / 2/3,HMC,WideIO1 / 2。 可以灵活地布置组件,例如,以具有异构存储器的复杂的多级非均匀高速缓存层次结构来建模。 5、基于跟踪的CPU模型,可播放弹性跟踪,这些跟踪是由附着到乱序CPU模型的探针生成的依赖项和定时注释的跟踪。 跟踪CPU模型的重点是以快速,合理的方式而不是使用详细的CPU模型来实现内存系统(高速缓存层次结构,互连和主内存)的性能探索。 6、异构和异构多核。 可以将CPU模型和缓存组合到任意拓扑中,从而创建同构异构的多核系统。 MOESI侦听缓存一致性协议可保持缓存一致性。 7、多种ISA支持。 gem5将ISA语义与其CPU模型解耦,从而实现对多个ISA的有效支持。 目前gem5支持Alpha,ARM,SPARC,MIPS,POWER,RISC-V和x86 ISA。 有关更多信息,请参见支持的体系结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值