ここでは、最近の多数のプロセッサマイクロアーキテクチャの理論上の最大FLOPカウント(コアあたり)と、それらを実現する方法について説明します。
一般に、これを計算するには、たとえばhttps://agner.org/optimize/またはその他のマイクロベンチマーク結果でFMA命令のスループットを調べ、を乗算し
(FMAs per clock) * (vector elements / instruction) * 2 (FLOPs / FMA)
ます。
実際のコードでこれを実現するには、非常に注意深い調整(ループ展開など)が必要であり、キャッシュミスがほぼゼロであり、他のボトルネックがないことに注意してください。最近のCPUはFMAスループットが非常に高いため、結果を保存したり、入力をフィードしたりするための他の命令の余地はあまりありません。たとえば、クロックあたり2つのSIMD負荷も、ほとんどのx86 CPUの制限であるため、ドット積は、1つのFMAあたり2つの負荷でボトルネックになります。ただし、注意深く調整された密行列の乗算は、これらの数値の達成に近づく可能性があります。
ワークロードに、FMAに契約できないADD / SUBまたはMULが含まれている場合、理論上の最大数はワークロードの適切な目標ではありません。Haswell / Broadwellには、クロックごとに2つのSIMD FP乗算(FMAユニット上)がありますが、クロックごとに1つだけSIMD FP加算(レイテンシが低い別のベクトルFP加算ユニット上)があります。Skylakeは、個別のSIMD FP加算器を削除し、add / mul / fmaを、任意のベクトル幅に対して4cのレイテンシー、2クロックあたり2のスループットで同じように実行しました。
インテル
最近のマイクロアーキテクチャのCeleron/Pentiumバージョンは、AVXまたはFMA命令をサポートしておらず、SSE4.2のみをサポートしていることに注意してください。
Intel Core 2およびNehalem(SSE / SSE2):
- 4 DP FLOP /サイクル:2ワイドSSE2加算+2ワイドSSE2乗算
- 8 SPフロップ/サイクル:4ワイドSSE加算+4ワイドSSE乗算
Intel Sandy Bridge / Ivy Bridge(AVX1):
- 8 DP FLOP /サイクル:4ワイドAVX加算+4ワイドAVX乗算
- 16 SPフロップ/サイクル:8ワイドAVX加算+8ワイドAVX乗算
Intel Haswell / Broadwell / Skylake / Kaby Lake / Coffee / ...(AVX + FMA3):
- 16 DP FLOP /サイクル:2つの4幅FMA(融合乗算-加算)命令
- 32 SPフロップ/サイクル:2つの8幅FMA(融合乗算-加算)命令
- (256ビットのベクトル命令を使用すると、一部のCPUで最大ターボクロック速度が低下する可能性があります。)
Intel Skylake-X / Skylake-EP / Cascade Lake / etc(AVX512F)、1 FMAユニット:Xeonブロンズ/シルバー
- 16 DP FLOP /サイクル:1つの8幅FMA(融合乗算加算)命令
- 32 SPフロップ/サイクル:1つの16幅FMA(融合乗算加算)命令
- より狭い256ビット命令の場合と同じ計算スループットですが、より広いロード/ストア、ビット単位の操作のようにFMAユニットで実行されないいくつかのベクトル操作、およびより広いシャッフルのためにAVX512を使用して高速化を行うことができます。
- (512ビットのベクトル命令を飛行中に使用すると、ポート1のベクトルALUがシャットダウンします。また、最大ターボクロック速度が低下するため、パフォーマンス計算では「サイクル」は一定ではありません。)
Intel Skylake-X / Skylake-EP / Cascade Lake / etc(AVX512F)、2つのFMAユニット:Xeon Gold / Platinum、およびi7 / i9ハイエンドデスクトップ(HEDT)チップ。
- 32 DPフロップ/サイクル:2つの8ワイドFMA(融合乗算-加算)命令
- 64 SPフロップ/サイクル:2つの16幅FMA(融合乗算-加算)命令
- (512ビットのベクトル命令を飛行中に持つと、ポート1のベクトルALUがシャットダウンします。また、最大ターボクロック速度が低下します。)
将来:Intel Cooper Lake(Cascade Lakeの後継)は、ニューラルネットワークワークロード用のfloat16形式であるBrain Floatを導入し、実際のSIMD計算をサポートする予定です。これは、ロード/ストアのみをサポートする現在のF16C拡張機能とは異なります。 float32への変換。これにより、同じハードウェアでの単精度と比較して、FLOP/サイクルスループットが2倍になるはずです。
現在のIntelチップは、iGPUの標準float16で直接実際に計算するだけです。
AMD
AMD K10:
- 4 DP FLOP /サイクル:2ワイドSSE2加算+2ワイドSSE2乗算
- 8 SPフロップ/サイクル:4ワイドSSE加算+4ワイドSSE乗算
AMD Bulldozer / Piledriver / Steamroller / Excavator、モジュールごと(2コア):
- 8 DPフロップ/サイクル:4ワイドFMA
- 16 SPフロップ/サイクル:8ワイドFMA
AMD Ryzen
- 8 DPフロップ/サイクル:4ワイドFMA
- 16 SPフロップ/サイクル:8ワイドFMA
x86低電力
Intel Atom(Bonnell / 45nm、Saltwell / 32nm、Silvermont / 22nm):
- 1.5 DP FLOP /サイクル:スカラーSSE2加算+1サイクルおきのスカラーSSE2乗算
- 6 SPフロップ/サイクル:4ワイドSSE加算+1サイクルおきに4ワイドSSE乗算
AMDボブキャット:
- 1.5 DP FLOP /サイクル:スカラーSSE2加算+1サイクルおきのスカラーSSE2乗算
- 4 SPフロップ/サイクル:1サイクルおきに4ワイドSSE加算+1サイクルおきに4ワイドSSE乗算
AMD Jaguar:
- 3 DP FLOP /サイクル:1サイクルおきに4ワイドAVX加算+4サイクルで4ワイドAVX乗算
- 8 SPフロップ/サイクル:1サイクルおきに8ワイドAVX加算+1サイクルおきに8ワイドAVX乗算
腕
ARM Cortex-A9:
- 1.5 DP FLOP /サイクル:1サイクルおきにスカラー加算+スカラー乗算
- 4 SPフロップ/サイクル:1サイクルおきに4ワイドNEON加算+1サイクルおきに4ワイドNEON乗算
ARM Cortex-A15:
- 2 DP FLOP /サイクル:スカラーFMAまたはスカラー乗算-加算
- 8 SPフロップ/サイクル:4ワイドNEONv2FMAまたは4ワイドNEON乗算-加算
Qualcomm Krait:
- 2 DP FLOP /サイクル:スカラーFMAまたはスカラー乗算-加算
- 8 SPフロップ/サイクル:4ワイドNEONv2FMAまたは4ワイドNEON乗算-加算
IBM POWER
IBM PowerPC A2(Blue Gene / Q)、コアごと:
- 8 DPフロップ/サイクル:サイクルごとに4ワイドQPX FMA
- SP要素はDPに拡張され、同じユニットで処理されます
IBM PowerPC A2(Blue Gene / Q)、スレッドごと:
- 4 DPフロップ/サイクル:1サイクルおきに4ワイドQPX FMA
- SP要素はDPに拡張され、同じユニットで処理されます
Intel MIC / Xeon Phi
Intel Xeon Phi(Knights Corner)、コアごと:
- 16 DPフロップ/サイクル:サイクルごとに8ワイドFMA
- 32 SPフロップ/サイクル:サイクルごとに16ワイドFMA
Intel Xeon Phi(Knights Corner)、スレッドごと:
- 8 DPフロップ/サイクル:1サイクルおきに8ワイドFMA
- 16 SPフロップ/サイクル:1サイクルおきに16ワイドFMA
Intel Xeon Phi(Knights Landing)、コアごと:
- 32 DPフロップ/サイクル:サイクルごとに2つの8ワイドFMA
- 64 SPフロップ/サイクル:サイクルごとに2つの16ワイドFMA
IBM Blue Gene/QおよびIntelXeonPhi(Knights Corner)にスレッドごとおよびコアごとのデータがある理由は、コアごとに複数のスレッドを実行すると、これらのコアの命令発行率が高くなるためです。