なぜIntelのHaswellチップがFP乗算を加算の2倍高速にするのですか?


35

私はスタックオーバーフローに関するこの非常に興味深い質問を読んでいました。

整数の乗算は、最新のCPUでの加算と同じ速度で本当に行われますか?

コメントの1つは言った:

「Haswellでは、FP乗算スループットがFP加算の2倍であることは何の価値もありません。これは、ポート0と1の両方を乗算に使用できますが、加算に使用できるのはポート1だけだからです。 -multiplyは両方のポートで実行できるため追加します。」

加算と比較して2倍の同時乗算を許可するのはなぜですか?


3
@DKNguyenありがとう!しかし、乗算は加算よりもはるかに多くの電子機器を必要とします(実際、加算は乗算の最終ステップであるため、乗算に必要な回路には加算に必要なものもすべて含まれます)。
user1271772

5
FP乗算加算です。対数を参照してください。
ジャンカ

9
@Janka FP乗算では指数の加算が必要ですが、実際には仮数を乗算する必要があります。格納された仮数は対数ではありません。
エリオットアルダーソン

6
SkylakeのFWIWでは、「純粋な追加」スループットが2倍になったため、これはHaswell / Broadwell時代の好奇心であり、何らかの固有のものではありません。
ハロルド

4
@ user1271772はい、それらは同じポートです。ポート0と1で加算し、ポート0と1でも乗算します。Skylake以前は、ポート1のみが純粋な加算を処理できました。これは、追加のような操作、つまり実際の変換を行う変換の最小/最大/比較のµopにも拡張されます(多くの場合、シャッフルまたはロードµopもあります)
ハロルド

回答:


37

これは、本文ではない場合、おそらく質問のタイトルに答えます:

浮動小数点の加算では、2つの仮数を揃えてから(2つの指数の差に応じて)加算する必要があり、加算器の前に大きな可変シフトが必要になる可能性があります。次に、仮数加算の結果を再正規化する必要があり、浮動小数点の結果を適切にフォーマットするために、別の大きな可変量のシフトが必要になる可能性があります。したがって、2つの仮数バレルシフターには、ゲート遅延、ワイヤ遅延、またはコンパクトなキャリーセーブ加算ツリー乗算器フロントエンドの遅延を超える余分なサイクルが必要になる可能性があります。

OPに追加:2ミリメートルと2キロメートルの長さを追加しても、どちらの単位も4ではないことに注意してください。これは、追加する前に、いずれかの測定値を同じスケールまたは単位表現に変換する必要があるためです。その変換には、基本的に10の累乗による乗算が必要です。浮動小数点数は可変スケーリング整数の形式であるため、同じことが通常浮動小数点加算時に発生する必要があります(例えば、単位またはスケール係数、指数、各番号)。したがって、両方が同じ単位またはスケールを表すようにするために、生の仮数ビットを追加する前に、数値の1つを2の累乗でスケールする必要がある場合があります。このスケーリングは、基本的に2の累乗による単純な乗算形式です。したがって、浮動小数点加算には乗算が必要です。 (2のべき乗である可変ビットシフトまたはバレルシフターを使用すると、トランジスタサイズに比べて比較的長い配線が必要になり、ディープサブミクロンリソグラフィ回路では比較的遅くなる可能性があります)。2つの数値の大部分がキャンセルされる場合(一方が他方の負に近いため)、加算の結果を適切にフォーマットするために、加算の結果を再スケーリングする必要がある場合があります。したがって、数値形式(IEEE浮動小数点)の性質により、同等の単位またはスケールを表す仮の固定(有限)数の仮数ビットのバイナリ加算を囲む2つの乗算(プリおよびポスト)ステップがさらに必要な場合、加算が遅くなる可能性があります)。

追加#2:また、多くのベンチマークは、ベアアドよりもFMACS(積和)を重視しています。融合MACでは、加数のアライメント(シフト)はほとんどが乗算と並行して行われることが多く、仮数の加算は最終キャリー伝播の前にCSAツリーに含まれることがよくあります。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました。到達した結論は、質問および/または回答に編集して戻す必要があります。
デイブツイード

