ハードウェア除算が乗算よりもはるかに長くかかるのはなぜですか?


37

マイクロコントローラでの乗算よりもハードウェアの除算に時間がかかるのはなぜですか?たとえば、dsPICでは、除算には19サイクルかかりますが、乗算には1クロックサイクルしかかかりません。

私には、いくつかのチュートリアルを経て事業化アルゴリズム乗算アルゴリズムウィキペディアに。これが私の推論です。

除算アルゴリズムは、ウィキペディアで復元する低速除法のように、再帰的なアルゴリズムです。これは、stepの(中間)結果がstep kへの入力として使用されるk+1ことを意味します。つまり、これらのアルゴリズムは並列化できません。したがって、n除算を完了するには少なくともサイクルが必要nですが、被除数のビット数は異なります。16ビットの配当の場合、これは少なくとも16サイクルに相当します。

乗算アルゴリズムは再帰的である必要はありません。つまり、並列化することが可能です。ただし、乗算アルゴリズムにはさまざまな種類があり、マイクロコントローラーで使用できるアルゴリズムはわかりません。ハードウェア/マイクロコントローラーで乗算はどのように機能しますか?

Dadda乗算器アルゴリズムを見つけました。これは、完了までに1クロックサイクルしかかからないはずです。ただし、ここで得られないのは、ダダのアルゴリズムが3つのステップで進行するのに対し、ステップ1の結果はステップ2などで使用されるということです。これによると、完了するには少なくとも3クロックサイクルかかります。


2
アルゴリズムは実際にはクロックサイクルの数を定義していません。特定のCPUには、内部実装に関係なく、1サイクルまたは20サイクルで動作するハードウェア乗算器/除算器がある場合があります。
ユージーンSh。

1
OP、あなたが話している19対1サイクルに関する詳細情報を提供するリンクを提供できますか?DSPに固有の何か。
ウラジミールクラベロ

1
答えてくれてありがとう。ここに私のマイクロコントローラのデータシートには、次のとおりです。ww1.microchip.com/downloads/en/DeviceDoc/70005127c.pdf。命令セットの概要(292ページ以降)を参照してください。すべてのDIV命令には18サイクルかかりますが、すべてのMUL命令には1サイクルしかかかりません。しかし、このMCUだけでは一般的ではありません。他の多くのMCUでこれを見てきました。
マルコグリン

2
@Curd、まあ、彼らはほぼ同じですよね。私のためです。あなたが想像するほどそれを例証しているとは思いません。
トニーM

1
もう1つの要因は、経済性と使用パターンです。ほとんどの使用法は、除算よりもはるかに頻繁に乗算を呼び出します。シリコンの広い領域を、比較的頻繁に使用されないより高速なハードウェア除算機能専用にすることは、経済的に貧弱です。より小さくて安価なチップを作るか、より生産的な方法で追加のロジックを使用する方が良いでしょう。ところで、ミニコンピューターで始めたとき、除算は必ずしも命令ではありませんでした。一部のマシンでは、平方根のようなソフトウェアライブラリ呼び出しでした。
nigel222

回答:


34

分周器は、典型的なハードウェアにはあまりエレガントにマッピングされません。ラティスICE40 FPGAを例として取り上げます。

2つのケースを比較してみましょう:この8x8ビットから16ビットの乗算器:

module multiply (clk, a, b, result);
   input clk;
   input [7:0]a;
   input [7:0]b;
   output [15:0]result;
   always @(posedge clk)
     result = a * b;
endmodule // multiply

そして、8ビットと8ビットのオペランドを8ビットの結果に減らすこの除算器:

module divide(clk, a, b, result);
   input clk;
   input [7:0] a;
   input [7:0] b;
   output [7:0] result;
   always @(posedge clk)
     result = a / b;
endmodule // divide

(はい、私は知っています、時計は何もしませ

乗算器をICE40 FPGA にマッピングする際に生成される回路図の概要はこちら分周器は こちらにあります

Yosysの合成統計は次のとおりです。

かける

  • ワイヤーの数:155
  • ワイヤービット数:214
  • 公共配線の数:4
  • パブリックワイヤビットの数:33
  • メモリー数:0
  • メモリビット数:0
  • プロセス数:0
  • セルの数:191
    • SB_CARRY 10
    • SB_DFF 16
    • SB_LUT4 165

割る

  • ワイヤーの数:145
  • ワイヤービット数:320
  • 公共配線の数:4
  • パブリックワイヤビットの数:25
  • メモリー数:0
  • メモリビット数:0
  • プロセス数:0
  • セルの数:219
    • SB_CARRY 85
    • SB_DFF 8
    • SB_LUT4 126

全幅乗算器と最大除算器の生成されたベリログのサイズがそれほど極端ではないことに注意してください。ただし、以下の図を見ると、乗数の深さが15であるのに気づくでしょう。一方、仕切りは50程度に見えます。クリティカルパス(つまり、操作中に発生する可能性がある最長パス)が速度を定義します。


とにかく、視覚的な印象を得るためにこれを読むことはできません。複雑さの違いを見つけることは可能だと思います。これらは単一サイクルの乗算器/除算器です!

かける

ICE40での乗算(警告:〜100 Mピクセルの画像)

乗数のスケーリングされた画像

割る

ICE40で分割)(警告:〜100 Mpixel画像)

