プログラミング
Vfmaddrnd231pdとは何か?
Who Is Vfmaddrnd231pd? (purplesyringa.moe)
要約
IntelのFMA命令セットに存在するはずのvfmaddrnd231pdという命令について、その仕様と現実の動作の乖離が解説されています。この命令は、命令ごとに丸めモードを制御できるというユニークな機能を持つとされていますが、アセンブラやコンパイラで認識されず、実際のCPUで実行すると未定義命令例外(#UD)が発生します。ドキュメントのバージョン間で存在が異なり、Intelが開発中に削除したもののドキュメントの修正が不十分だった可能性が推測されています。
全文翻訳
vfmaddrnd231pdとは誰か??2026年10月12日vfmaddrnd231pdはFMA命令セットにおけるユニークな命令です。そのセットのほとんどの命令はvfmadd231pdのようなニーモニックを持ちますが、ここではrndが非常に特定の意味を持ちます。Intel Software Development Manualはそれを次のように文書化しています:VFMADDRND231PD – 丸め制御付きPacked Double-Precision Floating-Point値のFused Multiply-Add[…] 即値バイトは、丸め、DAZ、FTZ、および例外抑制を制御するいくつかのビットフィールドを定義します(表5-3を参照)。ほとんどのx86浮動小数点命令はグローバルな丸めモードと設定を使用し、それらを変更するのは非常に遅いです。しかし、vfmaddrnd231pdは命令ごとに丸めモードを制御でき、FMAは加算、減算、乗算をエミュレートできるため、このメカニズムによりAVX-512なしで算術演算の丸めを効果的に制御でき、丸めに依存する一部のアルゴリズムを信じられないほど高速化できます。もしこの命令が実際に存在すれば、ですが。GNUアセンブラはそれを認識しません。SDMが言及しているIntel C/C++ Compilerの組み込み関数_mm_fmaddround_pdおよび_mm256_fmaddround_pdは、ClangだけでなくICCにも存在しません。SDMのオペコードリストから手動で命令をアセンブルしようとすると、別の問題が明らかになります:VEX.DDS.128.66.0F3A.W1 B8 /r /ibVEXはVEXプレフィックスですが、DDSとは何でしょうか?このオペコードはSDMにおけるDDSの唯一の言及であり、このSOの回答によるとDDSは単に文書化のために使用され、後のSDMバージョンでは削除されたとのことですが、ここにまだ存在しているという事実は疑わしいです。そして、FMA命令セットをサポートするCPU(私のHaswellなど)で実際に命令を実行すると、#UD(未定義命令)が発生します!SDMがvfmaddrnd231pdのみをリストし、pd/ps/sd/ssや132/213/231を使用する他のバリアント(他のFMA命令が持つもの)をリストしていないのは奇妙だと感じていましたが、これで私の疑念は確信に変わりました。その時点で、私はSDMのより新しいバージョンをダウンロードし、この命令が2024年版には存在するにもかかわらず、2026年版のSDMには存在しないことに気づきました。非常に混乱しています。この命令はドキュメントのタイプミスのように見えません。なぜなら、ドキュメントにはユニークなテーブルと他のどの命令にも似ていない疑似コードが含まれているからです。私の最良の仮説は、Intelがvfmaddrnd*セットを追加したかったが、最後に問題を見つけてCPUから削除したが、SDMを完全に調整しなかったということです。しかし、それを確認する方法はありません。これを読んでいる人でIntelに友人がいる人がいれば、答えを知りたいです。