融合算法部件(一)

知识点总结:

1. 理解如下的一段话

A×B+C运算是先把A×B产生部分积经 过 4:2CSA压缩和 3:2CSA压缩得到Sum和Carry,再让这两个数进行加法运算得出 结果D再进行D+C操作,最后得到最终结果,此种算法需要经过两次加法操作,并 且需要进行两次结果的舍入操作,使得运算冗余太多;而乘加融合部件运算时是 把A×B+C中A×B中产生的Sum和Carry与经过移位对齐的操作数C再进行一步 3:2CSA压缩,之后产生两个新的Sum1 和Carry1,再对它们两个进行加法操作,得 到最终结果。浮点融合乘加单元的运算是将A×B+C作为一个不可分割的整体,采用一条指令完成

传统方法(两次加法和两次舍入)
想象一下,你有两个篮子,一个装着苹果(代表乘法的结果),另一个装着橙子(代表加法的结果)。你需要把苹果和橙子合并成一个结果。
乘法操作(A×B):
你先把苹果切成小块(产生部分积),然后用4:2 CSA压缩器和3:2 CSA压缩器把这些小块苹果压缩成两堆:一堆是“Sum”(和),另一堆是“Carry”(进位)。
第一次加法(Sum + Carry):
你把这两堆苹果(Sum和Carry)放在一起,合并成一个更大的苹果堆(结果D)。这个过程需要一次加法操作。
第二次加法(D + C):
然后,你把橙子(C)加到这个大苹果堆(D)里,得到最终的结果。这又需要一次加法操作。
舍入操作:
在每次加法操作后,你还需要对结果进行“修剪”(舍入),以确保结果符合要求。这就像是在每次合并后,都要把多余的果皮削掉。
这种传统方法需要两次加法操作和两次舍入操作,就像你反复地切水果、合并水果、修剪水果,过程比较繁琐。
乘加融合方法(一次加法和一次舍入)
现在,想象你有一个超级机器,它可以一次性处理所有水果,而不需要分步骤。
乘法操作(A×B):
你仍然把苹果切成小块(产生部分积),但这次你直接把橙子(C)也放进去。
融合压缩(3:2 CSA):
超级机器把苹果小块(Sum和Carry)和橙子(C)一起压缩,直接生成两个新的堆:Sum1和Carry1。这一步就像是把苹果和橙子一起搅碎,然后重新组合。
最终加法(Sum1 + Carry1):
最后,你只需要把这两个新的堆(Sum1和Carry1)加在一起,得到最终的结果。这只需要一次加法操作。
一次舍入:
在最终结果出来后,你只需要进行一次“修剪”(舍入)。
这种融合方法就像是把所有水果一次性处理,而不是分步骤处理,大大减少了操作步骤。
总结
传统方法:像是分步骤处理水果,需要多次加法和多次舍入,过程冗长。
乘加融合方法:像是用超级机器一次性处理所有水果,只需要一次加法和一次舍入,更高效。
浮点融合乘加单元(FMA)就是这种超级机器,它把乘法和加法作为一个整体操作,用一条指令完成,大大提高了运算效率。

更进一步的解释

好的,我将详细解释乘加融合方法(FMA,Fused Multiply-Add)的工作原理,并结合4:2 CSA压缩和3:2 CSA压缩的概念,帮助你更好地理解。

  1. 传统方法(两次加法和两次舍入)
    在传统的乘加运算(如 A×B+C)中,通常会先计算乘法部分 A×B,然后将结果与 C 相加。具体步骤如下:
    乘法操作:计算 A×B,产生部分积。
    压缩操作:使用4:2 CSA压缩器或3:2 CSA压缩器将部分积压缩为两个结果:Sum(和)和Carry(进位)。
    第一次加法:将Sum和Carry相加,得到中间结果 D。
    第二次加法:将 D 与 C 相加,得到最终结果。
    舍入操作:每次加法操作后都需要进行舍入,以确保结果符合浮点数的标准。
    这种方法需要两次加法操作和两次舍入操作,增加了计算的复杂性和延迟。
  2. 乘加融合方法(FMA)
    FMA(Fused Multiply-Add)是一种优化的乘加运算方式,它将乘法和加法操作融合为一个不可分割的整体,减少了中间步骤和舍入操作。具体步骤如下:
    2.1 乘法部分
    部分积生成:计算 A×B,产生部分积。这个过程与传统方法相同,但后续处理方式不同。
    2.2 融合压缩
    3:2 CSA压缩:将 A×B 产生的部分积压缩为两个中间结果:Sum和Carry。
    移位对齐:将加数 C 进行移位对齐,以匹配乘法结果的位宽。
    再次压缩:将Sum、Carry和移位后的 C 一起输入到3:2 CSA压缩器中,生成新的中间结果Sum1和Carry1。
    2.3 最终加法
    加法操作:将Sum1和Carry1相加,得到最终结果。
    一次舍入:在整个乘加操作完成后,只进行一次舍入操作。
  3. 优势
    减少操作步骤:FMA将乘法和加法融合为一个步骤,减少了中间的加法和舍入操作。
    提高精度:由于只进行一次舍入,减少了舍入误差的累积。
    提高性能:减少了计算延迟,提高了整体运算效率。
  4. 应用场景
    FMA广泛应用于高性能计算领域,如科学计算、图形处理和人工智能。例如,在深度学习中,FMA可以显著提高矩阵乘法和卷积运算的效率。
    通过这种融合方式,FMA能够更高效地处理复杂的乘加运算,减少了冗余步骤,提高了计算精度和性能。

