Sandy-BridgeとHaswellを使用すると、コアあたり1サイクルあたりのフロップ数がどれくらいになるかについて混乱しています。 SSEで理解したように、SSEではコアあたりサイクルあたり4フロップ、AVX/AVX2ではコアあたりサイクルあたり8フロップである必要があります。
これは、ここで検証されているようです サイクルあたり4 FLOPsの理論上の最大値を達成するにはどうすればよいですか? そして、ここでは Sandy-Bridge CPU仕様 です。
ただし、以下のリンクは、Sandy-bridgeがコアあたりサイクルあたり16フロップ、コアあたりサイクルあたり32フロップを実行できることを示しているようです http://www.extremetech.com/computing/136219-intels-haswell-is -an-unprecedented-threat-to-nvidia-AMD 。
誰かがこれを私に説明できますか?
編集:私は今、私が混乱した理由を理解しています。 FLOPという用語は、単一の浮動小数点(SP)のみを指すと思いました。 サイクルあたり4 FLOPsの理論上の最大値を達成する方法 のテストは実際には二重浮動小数点(DP)であるため、SSEで4 DP FLOPs /サイクルを達成していることがわかります。およびAVX用の8 DP FLOP /サイクル。 SPでこれらのテストをやり直すのは興味深いでしょう。
ここに、最近のプロセッサーのマイクロアーキテクチャーの数に対する理論上の最大FLOPカウント(per core)とそれらを達成する方法の説明を示します。
一般に、これを計算するには、FMA命令のスループットを調べます。 on https://agner.org/optimize/ またはその他のマイクロベンチマーク結果、および乗算(FMAs per clock) * (vector elements / instruction) * 2 (FLOPs / FMA)
。
実際のコードでこれを達成するには、非常に慎重な調整(ループのアンロールなど)、ほぼゼロのキャッシュミス、および何のボトルネックも必要ないことに注意してくださいelse。現代のCPUにはFMAスループットが非常に高いため、結果を保存したり、入力を供給する他の命令のスペースはあまりありません。たとえば、クロックあたり2 SIMDの負荷もほとんどのx86 CPUの制限であるため、ドット積は1 FMAあたり2負荷でボトルネックになります。ただし、調整された密行列の乗算は、これらの数値の達成に近づきます。
ワークロードに、FMAに縮小できないADD/SUBまたはMULが含まれている場合、理論上の最大数はワークロードに適切な目標ではありません。 Haswell/Broadwellには2クロックあたりSIMD FP乗算(FMAユニット上)がありますが、1クロックあたり1 SIMD FP add(個別のベクトル上にFPレイテンシの低いユニットを追加)。スカイレイクは個別のSIMDを削除しましたFP加算器、4cレイテンシで同じadd/mul/fmaを実行し、任意のベクトル幅のクロックスループット。
最近のマイクロアーキテクチャのCeleron/PentiumバージョンはAVXまたはFMA命令をサポートせず、SSE4.2のみをサポートしていることに注意してください。
Intel Core 2およびNehalem(SSE/SSE2):
Intel Sandy Bridge/Ivy Bridge(AVX1):
Intel Haswell/Broadwell/Skylake/Kaby Lake/Coffee/...(AVX + FMA3):
Intel Skylake-X/Skylake-EP/Cascade Lake/etc(AVX512F)with1 FMAユニット:一部のXeon Bronze/Silver
Intel Skylake-X/Skylake-EP/Cascade Lake/etc(AVX512F)with2 FMAユニット:Xeon Gold/Platinum、およびi7/i9ハイエンドデスクトップ(HEDT)チップ。
将来:Intel Cooper Lake (Cascade Lakeの後継)は Brain Float を導入する予定です。これは、ニューラルネットワークワークロード用のfloat16形式であり、実際のSIMD計算をサポートしています。現在のF16C拡張とは異なり、float32への変換を伴うロード/ストアのみをサポートしています。これにより、同じハードウェアでFLOP /サイクルのスループットが単精度に対して2倍になります。
現在のIntelチップは、iGPUの標準float16で直接実際の計算のみを行います。
AMD K10:
AMD Bulldozer/Piledriver/Steamroller/Excavator、モジュールごと(2コア):
AMD Ryzen
Intel Atom(Bonnell/45nm、Saltwell/32nm、Silvermont/22nm):
AMDボブキャット:
AMD Jaguar:
ARM Cortex-A9:
ARM Cortex-A15:
Qualcomm Krait:
IBM PowerPC A2(Blue Gene/Q)、コアごと:
IBM PowerPC A2(Blue Gene/Q)、スレッドごと:
インテルXeon Phi(ナイツコーナー)、コアごと:
インテルXeon Phi(ナイツコーナー)、スレッドごと:
Intel Xeon Phi(Knights Landing)、コアごと:
IBM Blue Gene/QおよびIntel Xeon Phi(Knights Corner)にスレッドごとおよびコアごとのデータがあるのは、コアごとに複数のスレッドを実行する場合、これらのコアの命令発行率が高いためです。
Haswellのスループットは、乗算とFMAよりも加算のほうが低くなります。 2つの乗算/ FMAユニットがありますが、f.pは1つだけです。ユニットを追加します。コードに主に追加が含まれている場合は、最大スループットを得るために、1.0の乗数を持つFMA命令で追加を置き換える必要があります。
HaswellでのFMA命令のレイテンシは5で、スループットはクロックあたり2です。これは、最大スループットを得るために10の並列操作を維持する必要があることを意味します。たとえば、非常に長いf.pのリストを追加する場合。数字の場合、10個に分割し、10個のアキュムレータレジスタを使用する必要があります。
これは確かに可能ですが、だれが1つの特定のプロセッサに対してこのような奇妙な最適化を行うでしょうか?