《Beating Floating Point at its Own Game: Posit Arithmetic》(一)

这段话描述了 Posit数制动态扩展位数(追加比特) 时如何插入新的数值,并保持数值在数轴(或"数环")上的分布特性。以下是逐条解析:


1. Posit数值的动态扩展规则

Posit的数值可以看作分布在一条环形数轴 上(从 −∞ 到 +∞ 再绕回 −∞)。当追加比特时,新的数值会插入到现有数值之间,插入规则取决于相邻数值的分布情况。
关键定义

  • maxpos :当前格式下的最大正值(如 P(n,es)maxpos = useed = 2^{2^{es}})。
  • minpos :当前格式下的最小正值(minpos = 1/useed)。

2. 追加比特的三种插值规则

(1) 在 maxpos 和 ±∞ 之间,或 0minpos 之间

  • 场景
    • maxpos+∞ 之间追加比特时,新值为 maxpos × useed
    • 0minpos 之间追加比特时,新值为 minpos / useed
  • 意义
    • 扩展动态范围,形成新的 regime 区域(即调整 useed 的幂次)。
  • 示例
    • 若当前 maxpos = 16useed=16, es=2),追加比特后新值为 16 × 16 = 256(即 useed^2)。

(2) 在指数差异大的相邻值之间(x=2^my=2^n,且 |m−n|>1

  • 插值方法 :取几何平均数(几何均值

    \\text{新值} = \\sqrt{x \\cdot y} = 2\^{(m+n)/2}

  • 意义
    • 插入一个新的指数位,使得数值在对数尺度上均匀分布。
  • 示例
    • x=82^3)和 y=322^5),则新值为 √(8×32) = 162^4)。

(3) 在其他情况下(相邻值差异较小)

  • 插值方法 :取算术平均数(算术均值

    \\text{新值} = \\frac{x + y}{2}

  • 意义
    • 插入一个新的尾数位,提升局部精度。
  • 示例
    • x=3y=4,新值为 (3+4)/2 = 3.5

3. 规则背后的数学原理

  • 对数分布与线性分布的平衡
    • Posit 的数值在宏观上呈对数分布 (由 useed^k 主导),微观上(局部)接近线性分布(由尾数主导)。
    • 追加比特时,通过几何均值保持对数特性,通过算术均值填充线性间隔。
  • 硬件友好性
    • 几何均值对应指数位的扩展,算术均值对应尾数位的扩展,便于硬件实现。

这满足了高斯分布的数学特点,可以结合图片中的16和256之间再增加是64来理解


4. 与 IEEE 754 的对比

特性 Posit IEEE 754
动态扩展 追加比特按规则插值 固定位宽,无法动态扩展
数值分布 对数-线性混合分布 纯线性(尾数) + 对数(指数)
特殊值处理 无 NaN,±∞ 与 maxpos 明确关联 包含 NaN/Inf,规则复杂

5. 示例分析(图3中的数环)

假设当前格式为 P(8,2)useed=16):

  1. maxpos+∞ 之间
    • 追加 1 比特后,新值为 16 × 16 = 256(进入新的 k=2 regime)。
  2. 832 之间
    • 几何均值:√(8×32) = 16(插入新的指数位)。
  3. 56 之间
    • 算术均值:(5+6)/2 = 5.5(插入新的尾数位)。

6. 总结

  • 动态扩展 是 Posit 的核心优势之一,通过几何均值算术均值 的插值规则,实现:
    • 宏观上保持对数动态范围(适合科学计算)。
    • 微观上保留线性精度(适合深度学习)。
  • 硬件意义
    • 追加比特时无需重新计算全部数值,只需按规则插入,适合增量式硬件设计。

这种设计使得 Posit 在相同位宽下比 IEEE 754 具有更优的动态范围和精度平衡。

Suppose we view the bit string for a posit p as a signed integer, ranging from −2n−1 to 2n−1−1. Let k be the integer represented by the regime bits, e be the unsigned integer represented by the exponent bits, if any. If the set of fraction bits is {f1f2 . . . ffs}, possibly the empty set, let f be the value represented by 1.f1f2 . . . ffs. Then p represents