进一步的解释“移位对齐:将加数 C 进行移位对齐,以匹配乘法结果的位宽”

在浮点运算中,移位对齐是指将参与运算的数通过移位操作调整到相同的位宽或小数点位置,以便进行后续的加法或减法运算。这个过程是浮点运算中的一个重要步骤,尤其是在进行乘法和加法融合操作(FMA)时。
为什么需要移位对齐
在浮点乘加运算(如 A×B+C)中,乘法部分 A×B 会产生一个结果,而加数 C 可能与这个结果的位宽或小数点位置不一致。为了将它们相加,必须先将 C 移位对齐,使其与乘法结果的格式一致。
移位对齐的具体过程
确定位宽差异:计算乘法结果和加数 C 之间的位宽差异。例如,乘法结果可能是一个较大的浮点数,而 C 是一个较小的数。
移位操作:根据位宽差异,对 C 进行左移或右移操作。左移会增加 C 的位宽,右移则减少位宽。
对齐小数点:在浮点运算中,还需要调整 C 的小数点位置,使其与乘法结果的小数点对齐。这通常通过调整指数部分来实现。
举例说明
假设 A×B 的结果是一个较大的浮点数,其二进制表示为 1.0101010 × 2^5(即小数点后移了5位),而加数 C 是一个较小的浮点数,其二进制表示为 1.1010 × 2^2。为了将 C 与乘法结果相加,需要将 C 的小数点右移3位(因为 5−2=3),使其变为 0.0011010 × 2^5。
移位对齐的作用
简化加法运算:通过移位对齐,可以将不同位宽或小数点位置的数调整到一致的格式,从而简化后续的加法运算。
提高运算效率:在浮点融合乘加单元(FMA)中,移位对齐是实现高效运算的关键步骤之一。
通过移位对齐,浮点运算能够更高效地处理不同格式的数,从而提高计算性能和精度。

2. 理解如下一段话

1951 年,A.D.Booth[10,17]提出的 Booth 算法,通过移位运算代替求和运算,简化了部分积的计算,不过并没有减 少部分积的数量。1961 年,O.L.MacSorley[11]提出了一种优化的二阶 Booth 算法, 通过将乘数相邻的 3 位进行编码,减少部分积的数量,后来发展出四阶、八阶等 Booth 算法。

Booth算法和优化的Booth算法(如二阶、四阶、八阶Booth算法)是用于优化乘法运算的算法,主要通过减少部分积的数量来提高乘法运算的效率。以下是对这两种算法的详细解释:

  1. 原始Booth算法(一阶Booth算法)
    Booth算法是一种用于二进制乘法的算法,通过移位和加法操作来简化部分积的计算。虽然它并没有减少部分积的数量,但它通过移位和加法代替了传统的逐位相加,从而提高了运算效率。
    原理
    Booth算法的核心思想是将乘数(被乘数)的每一位与其前一位进行比较,根据比较结果决定当前位的加法操作。具体规则如下:
    如果当前位为1,前一位为0(即“01”),则在当前位加上被乘数。
    如果当前位为0,前一位为1(即“10”),则在当前位减去被乘数。
    如果当前位和前一位相同(即“00”或“11”),则不进行加法或减法操作。
    步骤
    初始化:将被乘数(乘数)和乘数(被乘数)表示为二进制形式,并在乘数的最低位添加一个额外的0(称为“扩展位”)。
    逐位处理:从乘数的最低位开始,逐位检查当前位和前一位的值,根据上述规则决定是否进行加法或减法操作。
    移位操作:每次操作后,将结果右移一位(逻辑移位)。
    重复:重复上述步骤,直到处理完所有位。
    优点
    Booth算法通过移位和加法代替了逐位相加,减少了运算的复杂性。
    它适用于二进制乘法,尤其在硬件实现中效率较高。
  2. 优化的Booth算法(二阶Booth算法)
    优化的Booth算法通过将乘数相邻的3位进行编码,进一步减少部分积的数量。这种方法的核心是将多位(通常是3位)作为一个整体进行处理,从而减少需要处理的部分积数量。
    原理
    二阶Booth算法将乘数的相邻3位作为一个编码单元,根据这3位的值决定当前部分积的操作。具体编码规则如下:
    000:当前部分积为0。
    001:当前部分积为被乘数。
    010:当前部分积为被乘数。
    011:当前部分积为2倍被乘数。
    100:当前部分积为-2倍被乘数。
    101:当前部分积为-被乘数。
    110:当前部分积为-被乘数。
    111:当前部分积为0。
    步骤
    初始化:将被乘数和乘数表示为二进制形式,并在乘数的最低位和最高位分别添加一个扩展位(通常是0)。
    分组处理:将乘数的相邻3位作为一个编码单元,根据上述编码规则确定每个部分积的值。
    部分积相加:将所有部分积相加,得到最终结果。
    优点
    通过将多位作为一个整体处理,减少了部分积的数量,从而减少了后续加法运算的复杂性。
    适用于大规模乘法运算,尤其在硬件实现中可以显著提高效率。
    更高阶Booth算法
    除了二阶Booth算法外,还有更高阶的Booth算法,如四阶、八阶等。这些算法通过将更多的位(如4位、8位)作为一个编码单元,进一步减少部分积的数量。然而,随着阶数的增加,编码规则会变得更加复杂,硬件实现的难度也会增加。
    总结
    Booth算法:通过移位和加法代替逐位相加,简化了部分积的计算,但没有减少部分积的数量。
    优化的Booth算法(如二阶Booth算法):通过将多位作为一个整体进行编码,减少了部分积的数量,从而提高了乘法运算的效率。
    这两种算法在硬件设计和计算机体系结构中得到了广泛应用,尤其是在需要高效乘法运算的场景中。

