meton-robean

Results 190 comments of meton-robean
trafficstars

> 您好,我目前也不太清楚。除了Sequencer说的之外,也可以试试看Gem5。如果感兴趣我们也可以私下详细交流。 我的邮箱是[email protected],方便留个邮箱告诉我一下微信号交流一下吗

> Joules or Voltus. > Both of them are commercial tools. hi, 请问你有做过rocketcore / BOOM 的功耗面积仿真吗?

### 几种情况rocket会stall: - mem阶段如果有访存指令load,store发起取数请求,但是data miss,此时需要多个周期才会来数,此时流水线停止,rocket进行replay,直到再次在mem阶段取到数据,流水线再恢复。 - **mem阶段**如果是分支跳转指令,会在此阶段判断是否后面预测的指令正确(在mem阶段计算出真正要跳转的pc,和EX阶段的指令pc进行对比),如果预测错误,那么take_pc_mem在这个周期置1,killd=1(这会阻断ID,和ex之间的指令传递), 此时killx=1,这个信号会把ex阶段的reg置位unvalid; **下一个周期**,这条跳转指令到了WB阶段,会更新frontend下一周期要取的正确指令。并且此时killm变为1(因为上一周期ex的指令传递了过来(killex=1),使得mem阶段killm=1),这个信号 会把mem阶段的reg置位unvalid; **再下一个周期**,ID从ibuf中取到正确的指令后,killd=0, 流水线开始恢复。 但是此时killx, killm还是为1,并且wb阶段的指令还是卡在那里。 **后续的周期**,killx,killm一级级恢复0,直到wb阶段的指令也被覆盖为正确的指令,流水线完全恢复,程序接着执行。 - wb阶段要写回的寄存器和EX阶段要读取的寄存器相同,数据依赖,有冒险。此时take_pc_wb=1,killd=1,killx=1,之后演变类似第二种情况,wb阶段的那条指令又会replay到ID阶段重新执行一遍。。 - wb阶段是条rocc指令,按道理在下一周期这条指令会被送到ROCC加速器那边,可是由于加速器握手信号ready=0,导致rocc指令阻塞在wb阶段,此时这条take_pc_wb=1,之后处理类似第三种情况,进行replay,直到加速器那边握手信号可以了,才能送过去。

### 以一个例子来说明: **前提,我将如下100f8 --1010c的指令伪装成rocc指令:** ![Selection_018](https://user-images.githubusercontent.com/17881739/70878995-c5dd7280-1ffe-11ea-98e9-2ef2f701d694.png) **即将控制信号设置为:** ` id_ctrl.rocc := true.B id_ctrl.wxd := false.B id_ctrl.branch := false.B id_ctrl.jal := false.B id_ctrl.jalr := false.B` **观察流水线各个周期现象如下:** ![WeChat Image_20191216122305](https://user-images.githubusercontent.com/17881739/70879053-f8876b00-1ffe-11ea-8112-5d563b281057.jpg) **解释:** mem阶段如果是分支跳转指令(其实所有指令都会判断),会在此阶段判断是否后面预测的指令正确(在mem阶段计算出真正要跳转的pc(分支指令跳转pc计算方式是当前指令pc+立即数偏移;普通指令的话是+2或者+4 ),和EX阶段的指令pc进行对比),如果预测错误,那么take_pc_mem在这个周期置1,killd=1(这会阻断ID,和ex之间的指令传递), 此时killx=1,这个信号会把ex阶段的reg置位unvalid; 下一个周期,这条跳转指令到了WB阶段,会更新frontend下一周期要取的正确指令。并且此时killm变为1(因为上一周期ex的指令传递了过来(killex=1),使得mem阶段killm=1),这个信号...

