「計算機アーキテクチャ1」講義資料1

「計算機アーキテクチャ1」講義資料1
-- 符号付き乗算、乗数のリコード、非回復型除算 -高木 直史
1.符号付き乗算
2の補数表現の数同士を直接掛け合わせることもできる。被乗数を X=[xn-1xn-2…x1x0]、乗数を Y=[yn-1yn-2
n−2
…y1y0](いずれも2の補数表現)とする。Y = −2n−1 yn−1 + ∑𝑖=0 2i yi であるから、X × Y = −2n−1 yn−1X +
n−2
∑𝑖=0 2i yi X となる。Y の下位から順に部分積 yi X を生成して桁をずらして累算して行き、最後の部分積は
-yn-1 X とすればよい。-X は X の2の補数を取ればよい。
(各桁を反転し、最下位に1を加える。最下位に
加える1は、加算の際の最下位への桁上げ入力とすればよい。)X が負である場合、累算の途中結果が負とな
る。負数は2の補数で表せばよいが、最上位桁の位置が異なる二数を加算する場合、符号拡張が必要である。
2.乗数のリコードによる部分積の削減
逐次型乗算において、生成される(非0の)部分積の個数を少なくできれば、計算を高速化できる。そのよ
うな手法として、Booth の方法が知られている。Booth の方法では、2進数 011…11 が 100… 0T (T は-1
.
を表す。)と表されることを利用して、乗数をリコード(recode)する。リコードされた乗数の桁 yj が-1 のと
き、部分積は –X 2j となり、累算では X 2j を減ずることになる。乗数の中に1がm個連続する部分がある場
合、m回の加算を1回の減算と1回の加算に置き換えることができる。シフトのみで加減算を行わない場合に
1ステップの時間を短くできるような演算器では、高速化に有効である。表1に Booth の方法における乗数
のリコード規則を示す。たとえば、0111101011111001 → 1000T1T10000T01T と変換される。Booth の方
法を用いると、累算の途中結果が負数になる場合がある。負数は2の補数で表せばよい。
(符号拡張が必要)
Booth の方法では、長さ1の1の列(孤立した1)を 1T に変換するため、たとえば、010101 は 1T1T1T と
変換され、乗数のリコードにより、累算における加減算の回数が増えてしまう場合がある。加減算の回数を最
少にするには、乗数を非零桁の数が最少の2進 SD 表現(各桁が{-1,0,1}の2進表現)にリコードすればよい。
こ の リ コ ー ド は 、 表 2に 示 す 規 則 に 従 い 、最下 位 か ら 順 に 変 換 するこ と に よ り 行 え る 。たと え ば 、
0111101011111001 → 10000T0T0000T001 と変換される。この変換では、ある種の桁上げ(表中の cj)が伝
搬する。
表2:非零桁の数が最少の2進 SD 表現へのリコード規則
.
状況
yj+1
yj
cj
cj+1
yj
表1:Booth の方法における乗数のリコード規則
.
状況
yj
yj-1
yj
0
0
0
0
0
0 の列の中
0
0
1
0
1
0 の列の開始
0
0
0
0 の列の中
0
1
0
0
1
孤立した 1
0
1
1
1 の列の終了
0
1
1
1
0
1 の列の終了
1
0
-1
1 の列の開始
1
0
0
0
0
0 の列の終了
1
1
0
1 の列の中
1
0
1
1
-1
孤立した 0
1
1
0
1
-1
1 の列の開始
1
1
1
1
0
1 の列の中
1
3.非回復型除算法(引き放し法)
nビット符号なし2進整数の除算について考える。被除数をX、除数をY、商をZ、剰余をRとする。X、
Y、Z、Rは、すべてnビット符号なし2進整数である。教科書で示されている除算法は、基数2の減算シフ
ト型除算法である。基数2の減算シフト型除算法では、商を上位から1ビットずつ求めていく。i 回の繰り返
し計算後の商の中間結果を Qn-i=[qn-1qn-2…qn-i0…0]、剰余の中間結果を Rn-i とする。
(計算法により、qj ∊ {0,1}
とは限らないので、ZではなくQで表している。
)Rn=X、Qn=0 とし、j=n-1 から 0 について、
Rj := Rj+1-qj 2j Y
Q j := Qj+1+qj 2j
という漸化式に従って計算を行う。
教科書の除算法は、回復型除算法(引き戻し法)と呼ばれる。回復型除算法では qj ∊ {0,1}であり、まず、
Rj’=Rj+1-2j Y を計算し、Rj’が非負なら qj=1、Rj = Rj’とし、Rj’が負なら qj=0、Rj = Rj’+2j Y とする。したが
って、Rj は必ず非負になり、0≦Rj<2j Y が成り立つ。もちろん、2進表現の商Zのj桁目 zj は qj である。
非回復型除算法では、Rj+1-qj 2j Y が負になっても、これをそのまま Rj とする。回復型除算法に比べ、加
減算の回数が少なくなる。
上記の漸化式で、qj ∊ {-1,1}とし、R j+1 が非負なら qj を1、負なら qj を-1 とする。常に-2j Y <Rj<2j Y が成
り立つ。商を通常の2進表現に変換する必要があるが、2進表現の商Zのj桁目 zj は qj-1 が1なら1、-1 な
ら0となり、変換には特に計算の必要はない。ただし、R0 が非負なら z0 を1、剰余Rを R0 とし、負なら z0
を 0、Rを R0+Y とする。商の変換を漸化式に組み込むことも可能である。Rn-1=X-2n-1 Y とし、j=n-2 か
ら 0 について、R j+1 が非負なら zj+1 を1、負なら zj+1 を-1 とし、Rj := Rj+1-zj+1 2j Y とすればよい。
以下に基数2の非回復型除算の例を示す。
(Rj は2の補数表現で表している。
)
(1) 1011÷0101
(2) 1001÷0011
0000 1011
-010 1
0000 1001
q3=1
- 001 1
1110 0011
+ 01 01
1111 0001
q2=-1 (z3=0)
+ 00 11
1111 0111
+ 0 101
1111 0100
q2=-1 (z3=0)
1111 1101
q1=-1 (z2=0)
+ 0 011
0000 0001
- 0101
q3=1
q1=-1 (z2=0)
0000 0011
q0=1 (z1=1)
- 0011
z0=0
0000 0000
商:0010 余り:0001
q0=1 (z1=1)
z0=1
商:0011 余り:0000
2