谁是Vfmaddrnd231pd?
2026年10月12日,vfmaddrnd231pd是FMA指令集中的一个独特指令。该指令集中的大多数指令都有类似vfmadd231pd的助记符,但这里的rnd意味着某种非常具体的东西。Intel软件开发手册将其记录为:VFMADDRND231PD – 带有舍入控制的打包双精度浮点值的融合乘加[…] 立即字节定义了几个控制舍入、DAZ、FTZ和异常抑制的位域(请参见表5-3)。大多数x86浮点指令使用全局舍入模式和设置,改变这些设置相当慢。但vfmaddrnd231pd允许在每条指令基础上控制舍入模式,并且由于FMA可以模拟加法、减法和乘法,这个机制有效地允许任何算术操作具有可控舍入,而不需要AVX-512——使得某些依赖舍入的算法变得极快。或者说,如果这个指令真的存在的话。GNU汇编器不识别它。Intel C/C++编译器中的内联函数_mm_fmaddround_pd和_mm256_fmaddround_pd在SDM中提到,但在Clang和ICC中均缺失。试图从SDM操作码列表手动组装这些指令时揭示了另一个问题:VEX.DDS.128.66.0F3A.W1 B8 /r /ib VEX是VEX前缀,但DDS是什么呢?这个操作码是SDM中唯一提到DDS的地方,而这个SO答案表示DDS仅用于文档,并且在后来的SDM版本中被删除,但它仍然出现在这里的事实令人怀疑。当你在支持FMA指令集的CPU上实际运行该指令时,比如我的Haswell,它会引发#UD(“未定义指令”)!我已经觉得奇怪的是,SDM只列出了vfmaddrnd231pd,而没有其他变体,比如使用pd / ps / sd / ss或132 / 213 / 231,这些是其他FMA指令所具有的,但这证实了我的怀疑。就在那时,我下载了更新的SDM版本,注意到在2026年版的SDM中缺少这个指令,尽管在2024版本中存在。说实话,我感到非常困惑。这个指令在文档中并不像是拼写错误,因为文档包含独特的表格和伪代码,与其他任何指令都不同。我的最佳假设是,Intel想要添加vfmaddrnd*集合,然后在最后一刻发现了一个问题,将其从CPU中移除,但没有正确调整SDM。但我没有办法确认。如果任何阅读此内容的人有Intel的朋友,我很想知道答案。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