IEEE754
Table of Contents
1. IEEE754
1.1. float
<- 1-> <- 8 -> <- 23 -> ---------------------------- <sign> <exponent> <fraction>
以 11.01*2^(-4) 为例:
- 首先需要转换为 1.x * 2^(n) 的形式: 1.101*2(-4)
- sign 为 0
- exponent 为 -4+127, 其中 127 是一个固定的 bias.
- fraction 为 b10100000000000000000000 (而不是 b110100…, 最开头的 1 编码时需要省略掉, 也不是 b000…101)
float 格式中 8 bit exponent 的值的范围是 [0, 255], 但 0 和 255 有特殊用途 (\(\pm{0}, \pm\infty, NaN\)), 所以 float 的 exponent 的范围是 [1-127, 254-127] 即 [-126, 127]
Backlinks
RISC-V Tutorial (RISC-V Tutorial > 其它 > Arithmetic Overflow): riscv 进行浮点计算时会通过 fcsr 指示 overflow 和 underflow (underflow 是指浮点数 过于接近 0 (例如 \(1.0*2^{-127}\)), 而 float 的 exponent 最小是 -126, 无法精确表示)
1.2. double
<- 1-> <- 12 -> <- 51 -> ---------------------------- <sign> <exponent> <fraction> exponent bias 为 1023
1.3. BF16
另外, 存在非标准的 bf16 格式, 它与 float 的唯一区别是 fraction 从 23 位变为 7 位, 导致它精度会下降, 但它与 float 转换非常容易: bf16 末尾添 16 个 0 就可以转换为 float, float 取高 16 位就可以转换为 bf16.
AI 推理硬件(例如 google cloud tpu)使用 bf16 可以获得体积较小的模型. 同时减小转换回 float32 的开销.
Backlinks
Quantization (Quantization > Overview): - bf16, 使用 float16 时, 如果碰到 gpu 不支持的算子, fallback 到 cpu 会涉及 float16 与 float32 的转换开销. bf16 可以减小这种开销, 一方面, 支持 bf16 的 AI 加速器 (例如 google cloud tpu) 可以减小 fallback 时转换的开销, 另一方面, 部署 到不支持 bf16 的 cpu 上也可以通过较小的转换开销支持尺寸更小的模型
Backlinks
RISC-V Tutorial (RISC-V Tutorial > Standard Extention > RV32F and RV32D): RV32{F,D} 是针对浮点数的指令, 浮点数的格式是 IEEE754