下图显示了标量单元的子组件。标量单元与通用处理器十分相似,同样用于程序控制(分支、比较)、标量数学运算、非线性函数和数据类型转换。与通用处理器一样,标量单元同样可以使用泛用 C/C++ 代码。
图 1. 标量处理单元
寄存器文件用于存储输入和输出。指针算术有专用的寄存器,通用用途和配置也同样如此。特殊寄存器包括栈指针、圆形缓冲器和零开销循环。在 AI 引擎中支持两种类型的标量基本非线性函数,即定点精度和浮点精度。
定点非线性函数包括:
- 正弦和余弦
- 绝对值 (ABS)
- 计数前导零 (CLZ)
- 通过比较来查找最小值或最大值(小于 (LG)/大于 (GT))
- 平方根
- 平方根倒数和倒数
浮点非线性函数包括:
- 平方根
- 平方根倒数
- 倒数
- 绝对值 (ABS)
- 通过比较来查找最小值或最大值(小于 (LG)/大于 (GT))
AI 引擎中的算术逻辑单元 (ALU) 用于管理以下运算,运算发出速率为每个周期一条指令。
- 32 位整数加法和减法。此运算的时延为一个周期。
- 对 32 位整数值(BAND、BOR 和 BXOR)执行按位逻辑运算。此运算的时延为一个周期。
- 整数乘法:32 x 32 位,输出结果为 32 位,存储在 R 寄存器文件内。此运算的时延为三个周期。注释: 发生溢出时,整数结果截断到 32 位。
- 移位运算:支持左移位和右移位。此运算的时延为一个周期。注释: 默认情况下,2 的幂值乘法缩减为移位运算。
数据类型转换可使用 aie::to_fixed
和 aie::to_float
来执行。此转换也支持 sqrt、inv 和 inv_sqrt 定点运算。
标量编程
编译器和标量单元支持程序员使用标准“C”数据类型。下表显示了标准 C 语言数据类型及其精度。除浮点和双精度之外的所有类型都支持有符号前缀和无符号前缀。
数据类型 | 精度 | 注解 |
---|---|---|
char | 8 位有符号 | |
short | 16 位有符号 | |
int | 32 位有符号 | 原生支持 |
long | 64 位有符号 | |
float | 32 位 | |
double | 64 位 | 使用 softfloat 库枚举。标量进程不包含 FPU。 |
重要的是,请谨记控制流语句(例如,分支)仍由标量单元处理,即使存在矢量指令也是如此。此概念对于最大程度提升 AI 引擎性能至关重要。