通用图形处理器设计——GPGPU编程模型与架构原理(五)

第5章 GPGPU运算单元架构

5.1 数值的表示

5.1.1 整形数据

不包含小数部分的数值型数据,采用二进制的形式表达。

编码方式:原码、反码和补码。

原码:符号位加真值绝对值;

反码:正数与原码一致,负数除符号位按位取反;

补码:正数与原码一致,负数除符号位按位取反再加一。

5.1.2 浮点数据

对实数数值的近似表示。

浮点数的格式:符号位(s)+指数位(e)+尾数位(f)。二进制浮点数可以表示为:(-1)^s x 1.f x 2^(e-b),其中b为偏移量,b=2^(len(e)-1)-1。

舍入方式:就近舍入,向0舍入,向正无穷舍入,向负无穷舍入。

FP16:  1位标志位+5位指数位+10位尾数位

FP32:  1位标志位+8位指数位+23位尾数位

FP64:1位标志位+11位指数位+52位尾数位

5.1.3 扩展讨论:多样的浮点数据表示

1.BF16格式

BF16一般用于神经网络计算中。

通用图形处理器设计——GPGPU编程模型与架构原理(五)_第1张图片

2.TF32格式

通用图形处理器设计——GPGPU编程模型与架构原理(五)_第2张图片

3.FlexPoint格式

通用图形处理器设计——GPGPU编程模型与架构原理(五)_第3张图片

5.2 运算单元

5.2.1 整型运算单元

整型运算中应用较多的是算数加法,乘法和逻辑运算。

整型数加法步骤:(1)按位相加;(2)判断溢出;(3)溢出处理,输入结果。

整型乘法:(1)部分积产生,一般会采用Booth编码,将部分积减半;(2)部分积累加,利用全加器和半加器,通过反复地覆盖部分积中的点,把部分积的阵列结构转化为一个Wallace树结构,同时减少关键路径长度和所需加法器数目;(3)相加。

逻辑与移位运算:与,或,异或,非等运算;拼接运算,左移,右移等。

5.2.2 浮点运算单元

1.浮点数加法单元

通用图形处理器设计——GPGPU编程模型与架构原理(五)_第4张图片

 步骤:

对阶:使两者的小数点位置对齐;

尾数求和:将对阶后的两个尾数按定点加减运算规则求和;

规格化:为增加有效数字的位数,提高运算精度,必须将求和后的尾数规格化;

舍入:为提高精度,要考虑尾数右移时丢失的数值位;

再次规格化:舍入后可能会导致数据不符合规格化浮点数的标准,需要再次规格化。

2.浮点数乘法单元

阶码相加减:按照定点整数的加减法运算方法对两个浮点数的阶码进行加减运算。

尾数相乘:按照定点小数的阵列乘除法运算方法对两个浮点数的尾数进行乘除运算。为了保证尾数相除时商的正确性,必须保证被除数尾数的绝对值一定小于除数尾数的绝对值。若被除数尾数的绝对值大于除数尾数的绝对值,需对被除数进行调整,即被除数的尾数每右移1位,阶码加1,直到被除数尾数的绝对值小于除数尾数的绝对值。

结果规格化并进行舍入处理:浮点数乘除运算结果的规格化和舍入处理与浮点数加减运算结果的规格化和舍入处理方法相同。并且在浮点数乘除运算的结果中,由于乘积和商的绝对值一定小于1,因此在浮点乘除运算结果进行规格化处理时只存在向左规格化,不可能出现向右规格化。

判断溢出:浮点数乘除运算结果的尾数不可能发生溢出,而浮点数运算结果的溢出则根据运算结果中浮点数的阶码来确定,溢出的判定和处理方法与浮点加减运算完全相同。

通用图形处理器设计——GPGPU编程模型与架构原理(五)_第5张图片

3.浮点数融合乘加单元

通用图形处理器设计——GPGPU编程模型与架构原理(五)_第6张图片

4.双精度浮点单元

5.2.3 特殊运算单元

5.2.4 张量核心单元

5.3 运算单元架构

5.3.1 运算单元的组织和峰值算力

算力:每秒完成的单精度浮点操作个数,即FLOPS;

峰值算力:理想情况下所有运算单元都工作时所能提供的计算能力,往往是硬件能力的一种衡量,并不能代表软件运行时的实际性能。一般按照CUDA核心满载执行FFMA指令的2个操作来计算的。

5.3.2 实际的指令吞吐率

指令吞吐率是指每个时钟周期发射或完成平均指令数量,代表了实际应用执行时的效率,是GPGPU重要性能指标。软件代码结构及硬件结构都会有影响。

1.调度器和发射单元的影响

2.寄存器文件和共享存储器的影响

5.3.3 扩展讨论:脉动阵列结构

你可能感兴趣的:(前端)