python code仿真嵌入式内核(AI芯片,GPU等)的计算行为,浮点数运算对于底层运算的来说为二进制运算。
- 浮点数二进制存储形式(bfloat16)
- 浮点数十进制到二进制转换
- 舍入原则
- 二进制乘法
- 移位运算
bfloat16二进制表示:1bit符号位,0为正,1为负;8bit的指数位;7bit的尾数
与FP32(1,8,23)比较,bf16的表示范围没有变化,只是最小粒度发生变化,fp32最小数值粒度,bf16最小数值粒度.同时节约内存资源,FP32占4B,bf16占2B。
浮点数十进制转化成二进制
3.75 -> 11.11 -> 1.111 x 2^1 -> 指数部分位127+1 = 128 -> 0 10000000 1100000
浮点数一般舍入原则
floor | 向下取整 | |
ceil | 向上取整 | |
roundtozero | 向靠近0的方向取整 | |
roundtoceil | 向远离0的方向取整 | |
roundtoeven | ||
roundtoodd |
表中只列出了部分舍入原则,不同的浮点处理单元所支持的浮点的舍入原则也不尽相同,要根据实际的硬件平台确定舍入原则。
浮点数二进制乘法
乘法选择roundtoeven原则
3.9375*3.9375 (数据类型为bfloat16)
11.1111 -> 1.11111 x 2^1 * 11.1111 -> 1.11111 x 2^1 -> 1.11111 x 1.11111 x 2^2
那么二进制的乘法结果为11.1110000001 x 2^2 -> 1.11110000001x 2^3 -> 1.1111000(roundtoeven)x2^3
将结果转化为IEEE754的表示形式:
符号位:0
指数位:127+3 = 130 -> 10000010
位数位:1111000
乘法的结果为,0 10000010 1111000
移位运算
移位运算指的是向右或向左进行移位,本节描述的移位并不像整数类型直接是位置向左或向右shift,这里你可以理解为一个浮点数除以或是乘以2^n.
浮点数也可通过如下表示,
则移位相当于
如下
3.9375*3.9375/2^n
3.9375*3.9375结果的指数部分为10000010
3.9375*3.9375/2^n结果指数部分为10000010 - n, sign与mantissa位不变。
若n=2,则3.9375*3.9375/2^n 的结果为,0 10000000 1111000
如有异议,可随时给我留言,大家一起讨论。