仕切りの拡大画像


4
いいえ、非反復的に実装できます。しかし、有効な結果がロジックを「リップル」するまで、かなり時間がかかります。上記の実装は非反復的です。
マーカスミュラー

9
仕切り壁のポスターが欲しい。
イアンハウソン

5
乗算要点にPDFが追加されました。3378×3177 mmなので、寝室の天井に置く前に、他の重要な人と話し合ってください。
マーカスミュラー

2
あなたの100メガピクセルの画像は印象的ですが、あなたがしようとしている点ではあまりにも過剰であり、携帯電話やタブレットなどのメモリが限られているデバイスでこのページを表示しようとする人にとって大きな問題を引き起こします。画像をインラインで表示する場合は、低解像度のプレビューを作成する方法を見つけてください。
デイブツイード

4
これらのgraphvizチャートはオフフックですよ!
スペンサーウィリアムズ

8

低速除算は本質的に反復的であるため、時間がかかる傾向があります。ルックアップテーブルを使用して、単純なアルゴリズムよりもやや速い低速除算アルゴリズムがあります。SRTアルゴリズムは、サイクルごとに2ビットを生成します。このようなテーブルのエラーは、悪名高いPentium FDIVバグの原因でした(約1994年)。次に、いわゆる高速除算アルゴリズムがあります。

もちろん、原則として、単純に巨大なルックアップテーブルを使用して2つの数値の積または商を計算し、1サイクルで結果を得ることができますが、数値あたりのビット数が増えると、すぐに実用的ではなくなる傾向があります。


しかし、肝心なのは、乗算アルゴリズムとは異なり、除算アルゴリズムを並列化することはできないということです。それが、それらが非常に遅い理由です。
マルコグリン

2
@MarkoGulin "cannot"は非常に強力な主張です。確かに簡単ではありません。
スペロペファニー

2
「除算アルゴリズムを並列化できない」から「除算を並列化することがわかった方法は、除算を実装するハードウェアにより並列化された乗算よりも負担が大きい」まで弱めると思います。Spheroは、O(2 ^ n)ゲートを使用してnビット数を乗算するシングルサイクル除算の方法の例を示していますが、それは実際的ではありません。
コートアンモン

1
長い除算は、おおよその逆数を計算することで任意の程度に並列性を活用でき、除数で乗算すると、1000 ... xxxxの形式の結果が得られます.N個の先行ゼロを持つこのような形式で除数を使用する場合、それは簡単です各ステップで結果のNビットを計算します。
supercat

8

クロックサイクルごとに複数のロジックレイヤーを使用できますが、制限があります。ロジックのレイヤーをどれだけ複雑にすることができるかは、クロック速度と半導体プロセスによって異なります。

しかし、多くの異なる乗算アルゴリズムがあり、マイクロコントローラーがどの乗算アルゴリズムを使用するのかわからない

コンピュータのほとんどの乗算では、バイナリの長い乗算のバリアントが使用されます。バイナリの長い乗算には

  • 1つのオペランドをさまざまな異なる量でシフト
  • 第2オペランドに基づいてシフトされた数値をマスクする
  • マスキングの結果を一緒に追加します。

そこで、これをハードウェアに実装する方法を見てみましょう。

  • シフトは、私たちが物事をどのように結び付けるかという問題にすぎないため、無料で提供されます。
  • マスキングにはANDゲートが必要です。これはロジックの1つのレイヤーを意味するため、時間の観点から見ると安価です。
  • キャリーチェーンが必要なため、追加は比較的高価です。幸いなことに、使用できるトリックがあります。2つの数字を追加して1つを生成するのではなく、ほとんどの加算段階で3つの数字を追加して2つを生成できます。

したがって、16ビットの結果を持つ8x8乗算器に必要なロジックステージの数を概算します。簡単にするために、中間結果のすべてがすべての位置にビットを持っているわけではないという事実については、最適化を試行しないと仮定します。

全加算器が2つの「ゲートステージ」で実装されていると仮定しましょう。

  • 8中間結果を生成するためのマスキングの場合は1。
  • 2つの3つの数字のグループを追加して、8つの中間結果を6に減らす
  • 2つの3つの数字のグループを追加して、6つの中間結果を4に減らす
  • 2。3つの数値のグループを追加して、4つの中間結果を3に減らします。
  • 2。3つの数値のグループを追加して、3つの中間結果を2に減らします。
  • 最後の2つの結果を合計するには32。