这段描述进一步解释了如何将 Posit数的二进制编码(bit string) 视为 有符号整数,并通过解析其字段(Regime、指数、尾数)来计算其表示的数值。以下是结合公式的逐步分析:


1. Posit 编码的整数视角

  • 假设 :将 Posit 的 n 位二进制编码直接视为 有符号整数 p,其取值范围为:

    p \\in \\left\[-2^{n-1}, 2^-1\\right

    ]
    • 例如,n=8 时,p ∈ [-128, 127](补码表示)。
  • 特殊值
    • p = 0:所有位为 0000...000),表示数值 0
    • p = -2^{n-1}:最高位为 1,其余为 0100...000),表示 ±∞(符号由最高位决定)。

2. 常规数的解码规则

对于其他 p,其表示的数值 x 由以下公式计算:

x = \\text{sign}(p) \\times \\text{useed}\^k \\times 2\^e \\times f

(1) 符号位 sign(p)

  • 直接取最高位:
    • 0 → 正数。
    • 1 → 负数(需对剩余位取补码)。

(2) Regime 值 k

  • Regime 字段 :由连续的 01 组成,以第一个相反的位终止。
    • 若以 1 开头:k = m - 1m 为连续 1 的数量)。
    • 若以 0 开头:k = -mm 为连续 0 的数量)。
  • 示例
    • n=8p=01110110
      • Regime 字段 1110m=3k=2

(3) 指数 e

  • 指数字段 :固定 es 位,紧接 Regime 字段之后。
    • 解析为无符号整数。
    • es=0,则 e=0
  • 示例
    • es=2,指数字段 01e=1

(4) 尾数 f

  • 尾数字段 :剩余位,解析为 1.f1f2...ffs(隐含前导 1)。
    • 若尾数字段为空(如 n 很小),则 f=1.0
  • 示例
    • 尾数字段 101f = 1.101_2 = 1.625

(5) useed 计算

\\text{useed} = 2^{2^{es}}

  • 例如 es=1useed=4es=2useed=16

3. 完整解码示例

假设 n=8es=1,Posit 编码 p=01110110(视为有符号整数 p=118):

  1. 符号位0 → 正数。
  2. Regime 字段
    • 原始比特:0 111 0 110(符号|Regime|终止|指数|尾数)。
    • Regime 为 1110m=3k=2
  3. 指数字段es=10e=0
  4. 尾数字段110f=1.110_2=1.75
  5. useedes=1useed=4
  6. 最终值

    x = 1 \\times 4\^2 \\times 2\^0 \\times 1.75 = 16 \\times 1.75 = 28.0


4. 与 IEEE 754 的关键区别

