感谢“面包板社区”,给了我这个评测的机会,让我可以接触到龙芯团队的成果。
回顾一下,
================================================
我们目前还是停留在 第五章: 在流水线中添加运算类指令
================================================
Booth 算法实质是:如何从 二进制数 的 “形式” 得到其 “数值” 的另外一种方法
比如 0101 这个"数",如何得到其"值"?
1) 经典的“按其位的权 累加”的方法:
计算过程= ( 1 * 2^0 ) + ( 0 * 2~1 ) + ( 1 * 2^2) + ( 0 * 2^3 )
总共要加 4 次,每个位置的 0,1 都需要参加计算
2) Booth 的简化方法: 多看2个位置: -1位,4位, 这两位的数据当然都是0,
计算过程= ( -1 * 2^0 ) + ( 1 * 2~1 ) + ( -1 * 2^2) + ( 1 * 2^3 )
虽然要看6个位置,累加最多只需 4 次,这个例子里没有连续的0或1可以跳过,计算次数也没有变少了,优点并没有展现出来。
而一般的数字组成,总会有大量的0和1的重复序列,Booth就可以节省很多的计算。
比如:8位 1111_1111 :传统算法要加 8次; Booth算法立刻得出:1*2^8 -1 (这也解释了 -1的几何意义)
再如:8位 1111_0000 :传统算法要加 8次; Booth算法立刻得出:2^8 -2^4
所以, Booth 天生和 乘法 非常亲近; 而和 加法 的距离比较远。
-------------------------------------------------------------------------------
Booth 权重算法 和 Booth 乘法器, 究竟还是不一样的:
-------------------------------------------------------------------------------
本书 P140: 5.2.2 , 电路级实现“乘法器”:
乘数A和B,全部使用补码表示,进行经典的乘法计算,发现:
A补码 * B补码 !== [A*B] 补码
而是:
[A*B] 补码 == A补码 * B' ; 其中 B' =[最高位取反 ,其他位不变]
这个事实说明什么?
可以继续对 B' 进行处理:以32位举例
B' = [-Y31 ,Y30, Y29, ... ,Y1, Y0]
B’ = -Y31 * 2^31 + Y30 * 2^30 + Y29 * 2^29 + ... + Y1* 2^1 + Y0 *2^0
让单数位置的数值为了0,仅仅保留双数位
注意: -Y31 * 2^31 == -2*31 * 2^30, 余例仿此。
B' = (Y29+Y30-2*Y31) *2^30 + (Y27+Y28-2*Y29) *2^28 + ...
B' = [0, (Y29+Y30-2*Y31), 0, (Y27+Y28-2*Y29), ....0,(Y-1+Y0-2*Y2) ]
原来 32位乘法运算:要进行32次乘法和移位,最后展开变成64位,在64个位置要 32个数字累加(带进位),总之比较复杂,运算资源也很大;
现在,运算次数可以减少1半,只要 16 位乘法运算即可
----------------------------------------------------
说实话, 我看不出 这种 Booth乘法器, 和 Booth 权重算法 有什么关系吗?
文章评论(0条评论)
登录后参与讨论