跳转至

Tile寄存器

说明

为优化块指令数据运算性能、降低内存带宽需求并提高缓存利用率,本架构在第一层状态中引入了一组Tile寄存器(简称Tile),用于存储一维或二维张量数据。Tile寄存器组包含32个通用寄存器及2个特殊寄存器。

通用Tile寄存器分为 T、U、M、N 四种类型,每种类型各包含16个寄存器。这些寄存器主要用于支持块指令间的数据传递以及块内向量运算操作。特殊Tile寄存器包含 ACCS 两种:

  • ACC寄存器用于在CUBE运算单元中暂存矩阵运算的中间结果,并可作为下一次矩阵乘累加运算的输入数据源。
  • S寄存器用于无法访问内存的块指令(例如向量数据块)申请作为栈空间。
寄存器类型 说明
T#1-T#16 T队列的16个Tile寄存器。
U#1-U#16 U队列的16个Tile寄存器。
M#1-M#16 M队列的16个Tile寄存器。
N#1-N#16 N队列的16个Tile寄存器。
ACC 矩阵乘累加Tile寄存器。
S 栈空间Tile寄存器。

寄存器特征

Tile寄存器的特征如下:

  • Tile寄存器的大小不固定,由申请的块指令指定。
  • Tile寄存器的容量Size容量范围为 256Byte ~ 256KB(同时必须是256Byte的2的幂次倍)。
  • 不同硬件实现中,块指令允许申请的Tile寄存器容量的最大值和最小值可能不同,软件可查询系统寄存器LCFR获取。
  • Tile寄存器使用相对索引的方式进行分配和使用,使用方法请见相对索引

Tile寄存器通过B.IOT指令来申请和引用。

存储布局

存储布局决定了数据在Tile寄存器中的组织与排列规则。为提升矩阵运算效率,系统将输入的完整矩阵划分为若干小分形矩阵(简称小分形)。每个小分形内部的数据需遵循特定布局进行存储,同时各小形之间也按相应规则排列,共同构成高效的存储结构。不同小分形之间的整体排列方式称为大分形布局

存储布局格式包含以下几种:

存储布局 说明
ND 整个矩阵按照行优先顺序进行存储
DN 整个矩阵按照列优先顺序进行存储
ZZ 大Z小z,大分形按照行优先存储,小分形内按照行优先存储
ZN 大Z小n,大分形按照行优先存储,小分形内按照列优先存储
NZ 大N小z,大分形按照列优先存储,小分形内按照行优先存储
NN 大N小n,大分形按照列优先存储,小分形内按照列优先存储

d-layout

z-layout

n-layout

例如,有一个4行4列的矩阵需要存储到Tile register中,并且将整个矩阵切分为多个2行2列的分形矩阵进行存储,那么不同的布局下,数据存储方式如下:

    Matrix A = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};

layout

寄存器属性

Tile 是寄存器,并不是内存。寄存器的属性有:

  • 原子性:在计算过程中,块指令对Tile Register的写是原子的。不存在多个块指令同时在写同一个Tile Register。
  • 独占性:在计算过程中,块指令拥有自己的Destination Tile Register的独占权。后续块指令无法读取,直到当前块指令提交。
  • 幂等性:一个Tile寄存器只能被赋值一次,无法被反复覆写。只有当前寄存器被释放,再申请后可覆写。
  • 直接性:Tile寄存器无法获取指针,也无法通过指针直接访问。

Reuse特性

Tile寄存器作为指令的输入时,允许带有reuse标记。其语义为:

  • 当源寄存器被标记为 reuse 时:该寄存器在当前指令执行完成并提交(commit)后仍需保持可用,硬件不得在此提交点释放该寄存器。
  • 当源寄存器未标记为 reuse 时:在当前指令提交时,该寄存器的占用可以被硬件回收(kill/release),后续指令不应再使用该寄存器。

可见性与生命周期:

  • 标记为 reuse 仅影响当前指令提交时的寄存器保留行为,确保其值在后续指令中仍可被读取。
  • 未标记为 reuse 的源寄存器在当前指令提交后不再保证可读性;任何后续对其的读取均视为非法。

对已被释放的寄存器进行后续读取时,硬件必须产生异常。

示例说明

TLOAD [xx], ->T  ; 加载数据到T-Tile寄存器
TLOAD [xx], ->T  ; 加载数据到T-Tile寄存器
TLOAD [xx], ->T  ; 加载数据到T-Tile寄存器
TADD T#2.reuse, T#3, ->U  ; 对T#2和T#3中数据做逐元素加法,保留T#2
TSUB T#2, T#1,       ->U  ; 再次使用T#2

在 TADD 中,对 T#2 源操作数使用 .reuse 标记,意味着在 TADD 提交后,T#2 寄存器不得被硬件释放,从而允许后续指令继续读取该寄存器;若未标记 .reuse(如 T#3),则在 TADD 提交后该寄存器可被回收,后续读取应触发异常。

Reuse 标记仅适用于源寄存器,不影响目的寄存器的分配与释放策略。

访问属性

这组寄存器都是可读可写的(RW)。