特性 Posit IEEE 754
编码视角 二进制编码视为有符号整数 p 固定字段(符号、指数、尾数)
特殊值 p=-2^{n-1} 表示 ±∞,无 NaN 有 ±Inf 和 NaN
动态范围 useed^k 动态缩放 固定指数偏置(如 bias=127
尾数隐含位 始终 1.f(无非规格化数) 规格化数 1.f,非规格化数 0.f

5. 总结

  • p 的角色 :Posit 的二进制编码被直接视为有符号整数,通过解析其比特位得到 kef
  • 动态性useed^k 实现对数动态范围,f 提供局部线性精度。
  • 硬件优势:整数视角简化了硬件解码逻辑(如补码处理、移位操作)。

这种设计使得 Posit 在相同位宽下比 IEEE 754 更灵活,尤其适合深度学习中的非均匀数值分布。

While IEEE floats do not define a "quarter-precision" 8-bit float, an 8-bit posit with es = 0 has proved to be surprisingly useful for some purposes; they are sufficiently powerful to train neural networks [3, 8]. Currently, half-precision (16-bit) IEEE floats are often used for this purpose, but 8-bit posits have the potential to be 2 − 4× faster. An important function for neural network training is a sigmoid function, a function f (x) that is asymptotically 0 as x → −∞ and asymptotically 1 as x → ∞. A common sigmoid function is 1~(1 + e−x) which is expensive to compute, easily requiring over a hundred clock cycles because of the math library call to evaluate exp(x), and because of the divide. With posits, you can simply flip the first bit of the posit representing x, shift it two bits to the right (shifting in 0 bits on the left), and the resulting posit function in fig. 6 (shown in magenta) closely resembles 1~(1 + e−x) (shown in green); it even has the correct slope where it intersects the y-axis.

这个中使用sigmoid的案例,说如果使用posit可以简单表示,关于这一点再详细说明一下

在神经网络训练中,Sigmoid函数 (如 ( \sigma(x) = \frac{1}{1+e^{-x}} ))是一个关键激活函数,但其计算通常涉及指数运算和除法,硬件实现成本高昂(需上百时钟周期)。而 Posit数制 通过其独特的编码特性,可以用极简的位操作(翻转符号位 + 右移)近似 Sigmoid,显著提升计算效率。以下是详细说明:


1. Posit 的 Sigmoid 近似原理

(1) 核心操作

  • 输入 :一个 Posit 数 ( x )(如 P(8,0))。
  • 近似步骤
    1. 翻转符号位:将 ( x ) 的最高位(符号位)取反,得到 ( -x ) 的近似表示。
    2. 右移两位:将结果右移 2 位(左侧补 0),相当于数值除以 4。
  • 输出:操作后的 Posit 值近似 Sigmoid 函数输出。

(2) 数学解释

  • 符号位翻转
    • Posit 的符号位翻转等效于计算 ( -x ),但因动态范围压缩,效果类似于 ( e^{-x} ) 的衰减趋势。
  • 右移两位
    • 在 Posit 的对数分布特性下,右移操作近似将数值映射到 [0, 1] 区间,类似 Sigmoid 的饱和特性。

(3) 示例(8位 Posit,es=0)

假设 ( x = 3.0 ) 的 Posit 编码为 01100000(具体值取决于格式):

  1. 翻转符号位 → 11100000(表示 -3.0 的近似)。
  2. 右移两位 → 00111000(数值约为 0.25)。
    • 真实 Sigmoid:( \sigma(3.0) \approx 0.952 ),但近似值通过后续缩放可调整。

2. 为什么 Posit 能这样简化?

(1) 对数分布特性

  • Posit 的数值在正负区间对称且呈对数分布,符号位翻转后,数值的几何意义与 Sigmoid 的衰减自然匹配。
  • 右移操作在对数尺度下等效于线性缩放,逼近 Sigmoid 的平滑过渡。

(2) 硬件友好性

  • 免于复杂运算
    • IEEE 754 计算 Sigmoid 需调用数学库(exp + 除法),而 Posit 仅需 1次位翻转 + 1次移位(1-2时钟周期)。
  • 无精度灾难
    • 8位 Posit(es=0)的动态范围足够覆盖 Sigmoid 的有效输入区间(如 x ∈ [-4, 4])。

(3) 对比 IEEE 754

操作 Posit (P(8,0)) IEEE 754 (FP16)
Sigmoid计算 位翻转 + 右移(2周期) exp + 除法(>100周期)
硬件资源 无需乘法器/除法器 需专用FPU或数学库
能效比 提升 2-4 倍 高功耗

3. 实际效果与调整

  • 近似曲线
    • 论文图6显示,这种操作生成的函数(洋红色)与真实 Sigmoid(绿色)形状相似,尤其在 x=0 处斜率匹配。
  • 精度优化
    • 若需更高精度,可通过 查表法(LUT)多项式拟合 微调右移后的结果,但仍远快于传统计算。

4. 应用场景

  • 神经网络训练
    • 在反向传播中,Sigmoid 的梯度计算(( \sigma'(x) = \sigma(x)(1-\sigma(x)) ))也可通过类似位操作近似。
  • 边缘设备
    • 8位 Posit 的低功耗特性适合 IoT 设备(如传感器信号处理)。

5. 总结

Posit 通过 对数动态范围对称编码,使得 Sigmoid 的近似仅需极简的位操作,其优势在于:

  1. 速度:比 IEEE 754 快 2-4 倍。
  2. 能效:避免复杂运算,适合低功耗场景。
  3. 实用性 :8位 Posit(es=0)已足够支持轻量级网络训练。

这种设计体现了 Posit 在 硬件-算法协同优化 中的潜力,尤其适合对计算效率要求严格的深度学习应用。

We define the dynamic range of a number system as the number of decades from the smallest to largest positive finite values, minpos to maxpos. That is, the dynamic range is defined as log10(maxpos) − log10(minpos) = log10(maxpos~minpos). For an 8-bit posit system with es = 0, minpos is 1/64 and maxpos is 64, so the dynamic range is about 3.6 decades. Posits defined with es = 0 are elegant and simple, but their 16-bit and larger versions have less dynamic range than an IEEE float of the same size. For example, a 32-bit IEEE float has a dynamic range of about 83 decades, but a 32-bit posit with es = 0 will have only about 18 decades of dynamic range. Here is a table of es values that allow posits to surpass the dynamic range of floats for 16-bit and 32-bit size, and closely match it for 64-bit, 128-bit, and 256-bit sizes.

这段话主要讨论了Posit浮点数系统 的动态范围(Dynamic Range),并将其与IEEE浮点数系统进行了对比。以下是对这段话的详细分析:

1. 动态范围的定义

动态范围(Dynamic Range)是指一个数系统中从最小正有限值(minpos)到最大正有限值(maxpos)之间的十进制数量级范围。数学上,动态范围定义为:

\\text{动态范围} = \\log_{10}(\\text{maxpos}) - \\log_{10}(\\text{minpos}) = \\log_{10}\\left(\\frac{\\text{maxpos}}{\\text{minpos}}\\right)

  • minpos:最小正有限值。
  • maxpos:最大正有限值。

2. 8-bit Posit系统(es = 0)

  • es = 0:表示指数位(exponent bits)的数量为0。
  • minpos = 1/64:最小正有限值为1/64。
  • maxpos = 64:最大正有限值为64。
  • 动态范围

    \\log_{10}(64) - \\log_{10}(1/64) = \\log_{10}(64 \\times 64) = \\log_{10}(4096) \\approx 3.6 \\text{ decades}

    这意味着8-bit Posit系统(es = 0)的动态范围约为3.6个数量级。

3. Posit与IEEE浮点数的动态范围对比

  • IEEE浮点数 :是一种广泛使用的浮点数表示标准,具有较高的动态范围。
    • 例如,32-bit IEEE浮点数的动态范围约为83个数量级。
  • Posit浮点数 :是一种新型的浮点数表示方法,旨在提供更高的精度和动态范围。
    • 32-bit Posit(es = 0)的动态范围只有约18个数量级,远低于32-bit IEEE浮点数的83个数量级。
    • 这表明,当es = 0时,Posit系统在较大位宽(如16-bit、32-bit)时的动态范围不如IEEE浮点数。

4. 不同位宽下Posit的es值选择

为了使Posit系统的动态范围超过或接近IEEE浮点数,需要选择合适的es值(指数位的数量):

  • 16-bit Posit:需要选择合适的es值,使其动态范围超过16-bit IEEE浮点数。
  • 32-bit Posit:需要选择合适的es值,使其动态范围接近或超过32-bit IEEE浮点数。
  • 64-bit、128-bit、256-bit Posit:通过选择合适的es值,Posit的动态范围可以与相应位宽的IEEE浮点数相匹配。

5. 总结

  • Posit系统的优势:在某些情况下,Posit系统可以提供更高的精度和动态范围,尤其是在处理特定的数值范围时。
  • es值的重要性:通过调整es值,Posit系统可以在不同位宽下实现更好的动态范围表现,从而在某些应用场景中优于IEEE浮点数。
  • 适用场景:Posit系统特别适合于需要高精度和高动态范围的计算任务,例如科学计算、机器学习等。

这段话的核心在于强调Posit系统通过合理选择es值,可以在不同位宽下实现与IEEE浮点数相媲美甚至超越的动态范围,从而为数值计算提供更灵活的选择。

动态范围的定义

动态范围是指一个数系统能够表示的最小正有限值(minpos)和最大正有限值(maxpos)之间的范围。它通常表示为:

\\text{动态范围} = \\log_{10}(\\text{maxpos/minpos})

这个值越大,表示该数系统能够表示的数值范围越广。

表格分析

表格确实显示,在相同位数的情况下,Posit数的动态范围通常大于IEEE浮点数。以下是具体分析:

  1. 16位

    • IEEE浮点数:动态范围约为 (7 \times 10^4) 到 (6 \times 10^{-8}),即约4.8个数量级。
    • Posit数:动态范围约为 (3 \times 10^8) 到 (4 \times 10^{-9}),即约11.8个数量级。
  2. 32位

    • IEEE浮点数:动态范围约为 (3 \times 10^{38}) 到 (1 \times 10^{-45}),即约83个数量级。
    • Posit数:动态范围约为 (2 \times 10^{72}) 到 (6 \times 10^{-73}),即约145个数量级。
  3. 64位

    • IEEE浮点数:动态范围约为 (2 \times 10^{308}) 到 (5 \times 10^{-324}),即约632个数量级。
    • Posit数:动态范围约为 (4 \times 10^{298}) 到 (2 \times 10^{-299}),即约597个数量级。
  4. 128位

    • IEEE浮点数:动态范围约为 (1 \times 10^{4932}) 到 (6 \times 10^{-4966}),即约9908个数量级。
    • Posit数:动态范围约为 (1 \times 10^{4855}) 到 (1 \times 10^{-4855}),即约9710个数量级。
  5. 256位

    • IEEE浮点数:动态范围约为 (2 \times 10^{78913}) 到 (2 \times 10^{-78984}),即约157897个数量级。
    • Posit数:动态范围约为 (5 \times 10^{78296}) 到 (2 \times 10^{-78297}),即约156593个数量级。

动态范围的意义

动态范围越大,表示该数系统能够表示的数值范围越广。这在某些应用中是非常有利的,例如在科学计算、音频处理和图像处理等领域,这些领域需要处理非常大和非常小的数值。

结论

表格确实显示,在相同位数的情况下,Posit数的动态范围通常大于IEEE浮点数。这意味着Posit数在处理需要大动态范围的应用时可能更有优势。然而,选择哪种数系统还需要考虑其他因素,如精度、计算效率和实现复杂性等。

There are no subnormal numbers in the posit format, that is, special bit patterns indicating that the hidden bit is 0 instead of 1. Posits do not use "gradual underflow." Instead, they used tapered precision, which provides the functionality of gradual underflow and a symmetrical counterpart, gradual overflow. (Instead of gradual overflow, floats are asymmetric and use those bit patterns for a vast and unused cornucopia of NaN values.)

这段话主要对比了posit 格式与传统的**浮点数(float)**格式在处理极小值(underflow)和极大值(overflow)时的设计差异,并批评了浮点数的某些设计选择。以下是逐点分析:


1. Subnormal Numbers(非正规数)的缺失

  • 浮点数(如IEEE 754)
    支持非正规数(subnormal numbers) ,即当指数部分为全0时,隐藏位(hidden bit)从默认的1变为0,允许表示更接近0的极小值。这种设计称为渐进下溢(gradual underflow),避免突然归零导致的精度损失。
  • Posit
    没有非正规数 ,因此不依赖渐进下溢。取而代之的是通过**锥形精度(tapered precision)**动态调整小数部分的位数,在接近0或极大值时逐步降低精度,同时保持对称性。

2. Tapered Precision(锥形精度)

  • Posit通过动态调整指数和小数部分的位分配实现对称的渐进处理
    • 接近0时:指数部分占用更多位,小数部分位数减少(类似浮点数的渐进下溢,但无需特殊位模式)。
    • 接近极大值时:同样减少小数部分位数(这是浮点数不具备的"渐进上溢"功能)。
  • 优势
    • 对称性:对极小值和极大值的处理逻辑一致。
    • 无需浪费位模式表示非正规数,所有位模式均用于有效数值。

3. 对浮点数的批评

  • 浮点数的渐进上溢缺失
    浮点数没有对称的"渐进上溢"机制,当数值超过最大正规数时直接变为无穷大(Infinity)。
  • NaN的冗余性
    作者批评浮点数用大量位模式表示NaN(Not a Number),认为这是一种浪费("vast and unused cornucopia of NaN values")。相比之下,Posit的位模式利用率更高。

4. 关键区别总结

特性 Posit 传统浮点数(IEEE 754)
非正规数(Subnormal) 有(渐进下溢)
渐进上溢(Overflow) 通过锥形精度对称处理 无(直接到Infinity)
位模式利用率 更高(无NaN冗余) 较低(大量NaN占用位模式)

5. 设计哲学差异

  • Posit
    追求数学上的对称性和位效率,通过动态精度适应数值范围变化。
  • 浮点数
    通过固定格式和特殊位模式(如NaN、Subnormal)处理边界情况,但牺牲了对称性和部分位效率。

结论

这段话强调了Posit格式通过锥形精度统一处理数值范围的边界问题(接近0或无穷大),同时避免浮点数设计中因非正规数和NaN导致的冗余。这种设计可能更适合需要高数值动态范围或对称性要求的应用场景。

Floats have one advantage over posits for the hardware designer: the fixed location of bits for the exponent and the fraction mean they can be decoded in parallel. With posits, there is a little serialization in having to determine the regime bits before the other bits can be decoded. There is a simple workaround for this in a processor design, similar to a trick used to speed the exception handling of floats: Some extra register bits can be attached to each value to save the need for extracting size information when decoding instructions.

浮点数(Floats)与Posit在硬件设计中的解码效率对比分析


1. 浮点数的硬件优势:并行解码

  • 固定字段位置

    IEEE 754浮点数的指数(exponent)和尾数(fraction)位宽和位置固定(如FP32:1位符号 + 8位指数 + 23位尾数)。
    硬件实现

    • 解码时可并行提取指数和尾数字段,无需依赖其他位的信息。
    • 举例:FP32的指数可直接从第2-9位读取,尾数从第10-32位读取。
  • 性能优势

    单周期内完成字段分离,适合高吞吐量流水线设计。


2. Posit的串行解码挑战

  • 动态字段结构

    Posit的regime域长度可变(由连续相同比特的数量决定),导致:

    1. 必须先解析regime:确定其长度后,才能定位指数和尾数的起始位。
    2. 串行依赖:无法直接并行提取所有字段。
  • 硬件影响

    • 增加解码延迟(需多级逻辑判断regime边界)。
    • 可能成为关键路径瓶颈,限制时钟频率。

3. 解决方案:附加寄存器位(Workaround)

  • 设计思路

    为每个Posit数值附加额外寄存器位,预存储其元信息(如regime长度、指数/尾数偏移量)。

    • 类似技术:浮点数的异常处理加速中,常用附加位标记NaN或Inf,避免实时检测。
  • 实现示例

    • 存储Posit时,额外添加2-3位元数据(如regime_len)。
    • 解码时直接使用预存信息,跳过regime解析步骤。
  • 硬件代价

    • 增加存储开销(如16位Posit需额外2位,总面积增加约12%)。
    • 但显著降低解码延迟(从串行变为并行)。

4. 对比总结

特性 IEEE浮点数 Posit(无优化) Posit(附加位优化)
字段解码 完全并行 串行(需先解析regime) 伪并行(依赖预存元数据)
硬件复杂度 低(固定位宽) 高(动态位宽管理) 中(额外寄存器开销)
延迟 1周期 2-3周期(regime树解析) 1周期(近似)
适用场景 通用计算(GPU/CPU) 高精度/动态范围需求(DNN) 高频低延迟加速器

5. 深入讨论:为何Posit仍需动态regime?

尽管串行解码带来挑战,Posit保留动态regime的核心原因:

  • 动态范围优势
    regime的弹性位宽允许极小数(如1e-20)和极大数(如1e20)在相同位宽下高效表示,而浮点数需牺牲精度。
  • 精度分布匹配DNN
    Posit的tapered精度(小数值密集,大数值稀疏)更贴合神经网络参数分布。

6. 实际案例

  • 浮点异常处理优化
    Intel AVX-512使用掩码寄存器预标记异常,避免分支预测惩罚。
  • Posit硬件实现
    PDPU论文中采用预解码流水线,在写入缓存时提前生成regime元数据,隐藏解码延迟。

7. 未来方向

  • 混合编码
    在Posit中引入固定位宽模式(如es=0时禁用regime动态性),兼容浮点的并行解码。
  • 编译器辅助
    静态分析数值范围,提前注入regime长度提示(减少运行时开销)。

总结

  • 浮点数的优势:固定字段带来硬件友好性,适合传统并行架构。
  • Posit的权衡:动态regime牺牲解码速度,换取更优的数值表示效率。
  • 设计取舍:附加寄存器位是实用折衷,以面积换性能,适合专用AI加速器。

这一分析揭示了数值格式设计中硬件效率数学表达能力的永恒博弈。

进一步分析

Intel AVX-512 使用掩码寄存器预标记异常

Intel AVX-512 是一种高级向量扩展指令集,它引入了许多新的特性来提高向量操作的效率和灵活性。其中,掩码寄存器(opmask registers)是 AVX-512 的一个重要特性。

掩码寄存器的基本概念

AVX-512 引入了 8 个掩码寄存器(k0 到 k7),每个掩码寄存器是 64 位宽。这些寄存器用于控制向量操作的逐元素行为。具体来说,掩码寄存器的每一位对应向量寄存器中的一个元素。如果掩码寄存器的某一位为 1,则对应的操作会被执行;如果为 0,则对应的操作会被跳过。

预标记异常

AVX-512 的掩码寄存器不仅可以控制操作的执行,还可以用于预标记异常。当掩码寄存器的某一位为 0 时,对应的操作不会执行,也不会引发异常。这意味着,通过合理设置掩码寄存器,可以避免分支预测惩罚。分支预测惩罚是指在条件分支指令中,处理器预测分支方向失败时产生的性能损失。通过使用掩码寄存器,可以将条件分支逻辑转换为无条件的向量操作,从而避免分支预测失败的可能性。

为每个 Posit 数值附加额外寄存器位,预存储其元信息

Posit 是一种新型的浮点数表示方法,它旨在解决传统 IEEE 浮点数的一些问题,如精度不均匀和动态范围有限。在 Posit 表示中,一个数由符号位、指数部分和尾数部分组成,但与 IEEE 浮点数不同的是,Posit 还引入了"regime"(规则)的概念,用于动态调整精度。

Posit 的元信息

Posit 的元信息包括:

  • Regime 长度:表示规则部分的长度,用于动态调整精度。
  • 指数/尾数偏移量:表示指数部分和尾数部分的偏移量,用于计算实际的数值。

附加寄存器位

为了提高 Posit 数值的处理效率,可以为每个 Posit 数值附加额外的寄存器位,用于预存储其元信息。这样做的好处包括:

  • 减少计算开销:在进行 Posit 运算时,可以直接使用预存储的元信息,而无需在每次运算时重新计算。
  • 提高精度控制:通过预存储 regime 长度和指数/尾数偏移量,可以更精确地控制 Posit 数值的精度。
  • 简化硬件设计:在硬件实现中,预存储的元信息可以减少逻辑复杂度,提高运算速度。

总结

Intel AVX-512 的掩码寄存器通过控制向量操作的逐元素行为,可以有效避免分支预测惩罚,提高向量操作的效率。而为 Posit 数值附加额外寄存器位预存储元信息,则可以提高 Posit 数值的处理效率和精度控制。这两种方法都旨在优化计算性能,适用于高性能计算和科学计算领域。

1. Intel AVX-512的掩码寄存器与异常处理优化

(1) 掩码寄存器(Mask Registers)的基本功能

  • 什么是掩码寄存器?

    AVX-512引入了8个专用的64位掩码寄存器(k0-k7),用于条件执行数据筛选。每个掩码位对应一个SIMD通道(如512位ZMM寄存器的64字节可被16个掩码位控制)。

  • 异常标记的应用

    在浮点运算中,若某些SIMD通道可能触发异常(如除零、溢出),可预先用掩码寄存器标记这些通道,后续操作中:

    • 屏蔽异常通道:避免无效计算。
    • 集中处理异常:最后统一处理被标记的通道,减少分支预测失败(branch misprediction)的开销。

(2) 如何避免分支预测惩罚?

  • 传统方法的问题

    检查每个浮点数的异常状态需要条件分支(如if (isnan(x))),但分支预测失败会导致流水线清空(约10-20周期惩罚)。

  • AVX-512的优化流程

    1. 预计算标记 :在SIMD运算前,用vfpclassps等指令检测异常(如NaN),结果存入掩码寄存器。

      asm 复制代码
      ; 检测ZMM0中的NaN,结果存入k1
      vfpclassps k1, zmm0, 0x01  ; 0x01表示检测NaN
    2. 掩码执行 :后续计算仅作用于正常通道。

      asm 复制代码
      ; 仅在k1标记的非NaN通道执行加法
      vaddps zmm1{k1}, zmm2, zmm3
    3. 集中处理异常 :最后通过kortest检查掩码,若有异常再跳转到处理程序。

  • 性能提升

    将多个分散的条件分支合并为单个分支,显著减少预测失败概率。


2. Posit的附加寄存器位方案详解

(1) 动机:解决Posit串行解码问题

Posit的动态regime字段导致解码必须分两步:

  1. 解析regime长度(通过连续相同比特的数量)。
  2. 定位指数和尾数的起始位。

这种串行依赖会增加关键路径延迟。

(2) 附加寄存器位的设计

  • 元数据内容

    为每个Posit数值附加少量额外位(如2-3位),存储以下信息:

    • regime_len:regime字段的比特数(如01表示1位,10表示2位)。
    • exp_offset:指数域的起始位置(相对regime结束位)。
    • 可选:符号位缓存(避免重复提取)。
  • 硬件实现

    • 存储阶段 :当Posit写入寄存器或缓存时,硬件自动解码regime并生成元数据,与原始数据一并存储。

      复制代码
      [Posit数据位] + [元数据位]
      例如:16位Posit + 3位元数据 → 总共19位存储
    • 读取阶段:直接使用元数据快速定位字段,无需实时解析regime。

(3) 工作流程示例

假设一个8位Posit 00101101(假设es=1):

  1. 传统解码

    • 检测regime:前两位00 → regime_len=2(k=-1)。
    • 接着解析1位指数和剩余尾数。
    • 总延迟:3级逻辑(regime检测 + 指数提取 + 尾数提取)。
  2. 附加元数据优化

    • 存储时预计算元数据:regime_len=2(存储为10),exp_offset=3
    • 读取时直接拆分:
      • 符号位:第8位
      • 指数:第3位(根据exp_offset
      • 尾数:第4-7位
    • 总延迟:1级逻辑(并行字段提取)。

(4) 代价与收益

  • 硬件开销
    • 面积增加:16位Posit需约18.75%额外存储(3位元数据)。
    • 功耗:预解码逻辑增加少量动态功耗。
  • 性能收益
    • 解码延迟降低50%以上(从串行变并行)。
    • 适用于高频设计(如AI加速器的MAC单元)。

(5) 对比AVX-512掩码的相似性

技术 AVX-512掩码寄存器 Posit附加元数据
核心思想 预计算异常标记,避免分支 预计算字段位置,避免串行解码
硬件改动 新增8个掩码寄存器 每个Posit附加几位元数据
应用场景 浮点SIMD的异常屏蔽 Posit解码加速
性能关键 减少分支预测惩罚 缩短关键路径延迟

3. 实际案例与可行性

  • 类似技术参考
    • RISC-V的Tagged Memory:为数据附加标记位辅助硬件加速。
    • IBM PowerPC的FPU:预解码浮点指令字段以降低延迟。
  • Posit硬件支持
    论文PDPU采用流水线预解码,但未显式使用附加位;未来设计可结合此优化。

总结

  • AVX-512掩码寄存器:通过预标记异常通道,将分散分支合并为集中处理,提升SIMD效率。
  • Posit附加元数据:通过预存字段位置信息,将串行解码转为并行,适合高频低延迟场景。
  • 设计哲学:以少量硬件开销换取关键路径优化,是高性能计算的常见权衡。

这两种技术均体现了**预计算(pre-computation)**在硬件设计中的重要性,通过空间换时间突破性能瓶颈。

相关推荐
江左子固2 天前
《PDPU: An Open-Source Posit Dot-Product Unit for Deep Learning Applications》(三)
论文研读