
2026/10/13 6:12
Vfmaddrnd231pdとは誰か?
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
2026 年 10 月 12 日、記事では Intel の 2024 年版ソフトウェア開発マニュアル (SDM) に記載されているが、2026 年版には含まれていない浮動小数点命令
VFMADDRND231PD を検証した。 SDM は、この命令を、即値バイトにより DAZ、FTZ および例外抑制のビットフィールドを指定することで、インストラクション単位の丸め制御を実行する、パックされた二重精度値への融合乗算加算 (fused multiply-add) として記述している。これは、x86 浮動小数点操作で一般的であるが低速なグローバルな丸emode変更に対する代替手段である。理論的には、AVX-512 を使用せずに加算、減法、乗算に対して制御可能な丸めを実現し、特定のアルゴリズムの加速を可能にすることができると考えられる。検証試みでは、GNU アセンブラが VFMADDRND231PD を認識しておらず、Intel C/C++ コンパイラのインリンシック _mm_fmaddround_pd および _mm256_fmaddround_pd が Clang および ICC コンパイラの両方から欠落していることが明らかとなった。 SDM のオPCODEリストを使用して命令をマニュアルでアセンブルすると (VEX.DDS.128.66.0F3A.W1 B8 /r /ib)、2024 年版の SDM 에만見られる「DDS」フィールドが出現しており、ドキュメントとハードウェアの変更が完全に一致していないことを示唆している。 Intel Haswell CPU でこの命令を実行すると #UD(未定義命令)がトリガーされる。著者は、これにもかかわらず、SDM のテーブルと擬似コードは単なるタイプミスのように見えないため、Intel が vfmaddrnd* セットを追加する意図があり、直前の段階で問題に遭遇しハードウェアから除外したが、マニュアルの更新を完全に行うことはできなかったという仮説を提示している。不一致の原因は依然として確認されておらず、著者は Intel 側との連絡先を持つ者からのフィードバックを求める。本文
VFMADDRND231PD:SDM 上に存在するが実装されていない命令の謎
命令の概要と仕様
- 命令名:
VFMADDRND231PD- FMA(乗算・加算)命令セットに含まれる独自の命令。
- 一般的な
などの修飾子付き助記符とは異なり、**「RND」**という特定の役割を持つ。VFMADD231PD
- 公式定義: インテル製ソフトウェア開発マニュアル(SDM)には以下のように記載されている。
「丸め制御を付与したパックされた倍精度浮動小数点数に対する融合乗算・加算」
- イミディエイトバイトの機能: 複数のビットフィールドを含み、以下の制御を行う。
- 丸めモード
- DAZ(Denormal-Ast-Zero:非正規化数処理)
- FTZ(Flush-To-Zero:ゼロフラッシュ)
- 例外抑制
期待される特徴と利点
- 命令単位の丸め制御:
- 多くの x86 浮動小数点命令はグローバルな設定に依存するため、モード切換えが遅い。
- この命令は命令ごとに丸めモードを制御可能である点が最大の特徴。
- 汎用性の高さ:
- FMA が加算・減算・乗算をいずれも実装できるため、AVX-512 に依存せず任意の演算で丸め動作を制御できる。
- 丸めに依存するアルゴリズムの高速化が期待される機構となっているはず。
現実に直面した問題点
- 命令の実在性の疑念:
- GNU アセンブラーでは認識されない。
- SDM に記載されているインテル製 C/C++ コンパイラの内在関数
および_mm_fmaddround_pd
も、Clang および ICC の両方で欠落。_mm256_fmaddround_pd
- アセンブリ時のエラー:
- SDM に掲載された操作コードリストを手作業でアセンブルすると問題が発生する。
操作コード「DDS」の謎
- 対応するオペコード:
VEX.DDS.128.66.0F3A.W1 B8 /r /ib- 「VEX」は VEX プレフィックスを指す。
- **「DDS」**の意味は不明瞭なまま。SDM において DDS が言及されるのはこの唯一の箇所である。
- Stack Overflow での説:
- 「DDS は単なる文書用表記であり、後の SDM バージョンで削除された」という回答が存在する。
- しかし、なぜ今もここに存在するのかについては疑わしい点が多い。
- 実行時の挙動:
- FMA 命令セットを対応している CPU(Haswell など)上で実際に実行すると、**「#UD」(未定義命令)**が発生してしまい、動作しない。
調査結果:SDM の変更と矛盾
- 初期の疑問:
- SDM が
のみをリストしているが、他の FMA 命令に見られるようなVFMADDRND231PD
やPD/PS/SD/SS
などの変種が含まれていない。132/213/231
- SDM が
- 新版 SDM での発見:
- より新しいバージョンの SDM(2024 年版)を確認したところ、この命令は完全に記載されていないことが判明。
- ※文脈上、これは「命令が削除された(または計画がキャンセルされた)」ことを示唆している可能性がある。
結論と仮説
- 意図的なエラーではない:
- 明らかな入力ミスやタイプエラーのように見えない。
- SDM に他の命令とは異なる独自の表や疑似コードが含まれており、他命令との類似性がまったくないため。
- 最も妥当な仮説:
- インテル側では
シリーズの追加を計画していたが、最終段階で問題に気づいた。VFMADD* - CPU からは取り除かれたものの、SDM の修正が完全に済んでいなかった可能性が高い。
- インテル側では
- 現状の確認手段: 命令を実際に動作させたり、公式な削除声明を確認する方法がない。
インテル関係者と知り合いの方がこの命令の真実をご存知の場合は、ご教示いただけますと幸いです。