Hacker News 中文摘要

RSS订阅

Who Is Vfmaddrnd231pd?

vfmaddrnd231pd 是 FMA 指令集中一条独特指令,同集多数助记符形如 vfmadd231pd,rnd 则有特定含义。英特尔(Intel)软件开发手册(Intel Software Development Manual)将其记为带舍入控制的紧缩双精度浮点融合乘加 VFMADDRND231PD,立即数字节控制舍入。它本可摆脱全局舍入模式,借 FMA 加减乘,在不使用 AVX-512 时可控舍入,加速。前提是它真存在:GNU 汇编器(GNU assembler)不识别,手册提到的英特尔 C/C++ 编译器(Intel C/C++ Compiler)内建函数 mmfmaddroundpd、mm256fmaddroundpd 在 Clang 与 ICC 中缺失;按手册手工汇编操作码 VEX.DDS.128.66.0F3A.W1 B8 /r /ib 有问题,VEX 是 VEX 前缀。

正文

vfmaddrnd231pd 是 FMA 指令集中独特的一条;同类指令助记符多为 vfmadd231pd,这里的 rnd 有特殊含义。Intel SDM 将其记为 VFMADDRND231PD——带舍入控制的紧缩双精度浮点值融合乘加,并称立即数字节定义了若干位字段,用于控制舍入、DAZ、FTZ 和异常抑制(见表 5-3)。

多数 x86 浮点指令用全局舍入模式和设置,改动很慢。vfmaddrnd231pd 却能按指令控制舍入;FMA 可模拟加、减、乘,因此无需 AVX-512 也能让任何算术可控舍入,使依赖舍入的算法快得多——如果它真存在的话。但 GNU 汇编器不认识它;SDM 提到的 Intel C/C++ 内联函数 mmfmaddroundpd 和 _mm256fmaddround_pd,Clang 和 ICC 都没有。按 SDM 操作码手工汇编还会发现另一个问题:手册写的是 VEX.DDS.128.66.0F3A.W1 B8 /r /ib。VEX 是 VEX 前缀,DDS 又是什么?这个操作码是 SDM 里唯一提到 DDS 的地方;Stack Overflow 上的一个回答(https://stackoverflow.com/a/37354947/5417677)说 DDS 只用于文档,后来已从 SDM 移除,但仍出现在这里,很可疑。在支持 FMA 的 CPU(如我的 Haswell)上运行它,会触发 #UD(未定义指令)!

我本就奇怪 SDM 只列 vfmaddrnd231pd,没有 pd/ps/sd/ss 或 132/213/231 等其他 FMA 变体,这下证实了怀疑。下载更新版 SDM 后发现,2026 版已无此指令,2024 版还有。

我极其困惑。它不像文档笔误,因为文档有独有的表格和伪代码,与其他指令都不像。我猜 Intel 原想加入 vfmaddrnd* 系列,最后一刻发现问题,把它从 CPU 移除,却没改对 SDM。但我无法证实。

若读者在 Intel 有朋友,我很想知道答案。

评论

讨论围绕一条名字晦涩、需要心智翻译才能理解的 x86 指令展开,气氛是反思与考据多于对立争吵:多数意见把它视为底层交互流失后的历史遗留,少数意见则提出技术猜测,认为它可能因硬件问题被移除且从未真正可用。分歧主轴在于:问题主要出在命名与认知失传,还是指令本身早已失效;此外命名还一度让人误以为它是 RISC-V 扩展。

认为晦涩指令只是底层交互流失后的历史遗留,并非根本错误

  • 从设计传承看,这条指令像一把锁的钥匙,编译器按设定调用即可,并不存在根本缺陷;真正丢失的是人们与底层指令的直接交互。若有更多汇编程序员,就会推动更好的指令表示,降低芯片与编译器设计者的认知负担;人工智能也许能重新链接这些被遗忘的方法,例如为现代复杂指令集设计更易用的汇编器(高赞)。 > 如果更多人写汇编,就会有足够的头脑去推动更好的指令集表示(@Lerc)

认为命名看起来像 RISC-V 扩展,实际属于 x86

  • 有人初看以为这是 RISC-V 的扩展名,查证文章后才发现其实是 x86 指令,这种命名带来的误导也成为社区里的一个轻共鸣(少数人)。 > 这名字看起来像 RISC-V 扩展,查证后才发现其实是 x86(@LoganDark)

认为指令因硬件问题被移除且从未真正工作

  • 有人贴出 x86 指令参考页并提出技术猜测:该指令可能因硬件问题被移除,从未真正可用;若属实,它名字难懂就只是失效指令的遗留痕迹,而非值得深究的设计缺陷(少数人)。 > 该指令可能因硬件问题被移除,从未真正工作过(@enjoyyourlife)

有价值的补充

  • 把这类历史遗留物类比成音乐盒与正则表达式:它们都是过去常用设计原则下产生的持久方案,今天若重新设计反而不一定能做出同样持久的东西;而且理解音乐盒比理解正则表达式背后的有限自动机更容易,但二者都是设计上的奇迹(@Lerc)。
  • 讨论所涉的具体 x86 指令为 vfmaddrnd231pd,可在 Felix Cloutier 维护的 x86 指令参考页查到相关条目(@enjoyyourlife)。