SiFive Patents(US20230367599A1): Vector Gather with a Narrow Datapath
| Patents | Inc. | Title |
|---|---|---|
| US20230367599A1 | SiFive | Vector Gather with a Narrow Datapath |
该专利主要涉及一种 vgather 指令在窄数据通路下的高效执行方法
背景与针对问题
vgather 指令行为:
1 | vgather.vv vd, vs2, vs1, vm |
存在的问题:
- 在时间矢量处理器(temporal vector processor) 中,每个元素是分周期依次处理的,而不是一次性访问所有元素(array procssor)
- 索引可能比较分散,导致每周期只能处理一个元素,效率较低
- 窄数据通路(如 128/256/512)限制了每周期能读取的元素数量
解法: index 的访问和使用流水化
完成标志缓冲区(completion flags buffer): 用于追踪哪些索引已被处理
- 无效索引处理:若 index 超出有效范围,直接标记完成
- 掩码处理:若 index 被设置掩码,也直接标记完成,无需读取数据
Opportunistic Multi-Element Gathering
- 从 vector register file 读取 b 位 index 到 1st Operand Buffer
窄数据通路(宽度 b 位, 包含 w 个索引,w = b / 元素位宽) - 从 vector register file 读取 b 位源数据到 2nd Operand Buffer (w 个 源数据元素)
关键是必须包含第一个 index(当前未处理 index 中的第一个)所指向的元素,以确保至少有一个目标元素可以处理 - 检查其他索引是否也指向当前 2nd Operand Buffer 中的源数据
扫描 1st Operand Buffer 中所有未处理的索引,判断它们指向的地址是否落在当前 2nd Operand Buffer 所覆盖的范围内(即是否已读取) - 在单个时钟周期内,将多个命中元素复制到 3rd Operand Buffer
- 通常由 w 元素数据 crossbar 实现,支持任意元素位置的重排
- 在同一个时钟周期内,更新完成标志缓冲区
- 将已处理的 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 的优化,提高指令流水效率
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.