3
私はBSを呼んでいます。FP乗算演算での実際の乗算は、2バレルシフトよりも難しくなることはありません。
user253751

5
プロジェクトの制約とターゲットを考えると、「より難しく」、潜在的に高速で、最適化する価値があることは、4つの異なることです。
hotpaw2

3
@immibis:Haswellの前、Intel CPUには1 SIMD FP加算ユニット(3サイクルレイテンシ)と1 SIMD FPマルユニット(5サイクルレイテンシ)がありました。したがって、加算は乗算よりも高速です。(これが、SKLのようにFMAユニットで実行する代わりにfmaとmulに2x FMAユニットを追加するときに、Haswellが別個のFP追加ユニットを保持した理由です)。また、SIMD-intシフトは1cレイテンシで実行されますが、SIMD-int mulは5cレイテンシで実行されます(FMAユニットの仮数乗数のピギーバック)。そのため、シフトは乗算よりもはるかに安価です。addとmulは両方とも完全にパイプライン化されているため、出力を正規化するには別々のバレルシフターが必要です。
ピーターコーデス

22

FP乗算では、指数処理は単純な加算であることが判明しました(ログ領域での乗算が単なる加算であるというまったく同じ理由で)。対数に出会ったことを願っています。

ここで、対数形式で2つの数値を追加するのがどれほど難しいか考えてみてください...

浮動小数点は、リニアドメインとログドメインの間の灰色の領域に存在し、両方の側面があります。各FP番号は、仮数(線形)と(対数)指数で構成されます。仮数の各ビットの意味を判断するには、最初に指数(単なるスケールファクター)を調べる必要があります。

FP加算では、一般的な場合の指数処理には仮数を2回バレルシフトする必要があります。各バレルシフトは、事実上、わずかに単純化された乗算の特殊なケースです。