### 循环分析: 0. 循环分析与优化的背景介绍可以参考下面这边论文的背景介绍部分,写的挺详细: https://github.com/meton-robean/ResearchNote/blob/master/Notes/LLVM/%E5%BE%AA%E7%8E%AF%E5%88%86%E6%9E%90/%E5%9F%BA%E4%BA%8ELLVM%E7%9A%84%E8%BF%AD%E4%BB%A3%E9%97%B4%E6%95%B0%E6%8D%AE%E9%87%8D%E7%94%A8%E4%BC%98%E5%8C%96%E7%A0%94%E7%A9%B6.pdf 1. ScalarEvolution相关的资料: https://github.com/meton-robean/ResearchNote/blob/master/Notes/LLVM/%E5%BE%AA%E7%8E%AF%E5%88%86%E6%9E%90/LLVM-ScalarEvolution%E5%BA%94%E7%94%A8.pdf 介绍了ScalarEvolution基本原理以及应用以及SECV的相应编程API,其他方面应用介绍的比较粗。

### 剖视循环中的计算: **1.循环归一化.** memreg, loopsimplify, lcssa, indvar等等使得复杂循环变成标准结构的循环,方便进行下一步的剖视。 **2.循环迭代指示变量的跟踪.** 利用ScalarEvolution pass可以获得一些列归纳变量的信息,再进一步获得迭代变量的信息: 例如 http://llvm.org/doxygen/LoopInterchange_8cpp_source.html#l00295的getInductionVariable函数可以提供灵感: [getInductionVariable函数](https://github.com/meton-robean/ResearchNote/blob/master/imgs/LLVM/%E6%80%A7%E8%83%BD%E8%AF%AD%E4%B9%89/getInductionVariable.png) 迭代变量出现在loop header的phi节点,而且该函数中利用ScalarEvolution pass中的getSCEV 函数可以获得归纳变量迭代变化步长(这样可以找到迭代步长),而循环上界N一般可以通过cmp指令的操作数得到。 **3. 循环内访存计算的跟踪:** 跟踪到load store的指令后,根据指令链条可以向上找到load store访存地址的计算表达式(这个也是归纳变量的一种,可以利用ScalarEvolution pass来跟踪**访存地址计算的仿射表达式** ) 计算式需要判断属于那种并行类型,树并行?全并行?这需要对循环内的访存进行**依赖分析。** **4. 循环嵌套层次的剖视:** 利用LoopInfo pass 可以获得顶层循环list,再遍历各个顶层循环来获得嵌套的子循环....

### 有关循环分析的一些重要参考函数: 1. [const SCEV * ScalarEvolution::getBackedgeTakenCount (const Loop * L) ](http://llvm.org/doxygen/classllvm_1_1ScalarEvolution.html#aecd7aba4460358813feef37d71d5024e) 返回循环回边个数,循环的迭代个数是该值再加一。回边数如果不可计算,返回a SCEVCouldNotCompute object. 2. [bool isComputableLoopNest(LoopVector LoopList)](http://llvm.org/doxygen/LoopInterchange_8cpp_source.html#l00295) 判断子循环是否是可计算的(迭代次数可计算) 3. [static PHINode *getInductionVariable(Loop *L, ScalarEvolution *SE)](http://llvm.org/doxygen/LoopInterchange_8cpp_source.html#l00295) 获得循环迭代变量 4. [static...

[pyMTL 和 HLS混合设计](https://github.com/meton-robean/PaperNotes/issues/8) ![Selection_063](https://user-images.githubusercontent.com/17881739/68184006-e5818400-ffd8-11e9-8ea6-bf5943e29588.png)

gem5 仿真 ,利用gen5的cpu模板可以魔改 挂载协处理器来加速应用 ,见[LaCore ](url)

### gem5-Aladdin ![Selection_092](https://user-images.githubusercontent.com/17881739/68546319-e9196e80-040f-11ea-9491-051e0006297d.png) https://github.com/harvard-acc/gem5-aladdin **相关论文** **Co-Designing Accelerators and SoC Interfaces using gem5-Aladdin(MICRO2017)** 加速器是通过Aladdin模拟:Aladdin跟踪剖视软件代码,生成相应的dynamic data dependence graph(DDDG),加速器模拟时会加载DDDG到用户定义硬件约束的Aladdin模拟系统;            在gem5中运行测试程序前,会在加速代码中添加dmaLoad和dmaStore指令用于DMA取数,同时会将相应的DDDG文件加载的Aladdin生成相应的加速器仿真;测试程序运行时Aladdin会跟踪加速代码在DDDG中的运行,当调用DMA操作时,Aliddin会项gem5的DMA发送请求。