除算が他の算術演算よりもはるかに複雑なのはなぜですか?


39

最近、欠けているチップ(ARM Cortex-A8)で整数除算が必要なケースに遭遇しました。なぜそうなのかを調査しようとすると、一般的に、ほとんどすべての整数(または固定小数点)アーキテクチャで、除算が加算、減算、または乗算よりもはるかに多くのサイクルを要することがわかりました。これはなぜですか?他のすべての2層AND-ORロジックでは表現できないのですか?

回答:


34

除算は、商からの結果をユークリッド測度を使用して剰余にシフトする必要がある反復アルゴリズムです。2を参照してください。一方、乗算は(固定)一連のビット操作のトリックに減らすことができます。


2
以前は、乗算と除算の両方が遅い操作でした。現在、乗算は少し速くなっています(ただし、加算/減算よりも少し遅い)が、除算は他のものよりも遅くなっています。ニュートン・ラプソンは、数字を交換するためにほとんどの人がまだ内部で使用していると思います。
JM

12
(オフトピック:「逆演算は通常難しい。単に積分と微分を比較するだけだ。」-あなたがやっていることが記号的か数値かによって異なります。微分は記号的に簡単ですが、数値的に難しいです。簡単。)
JM

1
さて、私は立方体が別のワームの缶であると言って警戒します。しかし、少なくとも1次元の場合、求積は微分よりも簡単です。
JM

1
いずれにせよ、逆関数は常にペアになります。なぜ一方を「操作」、もう一方を「逆」と呼ぶのでしょうか?
デビッドケッチャソン

2
反復も逆も難しくはありません。除算の困難さは、ユークリッドメジャーを使用して結果を商から剰余にシフトする必要があるという事実に由来します。除算アルゴリズムの定理を参照してください。

20

aterrelが示唆するように、現在のすべてのCPUは反復アプローチを使用しているように見えますが、非反復アプローチでいくつかの作業が行われています。可変精度浮動小数点除算と平方根は、ルックアップテーブルとテイラー級数展開を使用した、FPGAでの浮動小数点除算と平方根の非反復実装について説明します。

同じ手法を使用すると、これらの操作を1サイクル(レイテンシではなくスループット)にまで下げることができると思われますが、巨大なルックアップテーブルが必要になる可能性が高いため、それを実行するにはシリコン不動産の大きな領域が必要になります。

なぜそれが実現できないのでしょうか?

CPUの設計には、多くのトレードオフがあります。機能、複雑さ(トランジスタの数)、速度、消費電力はすべて相互に関連しており、設計中に下される決定はパフォーマンスに大きな影響を与える可能性があります。

最新のプロセッサは、おそらく、単一サイクルで浮動小数点除算を実行するのに十分なシリコン上のトランジスタを専用のメイン浮動小数点ユニットを持つことできますが、それらのトランジスタを効率的に使用する可能性は低いでしょう。

浮動小数点の乗算により、10年前に反復から非反復にこの移行が行われました。最近では、モバイルプロセッサであっても、シングルサイクルの乗算や積和さえ行われています。

トランジスタバジェットを効率的に使用する前に、除算のように乗算は反復法で実行されることがよくありました。当時、専用のDSPプロセッサは、ほとんどのシリコンを単一の高速積和(MAC)ユニット専用にする場合がありました。Core2duo CPUの浮動小数点乗算レイテンシは3です(値はパイプラインに入ってから3サイクル後に値が出ます)が、一度に3つの乗算を飛行できるため、SSE2ユニットのスループットはシングルサイクルスループットになります。 1つのサイクルで複数のFP乗算をポンプアウトします。

シリコンの広大な領域を単一サイクルの分割ユニット専用にする代わりに、最新のCPUには複数のユニットがあり、各ユニットは並行して操作を実行できますが、特定の状況に合わせて最適化されています。実際、SSEなどのSIMD命令、またはSandy Bridge以降のCPUのCPU 統合グラフィックスを考慮に入れると、CPU にそのような浮動小数点除算ユニットが多数存在する可能性があります。

汎用の浮動小数点除算が現代のCPUにとってより重要な場合、シングルサイクルにするのに十分なシリコン領域を割り当てることは理にかなっているかもしれませんが、ほとんどのチップメーカーは明らかに、それらのゲートを他のものに使用することにより、そのシリコンをより有効に使用できると決定しました。したがって、1つの操作は遅くなりますが、全体的な(一般的な使用シナリオの場合)CPUは高速になり、消費電力が少なくなります。


私の知る限り、浮動小数点の単一サイクルの分割レイテンシーを持つチップはありません。たとえば、Intel、AMD、およびVIA CPU向けのAgner Fogの命令表には、DIVPS(SSEパックド浮動小数点除算)が10〜14サイクルとしてリストされています。シングルサイクルの除算命令を備えたハードウェアは見つかりませんが、間違っていると証明されることはあります。私が知る限り、それは一般的ではありません。
ビル・バルト

@ビル-ありがとう、あなたは正しい。私は以前にDSPチップでシングルサイクル除算演算を見たことがあると確信しているので、シングルサイクルの乗算と同じように、デスクトップに到達したと仮定しましたが、現在は参照が見つかりません。私は答えを更新し、将来的にそれを可能にするかもしれない非反復法に関するいくつかの関連情報を追加しました。トランスピュータを使用していたときよりも、現在、サイクルごとに除算が効率的ではないと考えるのは驚くべきことです。
マークブース

1
DSPは、正確な範囲を制限することでそれを実現すると考えています。これは、平方根のルックアップ+補間に使用されるのと同じ戦略です。
マットネプリー

1
ただし、このような部門の遅延がどの程度になるかはわかりません。4 GHzで、Nサイクル以内にルックアップテーブルへのラウンドトリップを行うと、テーブルの潜在的なサイズが大幅に制限されます(たとえば、L1キャッシュはそれぞれ32Kで停滞しています)。3Dに移行すると、これを増やすのに役立ちます(ただし、冷却が難しい)。最新の4GHz / 5GHz CPUでどのようなレイテンシーに達する可能性があるか考えていますか?
マチューM.17年

1
divps / divpdとmulps / mulpdのレイテンシおよびスループットの数値については、浮動小数点除算と浮動小数点乗算を参照してください。Agner Fogの命令テーブルからデータを取得し、divとmulのスループットとレイテンシの大まかな範囲で、シングルvsダブル、異なるSIMDベクトル幅のサマリーにフォーマットしました。(Intelチップには通常、他のベクトルALUの幅の半分のSIMDディバイダーしかありません。)
Peter Cordes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.