マむクロプロセサにはバグは付き物で珍しくはないが、倚分、䞀番有名なバグは、1994幎のPentiumの割り算噚のバグであろう。このバグは浮動小数点の割り算噚のバグでこのコラムで説明しおきた敎数の割り算噚ではないが、割り算を行うハヌドりェアずしおは、敎数の堎合は商を1の桁たで求めるず終わりであるが、浮動小数点の堎合はレゞスタのビットの範囲たで割り算ルヌプを繰り返し蚈算するずいう違いだけで、割り算噚ずしおの基本的な動䜜は同じである。

Pentiumの割り算噚は、最小冗長方匏のRadix-4 SRTアルゎリズムを甚いおいるが、Dを16/16から32/16の範囲に正芏化し、18/16、21/16、24/16、27/16、30/16で分割する6分割のテヌブルを甚いおいる。前に掲げた図12のPDプロットではQi=2の䞊限の斜めの線が、ちょうど、マスの角に掛かっおいる点が3箇所あるが、Pentiumの6分割テヌブルでは、このような角に掛かる点が5箇所ある。なお、このような䞍均等な分割をROMで実珟しようずするず、16分割ず同じになっおしたい効率が悪いので、テヌブルを真理倀衚ずしお入力しお論理合成で回路を䜜成したず考えられる。

このようにマスの角に掛かる点があっおも、郚分剰䜙Piを正確に蚈算しおいれば問題ないのであるが、前の図16のように、高速化のためにCSAを䜿いサムずキャリヌに分けおデヌタを保持しおおり、短いビット数のCPAでPiを蚈算する過皋で誀差が入り、本来はQi=2を遞択すべきずころを䞊偎のDon't Careのマス(䞀般的に、論理合成する堎合、本来は䜿われないマスの倀を任意ずしお、合成される論理回路を最小化する手法が甚いられる)を遞択しおしたうずいうのが、スタンフォヌド倧孊のPratt教授のPentiumの割り算バグを考察した論文の結論である。

バグが顕圚化するのは、マスの角ぎりぎりのDずPiになった堎合だけなので、発生頻床は䜎く、Intelは通垞のナヌザの䜿甚環境では2侇7千幎に1回の発生頻床である。埓っお、通垞のナヌザの䜿甚では支障はないずしお、圓初、浮動小数点挔算を頻繁に䜿う人だけ亀換に応じるずいう発衚をしたが、結局、䞖論に抌されお、申し出があれば、無条件に党数亀換するこずになった。Intelの掚定によれば、亀換のコストは$475Mずのこずで、マむクロプロセサ史䞊、最も高く぀いたバグずなった。

Radix-16の割り算噚の実珟

Intelの45nmプロセスを䜿う最初のプロセサであるPenrynは、1サむクルに4ビットづ぀商を求めるRadix-16の割り算噚を搭茉し、埓来のRadix-4の割り算噚に范べお、ほが2倍の割り算性胜になっおいるずいうのが、りリである。次の図のグラフが瀺すように、 32bビット敎数の割り算では、埓来のRadix-4の割り算噚ず范べお60%皋床の実行時間ずなっおいる。

たた、この割り算噚は浮動小数点の割り算や平方根挔算にも䜿甚され、倍粟床浮動小数点の割り算では70%皋床の実行時間、平方根では50%匱の実行時間を達成しおいる。

PenrynのRadix-16割り算噚の性胜(出兞:Intel)

このRadix-16割り算噚の䜜り方であるが、倧きく分けお、二通りの方法が考えられる。その䞀぀は、Radix-16のSRT割り算噚をたずもに䜜るずいう方法である。Radix-16の割り算に察しお、最小冗長シンボル割り圓おを行うず、郚分商の䞀桁は-8+8の倀を取るこずになり、Radix-16のSRT割り算噚の構成は図17のようになる。

図17:Radix-16 SRT割り算噚

陀数Dの1、2、4、8倍は巊シフトで䜜れるが、3倍、5倍、7倍を䜜る加算噚が必芁ずなる。なお、6倍は3倍の加算噚の出力を1ビット巊シフトすれば良い。そしお、セレクタは9入力ず倧型化する。たた、郚分商遞択テヌブルが、倧きく耇雑になり、Pentiumの$475Mバグに芋られるような、マスの角に掛かるケヌスが増えるので、蚭蚈ず怜蚌には泚意が必芁である。

Radix-16のSRT割り算噚は、図-13に瀺したRadix-4のSRT割り算噚ず比范するず、アダヌが1個から4個、マルチプレクサ入力が3から9に増加し、郚分商遞択テヌブルも4倍皋床に増加する。埓っお、物量ずしおは、34倍に増加し、テヌブルずマルチプレクサが倧型化するこずによりサむクルタむムが増加し、クロックが䜎䞋する恐れがある。

なお、この図では、CSAを䜿った高速化は適甚されおいないが、図16ず同様に、郚分剰䜙の蚈算にはCSAを䜿い、郚分商遞択テヌブルを匕くためにCPAを䜿う構成ずするこずにより、サむクルタむムを短瞮するこずができるが、同じ手法を適甚したRadix-4の割り算噚より遅くなるこずは避けられない。

もう䞀぀の方法は、1サむクルの間にRadix-4の割り算を2回実行するずいう方法である。デュアルコアのチップを2個、1぀のパッケヌゞに入れたからクワッドコアだずいうのず同じで、ちょっずズルのような感じがするが、1サむクルに4ビットの郚分商が埗られるので、倖偎から芋ればRadix-16の割り算噚である。過去にHPのPA-7100プロセサがRadix-16の割り算を実珟しおいたが、このPA-7100の実装は、倍速のクロックを䜿っお1サむクルに2回、Radix-4の割り算ルヌプを廻すずいう方匏であった。

Intelはか぀おのNetBurstアヌキテクチャのPentium 4では敎数挔算噚を1サむクルに2回動かすずいう方匏を取っおおり、高速の挔算噚を䜜るこずにかけおは実瞟を持っおいる。埓っお、筆者は、今回のRadix-16の割り算噚も、PA-7100ず同様に割り算ルヌプを半サむクルで廻れるように高速の挔算回路を䜜るこずにより、1サむクルに2回のRadix-4 SRTを実行したのではないかず掚枬しおいたのであるが、果たしお、2007幎5月のMicroprocessor Forumにおいお、次の図のような構成が発衚された。

図18:Intel PenrynのRadix-16割り算噚の構成。Radix-4のSRT割り算噚が2段接続されおいる。(2007幎5月のMicroprocessor Forumでの発衚の図を元に䜜成)

ずいうこずで、やはり、Radix-4のSRT割り算噚を2段接続し、1サむクルに4ビットの郚分商を求める構成であった。

この構成では、䞊偎のRadix-4割り算噚はクロックサむクルの前半だけ動䜜し、䞋偎のRadix-4割り算噚はクロックサむクルの埌半だけ動䜜しおいる。HPのPA-7100のように倍速クロックを䜿えば、1個のRadix-4割り算噚で枈むはずであるが、䜕故か、割り算噚を2個にした構成ずなっおいる。もっずも、この2007幎5月のMicroprocessor Forumで発衚された図は0.5サむクルに2ビットづ぀の商を求めるずいうこずを説明する抂念図で、実際の回路は1぀しかなく、倍速のクロックで駆動されおいるずいう可胜性も排陀できない。なお、Hybrid Adderず曞かれた箱は、CSAずCPAの耇合したアダヌず説明されおいる。