(最初のシフトは、両方の入力を同じ2のべき乗に揃えるため、仮数ビットの各オペランドのバイナリウェイトが同じになります。

10進数の例で十分です(ただし、明らかにバイナリが使用されます)...

3103+1101=3103+0.0001103

2番目は出力を再スケーリングします...

1100+0.999100=0.001100=1103

逆説的に言えば、FP加算には、2つの乗算のようなものが含まれます。その観点から、報告されたパフォーマンスはそれほど驚くことではありません。


8
「対数形式で2つの数値を追加するのがどれほど難しいかを考えてみてください」は、非常に啓発的でした。
ピーター-モニカを

1
幸いなことに、浮動小数点指数は単なる整数であるため、1.3 + 2.3 = 2.34のようなものを追加する必要はありません。これは仮数のシフトです。
ilkkachu

1
サイクルごとに2つの乗算を実行できるのは、乗算単位が加算単位よりも速いためではなく、2つの乗算単位があるためです(pjc50の答えの図を参照)。加算単位が乗算単位よりも遅いと考える理由を説明しても、この質問に答えることはできません。それに加えて、他の回答では、これまでの加算ユニットのレイテンシは低く、加算がより簡単な操作であることを示唆しています。
user253751

2
@immibis:あなたの観察は正しいです。しかし、質問は「なぜそうなのか?加算がmpyよりもはるかに単純/安いので、なぜ2つの加算ユニットがないのか?」という線に沿っています。答えの一部は、「FPでは、本当に簡単ではありません」です。残りは経済学に帰着します。実際の費用と予想されるワークロードの多くの研究を考えると、2番目の加算器はシリコン。その部分を拡張するために、他の回答を残します。
ブライアンドラモンド

一部のコンピューター科学者(たとえば、Kahan(IEEE754 FPのアーキテクト)やKnuth)は、「仮数」は線形(対数ではない)であるため、間違った言葉であると主張しています。好ましい現代用語は仮数です。 en.wikipedia.org/wiki/Significand#Use_of_%22mantissa%22。ただし、「仮数」は、音節の少ない、格好いい言葉です。
ピーターコーデス

16

TL:DR:Intelは、SSE / AVX FPの追加レイテンシがスループットよりも重要だと考えたため、Haswell / BroadwellのFMAユニットでは実行しないことを選択しました。


Haswell実行(SIMD)FPはFMA(Fused Multiply-Add)と同じ実行ユニットで乗算しますが、FPを集中的に使用するコードのほとんどは命令ごとに2つのFLOPを実行できるためです。FMAと同じ5サイクルレイテンシ、およびmulps以前のCPU(Sandybridge / IvyBridge)と同じ。 Haswellは2つのFMAユニットを必要としていましたが、以前のCPUの専用乗算ユニットと同じレイテンシーであるため、乗算を実行することのマイナス面もありません

しかし、それはまだ実行するために、以前のCPUから専用のSIMD FPアドユニットを保持addps/ addpd3サイクルのレイテンシで。 考えられる理由は、多くのFPを追加するコードがスループットではなく、レイテンシのボトルネックになる傾向があるということです。GCCの自動ベクトル化からよく得られるように、1つの(ベクトル)アキュムレータのみを持つ配列の単純な合計に対しては、これは確かに当てはまります。しかし、Intelがそれが彼らの推論であることを公に確認したかどうかはわかりません。

Broadwellマイクロアーキテクチャは同じである(しかしスピードアップmulps/mulpd FMAは、図5Cに宿泊しながら、3C待ち時間に)。おそらく、彼らはFMAユニットをショートカットし、のダミー加算を行う前に乗算結果を得ることができた0.0かもしれませんし、まったく異なるものかもしれませんが、それはあまりにも単純すぎます。 BDWは、ほとんどがHSWのダイシュリンクであり、ほとんどの変更はマイナーです。

Skylakeでは、すべてのFP(追加を含む)は、もちろんdiv / sqrtおよびビットごとのブール値(絶対値または否定など)を除き、4サイクルレイテンシおよび0.5cスループットでFMAユニットで実行されます。Intelは、低レイテンシFPの追加に余分なシリコンを使用する価値はない、または不均衡なaddpsスループットには問題があると判断したようです。また、レイテンシを標準化することで、ライトバックの競合を回避できます(同じサイクルで2つの結果が準備されている場合)。すなわち、スケジューリングおよび/または完了ポートを簡素化します。

そのため、Intelは次の主要なマイクロアーキテクチャリビジョン(Skylake)で変更しました。 FMAレイテンシーを1サイクル短縮すると、レイテンシーが制限されていた場合に、専用のSIMD FPアドユニットのメリットがはるかに小さくなりました。

Skylakeはまた、インテルがAVX512の準備をしている兆候を示しています。別のSIMD-FP加算器を512ビット幅に拡張すると、さらに多くのダイ面積が必要になります。Skylake-X(AVX512搭載)は、通常のSkylakeクライアントとほぼ同じコアを持っていると報告されていますが、大きなL2キャッシュと(一部のモデルの)追加の512ビットFMAユニットはポート5に「ボルトオン」されます。

SKXは、512ビットuopが飛行中の場合、ポート1 SIMD ALUをシャットダウンしますが、vaddps xmm/ymm/zmm任意の時点で実行する方法が必要です。これにより、専用のFP ADDユニットをポート1に配置することが問題となり、既存のコードのパフォーマンスとは異なる変更の動機となります。

楽しい事実:Skylake、KabyLake、Coffee Lake、Cascade Lakeのすべては、いくつかの新しいAVX512命令を追加することを除いて、Skylakeとマイクロアーキテクチャ的に同一です。それ以外の場合、IPCは変更されていません。ただし、新しいCPUには優れたiGPUがあります。Ice Lake(Sunny Coveのマイクロアーキテクチャー)は、実際に新しいマイクロアーキテクチャーを目にした数年ぶりの例です(広くリリースされていないCannon Lakeを除く)。


FMULユニットとFADDユニットの複雑さに基づく議論は興味深いが、この場合には関係ない。 FMAユニットには、FMA 1の一部としてFP加算を行うために必要なすべてのシフトハードウェアが含まれています。

注:x87 fmul命令を意味するのではなく、32ビットの単精度/ floatおよび64ビットのdouble精度(53ビットの仮数、別名仮数)をサポートするSSE / AVX SIMD /スカラーFP乗算ALUを意味します。例えばmulpsまたはのような指示mulsd。実際の80ビットx87 fmulは、ポート0のHaswellでまだ1クロックスループットです。

最近のCPUには、価値があるときに問題を投げるのに十分なトランジスタがあり、物理的な距離の伝播遅延の問題を引き起こさない場合に問題があります。特に、時々アクティブになる実行ユニットの場合。https://en.wikipedia.org/wiki/Dark_siliconおよび2011年のカンファレンスペーパー:Dark Silicon and the End of Multicore Scalingを参照してください。これにより、CPUが大量のFPUスループットと大量の整数スループットを持つことが可能になりますが、同時に両方を実行することはできません(これらの異なる実行ユニットは同じディスパッチポート上にあるため、互いに競合します)。mem帯域幅のボトルネックにならない、慎重に調整されたコードの多くでは、制限要因はバックエンド実行ユニットではなく、フロントエンド命令のスループットです。(ワイドコアは非常に高価です)。http://www.lighterra.com/papers/modernmicroprocessors/参照してください


ハスウェルの前に

HSW以前は、NehalemやSandybridgeなどのIntel CPUは、ポート0でSIMD FPを乗算し、ポート1でSIMD FPを追加していました。したがって、個別の実行ユニットがあり、スループットがバランスしていました。(https://stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle

Haswellは、Intel CPUにFMAサポートを導入しました(AMDがブルドーザーにFMA4を導入してから2年後、Intelが4オペランド非-破壊先FMA4)。面白い事実:AMD Piledriverは、FMA3を搭載した最初のx86 CPUであり、2013年6月のHaswellの約1年

これには、3つの入力を持つ単一のuopをサポートするために、内部のいくつかの大きなハッキングが必要でした。しかし、とにかく、Intelはオールインし、縮小し続けるトランジスタを利用して2つの256ビットSIMD FMAユニットを搭載し、FP数学のためのHaswell(およびその後継)の獣を作りました。

インテルが念頭に置いていたパフォーマンス目標は、BLAS密行列とベクトルドット積です。それらの両方は、主にFMAを使用することができますし、必要がないだけで追加します。

前に述べたように、FPをほとんどまたは単に追加する一部のワークロードは、スループットではなく(ほとんど)遅延の追加でボトルネックになります。


脚注1:そして、乗数がの1.0場合、FMAは文字通り加算に使用できますが、addps命令よりも遅延が長くなります。これは、FPがレイテンシよりもスループットを追加するL1dキャッシュでホットなアレイを合計するようなワークロードに潜在的に役立ちます。これは、複数のベクトルアキュムレータを使用してレイテンシを非表示にし、FP実行ユニットで10個のFMA操作を実行し続ける場合にのみ役立ちます(5cレイテンシ/ 0.5cスループット= 10オペレーションレイテンシ*帯域幅積)。 ベクトルドット積にFMAを使用する場合も、これを行う必要があります

David KanterのSandybridgeマイクロアーキテクチャの記事を参照してください。これには、NHM、SnB、およびAMD BulldozerファミリのどのポートにどのEUがあるのか​​を示すブロック図があります。(Agner Fogの命令表とasm最適化マイクロアーキテクチャガイド、およびhttps://uops.info/参照してください。これには、多くの世代のIntelマイクロアーキテクチャのほぼすべての命令のuop、ポート、レイテンシ/スループットの実験的テストもあります。)

また関連する:https : //stackoverflow.com/questions/8389648/how-do-i-achieve-the-theoretical-maximum-of-4-flops-per-cycle


1
場合は、あなたがこのために私の言葉を取るべきかどうかに疑問を抱いている:スタックオーバーフローの上に、私は、以下を含む金バッジを持って[cpu-architecture][performance][x86-64][assembly]、と[sse]手書きのアセンブリよりも高速にCollat​​z予想をテストするためのC ++コードに関する回答を書きました-なぜですか?多くの人が良いと思うこと。また、この OOOについては、実行パイプライン。
ピーターコーデス

「BDWはほとんどがHSWのダイシュリンクであり、ほとんどの変更はマイナーです。」おそらく経済的な理由で、最初の回で意図的にいくつかの最適化を元に戻したように聞こえます。
jpaugh

2
@jpaugh:en.wikipedia.org/wiki/Tick%E2%80%93tock_modelを参照-2006年頃のIntelの計画(10nmで障害が発生するまで)は、他の小さな変更を加えた新しいプロセスで縮小し、新しいアーキテクチャでした既にテストされたプロセスで。開発は何年もの間パイプラインで行われていることを忘れないでください。複数の将来の設計が飛行中です。Broadwellは、14nm製造プロセスを最大限に活用し、プロセスだけをデバッグする必要はなく、設計だけを考慮して、Skylakeの「トック」の前の「ダニ」になることを常に意図していました
Peter Cordes

リンクに感謝します。あなたは基本的に私の感情を反映しましたが、私が集まるよりもはるかに正確でした。
jpaugh

8

この部分を見ていきます:
「なぜ彼らが許可するのか
TL; DR-彼らはそれをそのように設計したからです。それは管理上の決定です。仮数とビットシフターの答えは確かにありますが、これらは管理上の決定事項になります。

なぜ彼らはそのように設計したのですか?答えは、特定の目標を達成するために仕様が作成されていることです。これらの目標には、パフォーマンスとコストが含まれます。パフォーマンスは運用ではなく、CrysisのFLOPSやFPSなどのベンチマークを対象としています。
これらのベンチマークには複数の機能があり、それらのいくつかは同時に処理できます。
デザイナーが、ウィジェットAの2つの機能を使用すると、ウィジェットBの2つの機能ではなく、はるかに高速になると考えている場合、ウィジェットAを使用します。

スーパースカラーおよびスーパーパイプライン(マルチコアの前)が商用チップで最初に一般的になったときを振り返ると、これらはパフォーマンスを向上させるために存在していました。Pentiumには2つのパイプがあり、ベクトル結合はありません。Haswellには、より多くのパイプ、ベクトルユニット、より深いパイプ、専用機能などがあります。なぜ2つすべてがないのですか?彼らがそのように設計したからです。


より適切なパフォーマンス目標は、BLAS密行列とベクトルドット積です。どちらも主にFMAを使用でき、追加する必要はありません。
ピーターコーデス

製品箱にBLASの密なmatmulとベクトルドット製品を見たことはありません。これらはコマーシャルでは見られません。これらは製品レビューでは見られません。(確かに、彼らは重要ですが、エンジニアが管理を次の、経営者がマーケティングを次の、マーケティング、販売を以下の販売は、通常の人によって購入されている。。
MikeP

1
Linpackのようなベンチマークを含むCPUレビューを見てきました。とにかく、あなたが言う(理論上の最大値)FLOPSは宣伝されますが、それはキャッシュが維持できる場合の基本的なパフォーマンスのプロキシです。SPECfpベンチマークがHSWまたはSKLの両方のFMAユニットを飽和状態に近づけるかどうかはわかりませんが、SPECベンチマークは非常に重要です。すべての売上が小売りの個別販売ではありません。アップグレードする時期を決定するスーパーコンピュータークラスターの購入者や企業のサーバーファームなど、洗練された購入者もいます。売上高のマージンも高いと思います。
ピーターコーデス

6

Intelのこの図は、次の場合に役立ちます。

ハスウェル実行ユニットの概要

彼らは各ユニットにFMA(融合乗算加算)と乗算加算器および単一加算器を与えているようです。それらは、ハードウェアを共有する場合としない場合があります。

内部設計の理論的根拠がなければ、なぜ答えるのがはるかに難しいのですが、紫色のボックス内のテキストは、「倍のピークFLOP」を示すヒントを与えてくれます。プロセッサは、実際のユースケースから派生したベンチマークのセットをターゲットにします。FMAは行列乗算の基本単位であるため、これらで非常に人気があります。素の追加はあまり人気がありません。

指摘されているように、乗算パラメーターが1であるFMA命令で両方のポートを使用して加算を行うことができます。(A x 1)+ Bを計算します。これは、裸の加算よりも若干遅くなります。


FP MultiplyはFMAユニットで実行されます。FPアドは、ポート1の専用SIMD FPアドユニットでのみ低レイテンシで実行されます。そのポートのFMAユニットといくつかのトランジスタを共有することは可能ですが、私が読んだことから、これを提供するにはかなりの余分な領域が必要だという印象を受けました。
ピーターコーデス

より詳細な回答を投稿しまし
ピーターコーデス

4

時間のかかるステップを見てみましょう。

追加:指数を揃えます(大規模なシフト操作の場合があります)。1つの53ビット加算器。正規化(最大53ビット)。

乗算:1つの大規模な加算器ネットワークにより、53 x 53の1ビット積を2つの106ビット数の合計に減らします。1つの106ビット加算器。正規化。ビット積を2つの数値に減らすことは、最終加算器と同じくらい速くできると思います。

可変時間を乗算できる場合、正規化はほとんどの場合1ビットだけシフトするという利点があり、他のケースを非常に迅速に検出できます(非正規化入力、または指数の合計が小さすぎる)。

さらに、正規化手順が必要になることは非常に一般的です(サイズが等しくない数値を加算し、近い数値を減算します)。したがって、乗算では高速パスを使用し、低速パスで大ヒットする余裕があります。追加することはできません。

PS。コメントを読む:非正規化された数値を追加してもペナルティは発生しないというのは理にかなっています。つまり、指数を揃えるためにシフトされたビットの多くがゼロであることを意味します。また、非正規化された結果とは、指数が小さくなりすぎる場合に先行ゼロを削除するためにシフトを停止することを意味します。


実際、Intel CPUはマイクロコードアシストを介して非正規乗算(入力または出力)を処理します。つまり、通常のFPUは、この場合に余分なパイプラインステージを持たずに例外を通知します。 Agner Fogによると:Sandybridge 私のテストでは、アンダーフローと非正規数のケースは、加算ではなく、通常の浮動小数点数と同じくらい速く処理されました。 これが-ffast-math、FPアシストを使用する代わりにFTZ / DAZ(非正規化をゼロに設定)でコンパイルしてコンパイルする理由です。
ピーターコーデス

Agnerのマイクロアーチガイドでは、通常の入力での操作が非正規の出力を生成する場合、常にペナルティがあると述べています。ただし、法線+非法線を追加してもペナルティはありません。そのため、要約レビューが不正確であったり、uarchガイドが不正確であったりします。アグナーは、騎士の上陸(Xeon Phi)には、mul / addの非正規数に対するペナルティはなく、除算のみがあると言います。ただし、KNLのレイテンシは、主流のHaswell(5c)/ SKL(4c)よりもadd / mul / FMA(6c)が高くなっています。興味深いことに、AMD Ryzenのペナルティは数サイクルしかないのに対して、Bulldozerファミリーには大きなペナルティがあります。
ピーターコーデス

厳密には、GPUはレイテンシではなくスループットにすべて依存しているため、通常、サブノーマルであってもすべてのケースでレイテンシは固定されています。マイクロコードへのトラップは、おそらくそのような必要最低限​​のパイプラインのオプションではないでしょう。
ピーターコーデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.