Patents Inc. Title
US20230367599A1 SiFive Vector Gather with a Narrow Datapath

该专利主要涉及一种 vgather 指令在窄数据通路下的高效执行方法

背景与针对问题

vgather 指令行为:

1
2
vgather.vv vd, vs2, vs1, vm
// vd[i] = (vs1[i] >= VLMAX) ? 0 : vs2[vs1[i]]

存在的问题

  • 在时间矢量处理器(temporal vector processor) 中,每个元素是分周期依次处理的,而不是一次性访问所有元素(array procssor)
  • 索引可能比较分散,导致每周期只能处理一个元素,效率较低
  • 窄数据通路(如 128/256/512)限制了每周期能读取的元素数量

解法: index 的访问和使用流水化

Gather Cirecuitry

完成标志缓冲区(completion flags buffer): 用于追踪哪些索引已被处理

  • 无效索引处理:若 index 超出有效范围,直接标记完成
  • 掩码处理:若 index 被设置掩码,也直接标记完成,无需读取数据

Opportunistic Multi-Element Gathering

Gather Cirecuitry

  1. 从 vector register file 读取 b 位 index 到 1st Operand Buffer
    窄数据通路(宽度 b 位, 包含 w 个索引,w = b / 元素位宽)
  2. 从 vector register file 读取 b 位源数据到 2nd Operand Buffer (w 个 源数据元素)
    关键是必须包含第一个 index(当前未处理 index 中的第一个)所指向的元素,以确保至少有一个目标元素可以处理
  3. 检查其他索引是否也指向当前 2nd Operand Buffer 中的源数据
    扫描 1st Operand Buffer 中所有未处理的索引,判断它们指向的地址是否落在当前 2nd Operand Buffer 所覆盖的范围内(即是否已读取)
  4. 在单个时钟周期内,将多个命中元素复制到 3rd Operand Buffer
    • 通常由 w 元素数据 crossbar 实现,支持任意元素位置的重排
  5. 在同一个时钟周期内,更新完成标志缓冲区
    • 将已处理的 index 对应的标志位标记为“已完成”,表明该 index 已经处理完毕

检查 1st Operand Buffer 中是否还有未完成的 index

  • 如果有,则返回步骤2,读取下一块源数据(包含下一个未处理 index 指向的元素)继续处理
  • 如果没有:检查整个向量是否处理完毕,如果仍有未读入的 index(即 1st Operand Buffer 中的 index 已经全部处理完,但整个向量长度超过 b 位),则返回步骤1,读取下一批 b 位 index

这篇专利最核心的地方在于 2nd Operand Buffer 的读取索引如何在同一周期确定

  • 1st Operand Buffer 可以存储比数据通路宽度更多的 index ,这样可以在处理当前批次的 index 时,预读下一批次的 index 并判断下一周期 2nd Operand Buffer 的读取 index
  • 类似于 index 的读取和使用被流水化
  • 对于长向量或窄数据通路的向量处理器收益更高

Dynamic Small Vector Detection

检测向量长度和最大 index 范围是否 ≤ w (即一周期能处理的最大元素数)

若满足条件:

  • 禁用 Completion Flags Buffer 更新,简化控制逻辑,降低功耗
  • 所有索引可在单周期内处理完成,并直接写回目标寄存器
  • 支持 chaining 的优化,提高指令流水效率