IEEE754

Table of Contents

1. IEEE754

1.1. float

<- 1-> <-   8  -> <-  23  -> 
----------------------------
<sign> <exponent> <fraction>

以 11.01*2^(-4) 为例:

  1. 首先需要转换为 1.x * 2^(n) 的形式: 1.101*2(-4)
  2. sign 为 0
  3. exponent 为 -4+127, 其中 127 是一个固定的 bias.
  4. 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

Author: [email protected]
Date: 2022-03-02 Wed 16:08
Last updated: 2022-03-07 Mon 20:14

知识共享许可协议