合計で約46のロジックステージ。そのほとんどは、最後の2つの中間結果の合計に費やされます。

これは、最終ステップにキャリールックアヘッド加算器を使用することにより、すべての中間結果にすべてのビットが存在するわけではないという事実(基本的にはダダ乗算器が行うこと)を活用することで、さらに改善できます。7個の数字を追加して3個ではなく3個を作成し、2個を作成します(より多くのゲートとより広いゲートの価格でステージ数を減らします)。

ただし、これはすべて細かい点ですが、重要な点は、2つのnビット数を乗算して2nビットの結果を生成するために必要なステージ数が、nにほぼ比例することです。


一方、除算アルゴリズムを見ると、どこでも反復プロセスがあることがわかります。

  1. 1回の反復で行われることは、前の反復の結果に大きく依存します。
  2. 反復の実装に必要な論理ステージの数は、nにほぼ比例します(減算と比較の複雑さは加算と非常に似ています)
  3. 反復回数もnにほぼ比例します。

したがって、除算を実装するために必要な論理ステージの数は、nの2乗にほぼ比例します。


ご回答ありがとうございます。Daddaのアルゴリズムは、このアルゴリズムをハードウェアに実装するのに必要な数のゲートになると、非常に効率的であることをWikiで読みました。それにもかかわらず、ほとんどのハードウェアは「バイナリの長い乗算」を使用しますか?
マルコグリン

1
私は、ダダのアルゴリズムがバイナリの長い乗算の最適化されたバージョンであるように見えます。
ピーターグリーン

1 / xの除算を行うために8サイクル燃焼します。次に、16サイクルの固定コストで8サイクルの乗算に対してそれを使用します。
bデグナン

これは、乗算が加算よりもそれほど悪くないことを示しています。
ハーゲンフォンアイゼン

1
反復には、O(NlgN)ハードウェアを使用してO(lgN)ステージで、またはO(N)ハードウェアを使用してO(sqrt(N))ステージで実行できる減算が必要です。ただし、本質的な点は、乗算にはO(lgN)ステージが必要であり、除算にはO(NlgN)ステージが必要なことです。O(N * N)ではなく、ステップごとにより多くの作業を行えるように、おおよその逆数を取ることから始めない限り、O(N)の係数による乗算より大きい。
スーパーキャット

4

除算アルゴリズム(実際には任意のアルゴリズム)は、1クロックサイクルで作成できます。トランジスタの追加料金と許容クロックレートの引き下げを希望する場合。

既存のマルチサイクル除算アルゴリズムの1クロックサイクルを実装するゲートのセットがあるとします。アルゴリズムを単一サイクルにするには、ハードウェアの複数のステージ(マルチサイクルアルゴリズムの1つのステージで使用されるものと同様)を使用し、1つのステージの出力を次のステージに送ります。

もちろん、そのようにしない理由は、多くのトランジスタを使用するからです。たとえば、16ビット分割の場合、ほぼ16倍以上のトランジスタを使用できます。また、ゲートの段数を増やすと、最大許容クロック周波数が低下します(伝搬遅延の段数が増えるため)。


4

実用的な除算アルゴリズムはすべて、商に収束する数値スイートに基づいています。

  • 2 ^ Nを商に追加または削除し、それに対応して2 ^ N *除数を部分剰余にゼロに収束するまで追加または削除することにより機能する非復元またはSRTとして、加算法があります。

  • Newton-RaphsonやGoldshmidthのような乗法があります。これは、除算が乗法の逆数として計算されるルート発見法です。

加算法は、サイクルごとに1ビットまたは数ビットを提供します。乗法は、各サイクルのビット数を2倍にしますが、いくつかの初期近似が必要です。多くの場合、定数テーブルで取得されます。

実際の速度はビット数、機能に使用されるハードウェアの量(および高速乗算器は非常に大きい)に依存するため、「低速」および「高速」の名称は誤解を招く可能性があります。

除算は乗算よりも遅くなります。直接的な並列計算方法がないためです。反復があるか、ハードウェアをコピーして反復をカスケード(またはパイプライン)ブロックとして実装します。


0

ハードウェアの除算がマイクロコントローラーでの乗算よりもずっと長いのはなぜですか?

これは電子機器の質問ではありません。せいぜい、それはコンピューターの質問であり、Stack Overflowの方が適切です。

たとえば、こちらをご覧ください:乗算は浮動小数点除算より高速ですか?

現実には、それは現実の質問です。なぜ除算は乗算よりもずっと長いのですか?

どちらを紙で計算しますか?

51 * 82

または

4182 / 51

除算は乗算よりも時間がかかります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.