进一步说明

好的,我们通过一个具体的案例来进一步解释 Booth算法二阶Booth算法 的工作原理。


案例:计算 ( 5 \times (-3) )

假设我们使用 4位二进制补码 表示数字:

  • ( 5 ) 的二进制表示为:( 0101 )
  • (-3) 的二进制表示为:( 1101 )(补码表示)

我们的目标是计算 ( 5 \times (-3) )。


1. Booth算法

Booth算法的步骤:

  1. 初始化

    • 被乘数(Multiplicand, M):( 0101 )(5)
    • 乘数(Multiplier, Q):( 1101 )(-3)
    • 部分积(A):初始化为 ( 0000 )
    • 额外位(Q_{-1}):初始化为 ( 0 )
    • 计数器(n):4(4位二进制数)
  2. 逐位检查乘数的相邻两位(当前位 ( Q_0 ) 和前一位 ( Q_{-1} )):

    • 根据 ( Q_0 ) 和 ( Q_{-1} ) 的值决定操作:
      • ( 00 ) 或 ( 11 ):仅右移
      • ( 01 ):部分积加被乘数 ( M ),然后右移
      • ( 10 ):部分积减被乘数 ( M ),然后右移
  3. 具体操作过程

    步骤 ( Q_0 ) ( Q_{-1} ) 操作 部分积(A) 乘数(Q) ( Q_{-1} )
    0 - 0 初始化 0000 1101 0
    1 1 0 ( A = A - M ) 1011 1101 0
    右移 1101 1110 1
    2 0 1 ( A = A + M ) 0010 1110 1
    右移 0001 0111 0
    3 1 0 ( A = A - M ) 1100 0111 0
    右移 1110 0011 1
    4 1 1 仅右移 1111 0001 1
  4. 最终结果

    • 部分积(A)和乘数(Q)组合为:( 11110001 )
    • 转换为十进制:( 11110001 ) 是 (-15) 的补码表示。
    • 因此,( 5 \times (-3) = -15 )。

2. 二阶Booth算法

二阶Booth算法的步骤:

  1. 初始化

    • 被乘数(Multiplicand, M):( 0101 )(5)
    • 乘数(Multiplier, Q):( 1101 )(-3)
    • 部分积(A):初始化为 ( 0000 )
    • 额外位(Q_{-1}):初始化为 ( 0 )
    • 计数器(n):2(因为每次处理2位)
  2. 逐两位检查乘数的相邻三位(( Q_1, Q_0, Q_{-1} )):

    • 根据三位编码决定操作:
      • ( 000 ) 或 ( 111 ):仅右移2位
      • ( 001 ) 或 ( 010 ):部分积加 ( M ),然后右移2位
      • ( 011 ):部分积加 ( 2M ),然后右移2位
      • ( 100 ):部分积减 ( 2M ),然后右移2位
      • ( 101 ) 或 ( 110 ):部分积减 ( M ),然后右移2位
  3. 具体操作过程

    步骤 ( Q_1 ) ( Q_0 ) ( Q_{-1} ) 操作 部分积(A) 乘数(Q) ( Q_{-1} )
    0 - - 0 初始化 0000 1101 0
    1 1 1 0 ( A = A - M ) 1011 1101 0
    右移2位 1110 1111 0
    2 1 1 0 ( A = A - M ) 1011 1111 0
    右移2位 1110 1111 1
  4. 最终结果

    • 部分积(A)和乘数(Q)组合为:( 11101111 )
    • 转换为十进制:( 11101111 ) 是 (-15) 的补码表示。
    • 因此,( 5 \times (-3) = -15 )。

总结

  • Booth算法 通过逐位检查乘数的相邻两位,减少了加法操作的次数,但部分积的数量没有减少。
  • 二阶Booth算法 通过逐两位检查乘数的相邻三位,进一步减少了部分积的数量,提高了计算效率。

在这个案例中,两种算法都正确地计算出了 ( 5 \times (-3) = -15 ),但二阶Booth算法的步骤更少,效率更高。

posted @ 2025-02-03 23:29  江左子固  阅读(258)  评论(0)    收藏  举报