0%

OOO CPU Issue Stage: Select/Arbiter

任务:从发射队列中选择出 n 个 ready 的指令送到功能单元中

最优目标: oldest-first

对于压缩式发射队列:

仲裁电路实现简单,只需选择发射队列最下面的 n 个 entry

对于非压缩式发射队列:

对于分布式发射队列:采用 1-of-M 仲裁

每周期从发射队列的 M 个 entry 中选出 1 条指令送到功能单元

  1. 识别出发射队列中的哪些指令是 oldest 的?
    • 需要指令的年龄信息:可以利用 ROB 的地址
    • ROB 本质是 FIFO ,存在读写指针翻转的问题
    • 给 ROB 的每个 entry 增加一位位置位表明是否翻转
      • 当位置位相同时, ROB 的地址值越小,对应的指令越旧
      • 当位置位不同时, ROB 的地址值越大,对应的指令越旧
    • 指令的年龄信息需要写入发射队列(即发射队列每个 entry 需要 Age field )
  2. 屏蔽掉未 ready 的指令?
    • 发射队列中每个 entry 增加一位 ready 位
    • 仲裁电路根据 ready 位和年龄信息进行比较
  3. 如何比较年龄信息选出最 oldest 的指令?
    • 多级比较电路:对于容量为 N 的发射队列,需要的比较电路级数为 $log_2N$
  4. 如何根据仲裁电路选出的年龄值,在发射队列中找到相应的指令?
    • 方法1: 用年龄值和发射队列的所有 entry 的年龄值比
      发射队列需要实现为 CAM (面积和延迟都增加不少)
    • 方法2: 仲裁电路比较时,每条指令在发射队列中的地址也随着比较电路流动下去
      并行比较,不影响关键路径

对于集中式发射队列:采用 N-of-M 仲裁

  1. 方案1: 多级 1-of-M 仲裁电路级联
    延时也翻倍,不具有可扩展性
  2. 方案2: 每个功能单元使用 1 个 1-of-M 仲裁
    问题在于相同的功能单元之间如何进行分配?
    • 方法1: 轮换分配
      • 当前周期分配给 ALU0,下一周期分配给 ALU1
      • 发射队列每个 entry 增加一位分配位,指明分配给哪个 ALU
      • 实现简单
      • 利用率有限,容易出现”多条指令需要分配给 ALU0, 而 ALU1 空闲“的情况
    • 方法2: 合并功能单元,多个功能单元共用 1 条发射队列(本质是折中式发射队列)
      trade-off:
      • 更多功能单元共用一个发射队列:
        • 发射队列容量需求更大
        • 仲裁电路延时越高
      • 更少功能单元共用一个发射队列:
        • 发射队列的数量更多
        • 唤醒电路的面积、延时、功耗都更高