您的位置:首页 > 其它

体系结构学习11-VLIW处理器

qq_40891899 2020-05-11 04:13 90 查看 https://blog.csdn.net/qq_40891

1、VLIW

  • 为什么需要VLIW:乱序处理中硬件需要复杂的控制电路来检查数据依赖关系。(MIPS R10K)
  • 编译时确定哪些指令可以同时执行,然后将它们打包为同一个指令,这样减少了CPU的硬件复杂度,但是增加了软件的负担,导致编译器制作难度增加。

2、VLIW Scheduling Model

  • EQ:指令执行完成前可以使用其目的寄存器
  • LEQ:指令发射后就不能使用其目的寄存器

3、循环展开与优化

  • 顺序执行的代码更有利于优化 -> 减少branch
    Software Pipeline:比如连续读取一批又一批数据
  • 划分基本块(流图?)

4、Trace Scheduling

  • 优化流图中最经常执行的代码路径(可以牺牲很少执行代码路径的执行之间)

  • 步骤:画出数据流图找到最常执行路径——优化路径——补偿(比如跳过了某些分支的相应处理)

  • 优点:找到没有数据依赖的最常执行路径,提高运行效率

  • 缺点:需要profile,增加编译时间;补偿代码容易导致代码膨胀;目标代码必须存在主要路径才有好的效果。

5、List Scheduling

划分指令优先级,优先级高的先发射(确保没有数据依赖关系),优先级低或者有数据依赖的指令需要等待。

6、优化代码补偿

7、SuperBlock Scheduling

  • 寻找基本块时,只能有一个入口,可以有多个出口(更有利于补偿代码的优化,否则入口太多了加重补偿代码的负担)
  • 缺点:依赖于Profile、需要存在常见分支以及代码膨胀

8、Hyperblock Scheduling

  • 利用谓词执行
  • 优点:不完全依赖于profile,如果没有常见分支也可以使用谓词执行。
  • 缺点:谓词执行的需要指令支持,所有分支条件都会执行。

大部分VLIW机器都会支持谓词执行

9、VLIW遗留问题

  • 需要机器的编译支持
  • VLIW中存在空代码浪费空间,也会导致代码膨胀
  • VLIW难以处理内存操作,因为无法确定指令执行时延
  • 需要确定branch的预测结果
  • 如何支持精确中断?在EQ模式很难,比如算数指令发生中断,但是执行完成时已经冲掉了原始数据,中断需要去恢复。
  • 解决方式:
    在内存压缩,在Icache解压指令
    事前确定哪些指令可以同时执行(mark parallel group)
    提供单操作的VLIW(和普通的指令一样)

10、Intel IA-64(VLIW处理器)

  • 指令模式:
    Bundle ——3 Instructions + 5bits Template:确定前3条指令是否能并行
    Single——1 Instruction + 6 bits Predicate:谓词执行条件

  • 单独提前load指令:忽视异常的load,在之后的分支检查是否异常(load的异常判断与执行分开)

  • load指令与相应数据依赖指令均提前:一起抛在load分支中检查

  • store与load产生数据关联:“advance load” 和“ check load”,如果没有被使用,继续执行;如果有使用,则重新执行load以及相关指令
    数据结构:Advanced Load Address Table

  • 增加了大量寄存器,在循环中采用寄存器轮转方式(RRB:轮转计数器,节省物理寄存器)

  • 优点:降低硬件复杂度,不需要检查指令依赖以及指令分配等

  • 缺点:对编译器要求太高,实际代码本身并行度不高,在不同机器需要重新编译(比如适应不同流水线)

淡定路过的我 原创文章 19获赞 1访问量 685 关注 私信
标签: