张量指令集
简介
张量指令集是为并行计算和异构计算架构设计的一种指令集合,支持对形状可变的数据块(Tile)进行高效操作。数据块内具有特定的格式,能够处理大规模的并行计算任务,广泛应用于矩阵运算、深度学习、图像处理等领域。
TMA类指令
TMA类指令主要用于内存操作,包括数据的加载、存储、复制、类型转换以及内存聚集和散布操作。关于这种块指令的详细介绍请见访存数据块。
| Mode |
Function |
操作 |
说明 |
| 0 |
0 |
TLOAD |
从内存ddr或remote向Tile寄存器拷贝 |
| 0 |
1 |
TSTORE |
从Tile寄存器向内存ddr或remote拷贝 |
| 0 |
2 |
TMOV |
Tile寄存器之间的数据移动/复制,支持存储布局的变换 |
| 0 |
3 |
- |
保留 |
| 0 |
4 |
MGATHER |
将离散的内存空间的数据聚集到Tile寄存器中 |
| 0 |
5 |
MSCATTER |
将Tile寄存器中的数据存储到离散的内存空间 |
| 0 |
6 |
MGATHER.MASK |
带掩码的内存聚集,仅当 MaskTile 中对应标志位为 1 时才执行聚集 |
| 0 |
7 |
MSCATTER.MASK |
带掩码的内存分散,仅当 MaskTile 中对应标志位为 1 时才执行分散 |
| 0 |
8-31 |
- |
保留 |
CUBE类指令
CUBE类指令主要用于矩阵和向量的乘法运算,包括基本矩阵乘法、带偏置的矩阵乘法、缩放矩阵乘法以及通用矩阵-向量乘法。关于这种块指令的详细介绍请见矩阵数据块。
矩阵乘法操作
固定管线操作
| Mode |
Function |
操作 |
说明 |
| 0 |
8 |
ACCCVT |
将数据从ACC寄存器搬移到外部的T、U、M、N寄存器。在数据搬运期间支持转换操作 |
| 0 |
9-15 |
- |
保留 |
矩阵-向量乘法操作
| Mode |
Function |
操作 |
说明 |
| 0 |
16 |
TGEMV |
通用矩阵-向量乘法,结果写到ACC寄存器 |
| 0 |
17 |
TGEMV.BIAS |
通用矩阵-向量乘法,带偏置加法,结果写到ACC寄存器 |
| 0 |
18 |
TGEMV.ACC |
通用矩阵-向量乘法,结果累加到ACC寄存器 |
| 0 |
19 |
- |
保留 |
| 0 |
20 |
TGEMVMX |
通用缩放矩阵-向量乘法,结果写到ACC寄存器 |
| 0 |
21 |
TGEMVMX.BIAS |
通用缩放矩阵-向量乘法,带偏置加法,结果写到ACC寄存器 |
| 0 |
22 |
TGEMVMX.ACC |
通用缩放矩阵-向量乘法,结果累加到ACC寄存器 |
| 0 |
23-31 |
- |
保留 |
TEPL类指令
TEPL类指令主要用于对Tile数据块进行逐元素操作、标量操作以及按轴操作。关于这种块指令的详细介绍请见模版数据块。
Tile-Tile逐元素操作
| Mode |
Function |
操作 |
说明 |
| 0 |
0 |
TADD |
两个Tile的逐元素加法 |
| 0 |
1 |
TSUB |
两个Tile的逐元素减法 |
| 0 |
2 |
TMUL |
两个Tile的逐元素乘法 |
| 0 |
3 |
TDIV |
两个Tile的逐元素除法 |
| 0 |
4 |
TREM |
两个Tile的逐元素余数,余数符号与除数相同 |
| 0 |
5 |
TFMOD |
两个Tile的逐元素余数,余数符号与被除数相同 |
| 0 |
6 |
TAND |
两个Tile的逐元素按位与 |
| 0 |
7 |
TOR |
两个Tile的逐元素按位或 |
| 0 |
8 |
TXOR |
两个Tile的逐元素按位异或 |
| 0 |
9 |
TSHL |
两个Tile的逐元素左移 |
| 0 |
10 |
TSHR |
两个Tile的逐元素右移 |
| 0 |
11 |
TMAX |
两个Tile的逐元素最大值 |
| 0 |
12 |
TMIN |
两个Tile的逐元素最小值 |
| 0 |
13 |
TCMP |
比较两个Tile并写入一个打包的谓词掩码 |
| 0 |
14 |
TPRELU |
带逐元素斜率Tile的逐元素参数化ReLU |
| 0 |
15 |
TABS |
Tile的逐元素绝对值 |
| 0 |
16 |
TNOT |
Tile的逐元素按位取反 |
| 0 |
17 |
TNEG |
Tile的逐元素取负 |
| 0 |
18 |
TEXP |
逐元素指数运算 |
| 0 |
19 |
TLOG |
Tile的逐元素自然对数 |
| 0 |
20 |
TRECIP |
Tile的逐元素倒数 |
| 0 |
21 |
TSQRT |
逐元素平方根 |
| 0 |
22 |
TRSQRT |
逐元素倒数平方根 |
| 0 |
23 |
TRELU |
Tile的逐元素ReLU |
| 0 |
24 |
TADDC |
三元逐元素加法:dst = src0 + src1 + src2 |
| 0 |
25 |
TSUBC |
三元逐元素减法:dst = src0 - src1 + src2 |
| 0 |
26 |
TSEL |
使用掩码Tile在两个Tile之间进行选择(逐元素选择) |
| 0 |
27 |
TCVT |
Tile的逐元素数据格式转换。 |
| 0 |
28-31 |
- |
保留 |
Tile逐元素和标量操作
| Mode |
Function |
操作 |
说明 |
| 1 |
0 |
TADDS |
Tile与标量的逐元素加法 |
| 1 |
1 |
TSUBS |
从Tile中逐元素减去一个标量 |
| 1 |
2 |
TMULS |
Tile与标量的逐元素乘法 |
| 1 |
3 |
TDIVS |
与标量的逐元素除法(Tile/标量或标量/Tile) |
| 1 |
4 |
TREMS |
与标量的逐元素余数:remainder(src, scalar) |
| 1 |
5 |
TFMODS |
与标量的逐元素余数:fmod(src, scalar) |
| 1 |
6 |
TANDS |
Tile与标量的逐元素按位与 |
| 1 |
7 |
TORS |
Tile与标量的逐元素按位或 |
| 1 |
8 |
TXORS |
Tile与标量的逐元素按位异或 |
| 1 |
9 |
TSHLS |
Tile按标量逐元素左移 |
| 1 |
10 |
TSHRS |
Tile按标量逐元素右移 |
| 1 |
11 |
TMAXS |
Tile与标量的逐元素最大值:max(src, scalar) |
| 1 |
12 |
TMINS |
Tile与标量的逐元素最小值 |
| 1 |
13 |
TCMPS |
将Tile与标量逐元素比较 |
| 1 |
14 |
TLRELU |
带标量斜率的LeakyReLU |
| 1 |
15-23 |
- |
预留编码 |
| 1 |
24 |
TADDSC |
带标量融合逐元素加法运算:dst = src0 + scalar + src1 |
| 1 |
25 |
TSUBSC |
带标量融合逐元素减法运算:dst = src0 - scalar + src1 |
| 1 |
26 |
SELS |
使用掩码Tile在源Tile和标量之间进行选择(源Tile逐元素选择) |
| 1 |
27 |
TEXPANDS |
将标量广播到目标Tile中 |
| 1 |
28-31 |
- |
预留编码 |
按轴归约/广播操作
复杂操作
| Mode |
Function |
操作 |
说明 |
| 3 |
0-7 |
- |
预留编码 |
| 3 |
8 |
THISTOGRAM |
累积直方图统计指令 |
| 3 |
9-29 |
- |
预留编码 |
| 3 |
30 |
ESAVE |
异常保存块,用于保存发生异常的Tile块的块内状态 |
| 3 |
31 |
ERCOV |
异常恢复块,用于恢复发生异常的Tile块的块内状态 |