Saturn-Vectors项目中的向量数据通路设计与实现解析
概述
Saturn-Vectors项目中的向量数据通路(VU)是整个向量处理单元的核心组件,负责处理所有向量指令的调度、计算和寄存器文件访问。本文将深入解析其架构设计原理和实现细节,帮助读者理解现代向量处理器的内部工作机制。
向量数据通路基础架构
向量数据通路围绕"向量元素组"(element group)这一基本单元进行组织,这是寄存器访问和计算的基础单位。每个元素组具有固定的DLEN位宽度,这个参数决定了后端大多数关键组件的参数化配置。
核心设计理念
- 统一处理宽度:无论元素宽度(ELEN)如何变化,寄存器文件、加载路径、存储路径和大多数功能单元都设计为每个周期处理DLEN位(即1个元素组)
- 并行处理能力:通过多个独立的"序列路径"(sequencing paths)实现并行指令发射
指令调度系统
指令队列层级
-
向量分发队列(VDQ):
- 采用先进先出(FIFO)设计
- 为每条指令分配唯一年龄标签(age tag)
- 用于解决乱序执行阶段的数据冒险问题
-
向量问题队列(VIQ):
- 连接VDQ的出队端
- 每个VIQ按顺序向其对应的指令序列器发射指令
- 不同VIQ之间可以自然"滑动",实现乱序执行
队列配置方案
Saturn-Vectors支持六种不同的队列配置方案,各有优缺点:
| 配置类型 | 特点 | 适用场景 | 性能表现 | 硬件成本 | |---------|------|----------|----------|----------| | 统一式(unified) | 单一序列器处理所有算术运算 | 简单应用 | 最低 | 最低 | | 共享式(shared) | 分离整数和浮点序列器,共享VIQ | 混合运算 | 中等 | 中等 | | 分离式(split) | 独立VIQ分别服务整数和浮点序列器 | 高性能计算 | 最高 | 较高 | | 多ALU式 | 增加整数序列器和功能单元 | 整数密集 | 高整数吞吐 | 中等 | | 多MAC式 | 增加整数乘加单元 | 矩阵运算 | 高MAC吞吐 | 较高 | | 多FMA式 | 增加浮点乘加单元 | 科学计算 | 高FMA吞吐 | 最高 |
指令序列器设计
指令序列器是将向量指令转换为一系列操作的关键组件,每个周期执行一个操作。
核心工作机制
-
操作发射:
- 提前通告寄存器读写地址
- 携带当前指令的年龄标签
- 无结构/数据冒险时发射操作
-
流水线控制:
- 采用"发射即忘"(fire-and-forget)机制
- 消除操作数和结果队列需求
- 避免功能单元流水线的反压
序列器类型
-
加载/存储序列器(VLS/VSS):
- 最简单的序列器类型
- 仅跟踪一个向量操作数或目标
- 处理分段操作的额外复杂性
-
执行序列器(VXS):
- 处理所有算术运算
- 最多跟踪三个寄存器操作数
- 每个VXS服务于单个向量执行单元(VXU)
-
特殊序列器(VPS):
- 处理三类特殊指令
- 实现源和目标操作数的独立危险跟踪
- 支持不同速率的操作数消耗
冒险处理机制
由于不同序列器间的乱序执行,需要处理RAW、WAW和WAR三种数据冒险。
冒险检测窗口
包括:
- 问题队列中的所有指令
- 序列器中正在处理的指令
- 功能单元数据通路中未完成的操作
冒险解决策略
- 元素组粒度:在DLEN粒度上解决数据冒险
- 精确跟踪:每个指令/操作必须通告未来将读写的元素组
- 年龄过滤:基于年龄标签构建待处理读写向量
特殊情况处理
- 序列器中的指令比其问题队列中的指令更老
- 功能单元中的操作是最老的写操作
向量寄存器文件设计
核心架构
-
多端口分块阵列:
- 按元素组索引分块
- 相邻元素组位于相邻块中
- 每块包含3个读端口和1个写端口
-
优化设计:
- 单条目直通写缓冲区
- 模拟3R2W内存
- 减少写块冲突的性能影响
-
特殊处理:
- 向量掩码寄存器v0的影子副本
- 读交叉开关解决结构冒险
功能单元实现
Saturn-Vectors实现了多种功能单元,各有特点:
整数运算单元
| 单元类型 | 支持指令 | 微架构 | 流水线级数 | 特点 | |----------|----------|--------|------------|------| | IntegerPipe | 加减/最大/最小 | SIMD ALU阵列 | 2级 | 饱和加法特殊处理 | | ShiftPipe | 移位指令 | 桶式移位器阵列 | 2级 | | | BitwisePipe | 位操作 | 位操作阵列 | 1级 | | | BitmanipPipe | 位操作扩展 | 优先编码器 | 2级 | 混合元素宽度 |
浮点运算单元
| 单元类型 | 支持指令 | 微架构 | 流水线级数 | 特点 | |----------|----------|--------|------------|------| | FMA | 浮点乘加 | SIMD FMA阵列 | 4级 | 可共享主机FPU | | FPDivSqrtUnit | 浮点除/平方根 | 迭代单元 | 可变 | 单单元设计 | | FPConvPipe | 浮点转换/比较 | SIMD FP单元阵列 | 2级 | |
特殊功能单元
| 单元类型 | 支持指令 | 微架构 | 流水线级数 | 特点 | |----------|----------|--------|------------|------| | PrefixUnit | 前缀类指令 | 前缀和电路 | 1级 | 带累加器 | | IntegerDivider | 整数除法 | 迭代FSM | 可变 | 可选乘法支持 | | PermuteUnit | 滑动/聚集/压缩 | 最小逻辑 | 1级 | 寄存器重排 |
设计优化技巧
-
迭代功能单元:
- 可变执行延迟
- 昂贵硬件单周期单元素执行
- 结果写回后请求新操作
-
流水线冲突预防:
- 检查未来VRF块写冲突
- 年轻操作适当停顿
- 最大化流水线利用率
-
面积优化:
- 共享主机FPU
- 最小配置避免SIMD阵列
- 灵活的功能单元组合
总结
Saturn-Vectors项目的向量数据通路设计展现了现代向量处理器的核心架构思想,通过精妙的队列设计、序列器机制和冒险处理方案,实现了高效的向量指令并行处理。其模块化设计和可配置特性使其能够适应从简单嵌入式应用到高性能计算的各种场景,为向量计算提供了灵活高效的硬件实现方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考