FMA命令セットは、 x86マイクロプロセッサ命令セットの128ビットおよび256ビットのストリーミングSIMD拡張命令を拡張したもので、FMA( Fused Multiply-Add )演算を実行します。[1] 2つのバリエーションがあります。
- FMA4は、 Bulldozerアーキテクチャ以降のAMDプロセッサでサポートされています。FMA4は、FMA3より前にハードウェアで実行されていました。FMA4のサポートはZen 1以降削除されています。[2]
- FMA3 は、 Piledriverアーキテクチャ以降の AMD プロセッサと、 2014 年以降のHaswell プロセッサおよびBroadwell プロセッサ以降のIntelプロセッサでサポートされています。
説明書
FMA3 命令と FMA4 命令はほぼ同じ機能を持っていますが、互換性はありません。どちらも浮動小数点スカラーおよびSIMD演算用の FMA ( Fused Multiply-Add ) 命令を持っていますが、FMA3 命令には 3 つのオペランドがあり、FMA4 命令には 4 つのオペランドがあります。FMA 演算はd = round( a · b + c ) の形式です。round 関数は、結果が宛先レジスタ内に収まらないほど多くの有効ビットがある場合に、結果を宛先レジスタ内に収めるために 丸めを実行します。
4 つのオペランド形式 (FMA4)では、 a、b、c、d を4 つの異なるレジスタにすることができますが、3 つのオペランド形式 (FMA3) では、d はa、b 、またはcと同じレジスタにする必要があります。3 つのオペランド形式ではコードが短くなり、ハードウェア実装が若干シンプルになりますが、4 つのオペランド形式ではプログラミングの柔軟性が高まります。
Intel と AMD 間の互換性の問題の詳細については、 XOP 命令セットを参照してください。
FMA3命令セット
FMA3搭載CPU
- アム
- インテル
- Haswell(2013)以降のプロセッサ(PentiumとCeleronを除く) [4] [5]
FMA3からの抜粋
サポートされているコマンドには以下が含まれます
- 注記
- VF N M ADDは であり
result = − a · b + c、 ではありませんresult = − (a · b + c)。 - VF N M SUB は、すべての入力がゼロの場合、-0 を生成します。
オペランドの明示的な順序は、数字「132」、「213」、および「231」を使用したニーモニックに含まれています。
オペランドの形式 (パックまたはスカラー) とサイズ (シングルまたはダブル) も同様です。
その結果、
FMA4命令セット
FMA4搭載CPU
- アム
- 「重機」プロセッサー
- ブルドーザーベースのプロセッサ、2011年10月12日[6]
- パイルドライバーベースのプロセッサ[7]
- スチームローラーベースのプロセッサ
- 掘削機ベースのプロセッサ(「v2」を含む)
- Zen : WikiChip のテストでは、FMA4 は公式にはサポートされておらず、CPUID にも報告されていないにもかかわらず、(テストの条件下では) 依然として動作しているようです。これは Agner Fog によっても確認されています。[8]しかし、他のテストでは間違った結果が出ました。[9] AMD 公式 Web サイト FMA4 サポート ノート ZEN CPU = AMD ThreadRipper 1900x、R7 Pro 1800、1700、R5 Pro 1600、1500、R3 Pro 1300、1200、R3 2200G、R5 2400G。[10] [11] [12]
- 「重機」プロセッサー
- インテル
- Intel は FMA4 をサポートする CPU をリリースしていません。
FMA4からの抜粋
歴史
Intel の FMA3 と AMD の FMA4 の非互換性は、両社がコーディングの詳細を互いに調整せずに計画を変更したために生じました。AMD が FMA3 から FMA4 に計画を変更したのに対し、Intel はほぼ同時に FMA4 から FMA3 に計画を変更しました。経緯は次のようにまとめることができます。
- 2007年8月: AMDは3オペランドFMA命令を含むSSE5命令セットを発表。命令に3つのオペランドを持たせるための新しいコーディング方式(DREX)が導入された。 [13]
- 2008年4月: Intelは4オペランドFMA命令を含むAVXおよびFMA命令セットを発表しました。これらの命令のコーディングには、AMDのDREXスキームよりも柔軟性の高い新しいVEXコーディングスキーム[14]が使用されています。
- 2008年12月: IntelはFMA命令の仕様を4オペランド命令から3オペランド命令に変更しました。VEXコーディング方式は引き続き使用されています。[15]
- 2009年5月: AMDはFMA命令の仕様を3オペランドDREX形式から4オペランドVEX形式に変更し、2008年12月のIntel仕様ではなく2008年4月のIntel仕様と互換性を持たせました。[16]
- 2011年10月: AMD BulldozerプロセッサがFMA4をサポート。[17]
- 2012年1月: AMDは、コードネームTrinityとVisheraの将来のプロセッサでFMA3をサポートすることを発表しました。これらはPiledriverアーキテクチャに基づいています。[18]
- 2012年5月: AMD PiledriverプロセッサがFMA3とFMA4の両方をサポート。[17]
- 2013年6月: Intel HaswellプロセッサがFMA3をサポート。[19]
- 2017 年 2 月: AMD Ryzenプロセッサの第 1 世代は、CPUID命令によると FMA3 を公式にサポートしていますが、FMA4 はサポートしていません。[2]このプロセッサに FMA4 が実装されているかどうかについては、 GNU Binutilsパッケージの最初のパッチのエラッタが原因で混乱がありましたが、これはその後修正されました。[20] [21]誤った結果に関する未確認の報告[9]が疑念を招きましたが、Mysticial (y-cruncher の開発者である Alexander Yee) がそれを否定しました。[22] FMA4 は、彼の Zen 1 システムでビット正確な bignum 計算に何年も機能していましたが、Reddit の 1 つの報告は、広く繰り返される前に、テスト ソフトウェアの間違いを排除するためのフォローアップ調査がまったく行われませんでした。初期の Ryzen CPU は、特定の FMA3 命令シーケンスによってクラッシュすることがありましたが、更新された CPU マイクロコードによって問題が修正されました。[23]
- 2019年7月: AMD Zen 2以降のRyzenプロセッサはFMA4をまったくサポートしていません。[24] FMA3は引き続きサポートしています。Zen 1とZen+のみが非公式にFMA4をサポートしています。
コンパイラとアセンブラのサポート
コンパイラによって、FMA のサポート レベルは異なります。
- GCCはバージョン4.5.0以降では-mfma4でFMA4をサポートし[25]、バージョン4.7.0以降では-mfmaでFMA3をサポートしています。
- Microsoft Visual C++ 2010 SP1はFMA4命令をサポートしています。[26]
- Microsoft Visual C++ 2012 は FMA3 命令をサポートしています (プロセッサが AVX2 命令セット拡張もサポートしている場合)。
- Microsoft Visual C++ (VC 2013 以降)
- PathScale は、 -mfma を使用して FMA4 をサポートします。[27]
- LLVM 3.1ではFMA4のサポート[28]と予備的なFMA3のサポート[29]が追加されました。
- Open64 5.0 では「限定サポート」が追加されました。
- IntelコンパイラはFMA3命令のみをサポートしています。[25]
- NASM はバージョン 2.03 以降で FMA3 命令をサポートし、バージョン 2.06 以降で FMA4 命令をサポートしています。
- FASM はFMA3 命令と FMA4 命令の両方をサポートします。
参考文献
- ^ 「FMA3 と FMA4 は命令セットではなく、個別の命令 (融合乗算加算) です。Intel と AMD の実装方法によっては非常に便利なものになる可能性があります」Woltmann, George (Prime95)。「Intel AVX と GIMPS」。mersenneforum.org/index.php。Great Internet Mersenne Prime Search (GIMPS) プロジェクト。2011年7 月 27 日閲覧。
{{cite web}}: CS1 maint: numeric names: authors list (link) - ^ ab 「Intel、AMD、VIA CPU のマイクロアーキテクチャ アセンブリ プログラマとコンパイラ メーカー向けの最適化ガイド」(PDF) 。2017年 5 月 2 日閲覧。
- ^ Maffeo, Robin (2012 年 3 月 1 日). 「AMD と Visual Studio 11 ベータ版」. AMD. 2013 年 11 月 9 日時点のオリジナルよりアーカイブ。2018 年 11 月 7 日閲覧。
- ^ 「CPU-Z - ID:y5z6gq」 . 2022年5月1日閲覧。
- ^ 「CPU-Z - ID:kr2mlx」 . 2022年5月1日閲覧。
- ^ 「AMD64 アーキテクチャ プログラマーズ マニュアル 第 6 巻: 128 ビットおよび 256 ビット XOP、FMA4、CVT16 命令」(PDF)。AMD 。2009年 5 月 1 日。
- ^ 「新しい「Bulldozer」および 「 Piledriver」命令、高性能ソフトウェア開発への一歩前進」(PDF)。AMD。2012年 10 月。
- ^ “Agner の CPU ブログ - AMD Ryzen のテスト結果”. 2017年5月2日。
- ^ ab 「ディスカッション – Ryzen は FMA4 を文書化されていない形でサポートしています」 。2017年 5 月 10 日閲覧。
- ^ 「www.amd.com、FMA4 サポート モデル リスト」。
- ^ 「www.amd.com、FMA4 サポート モデル リスト」。
- ^ 「www.amd.com、FMA4 サポート モデル リスト」。
- ^ 「128 ビット SSE5 命令セット」。AMD Developer Central。2008年 1 月 15 日時点のオリジナルよりアーカイブ。2008 年 1 月 28 日閲覧。
- ^ 「Intel Advanced Vector Extensions プログラミング・リファレンス」(PDF) . Intel . 2008-04-05閲覧。[永久リンク切れ ]
- ^ 「 Intel Advanced Vector Extensions プログラミング リファレンス」 。Intel。2009年 5 月 6 日閲覧。
- ^ 「バランスをとる」 Dave Christie、AMD 開発者ブログ。2009 年 5 月 6 日。2012 年 7 月 8 日時点のオリジナルよりアーカイブ。2018年 11 月7 日閲覧。
- ^ ab 「新しいブルドーザーとパイルドライバーの説明書」(PDF)。AMD 。 2013年7月25日閲覧。
- ^ 「AMD ファミリー 15h プロセッサ向けソフトウェア最適化ガイド」(PDF)。AMD 。2012 年4 月 19 日閲覧。
- ^ 「Intel アーキテクチャ命令セット拡張プログラミング リファレンス」(PDF)。Intel 。2013 年7 月 25 日閲覧。
- ^ Gopalasubramanian, Ganesh (2015-03-10). 「[PATCH] znver1 プロセッサを追加」. 2022年5月1日閲覧。
- ^ Pawar, Amit (2015-08-07). 「[PATCH] Znver1 CPU フラグから CpuFMA4 を削除」 . 2022-05-01閲覧。
- ^ “Stack Overflow comment by Mysticial”. 2019-07-16. 2019-08-22時点のオリジナルよりアーカイブ。2023-09-01に閲覧。
{{cite web}}: CS1 maint: bot: original URL status unknown (link) - ^ 「AMD Ryzen マシンが FMA3 命令のシーケンスでクラッシュ」。2017 年 3 月 16 日。2017 年 9 月 10 日閲覧。
- ^ 「Mysticial による Stack Overflow コメント」 2019 年 7 月 16 日. 2023 年 9 月 1 日閲覧。
- ^ ab Latif, Lawrence (2011年11月14日). 「AMD Bulldozer は GCC で FMA4 と XOP 命令のみをサポート、Intel は依然沈黙」The Inquirer。2011年11月17日時点のオリジナルよりアーカイブ。
{{cite web}}: CS1 maint: unfit URL (link) - ^ 「Visual Studio 2010 SP1 用の FMA4 組み込み関数の追加」。2013 年 2 月 4 日。
- ^ 「EKOPath man doc」。2016年6月23日時点のオリジナルよりアーカイブ。2013年7月24日閲覧。
- ^ 「LLVM 3.1 リリースノート」。
- ^ 「CPUID による AVX および AVX2 サポートの検出を有効にする」。LLVM。2012-04-26。
