根据documentation,在fma()中有一个math.h函数。很好,我知道FMA的工作原理以及使用目的。但是,我不确定这在实践中如何实现?我对x86x86_64体系结构最感兴趣。

是否有FMA的浮点(非矢量)指令,也许是IEEE-754 2008所定义的?

是否使用FMA3或FMA4指令?

在依赖精度的情况下,是否有固有的方法可以确保使用真实的FMA?

最佳答案

实际的实现因平台而异,但讲得很广泛:

  • 如果您告诉编译器使用硬件FMA指令(PowerPC,带有VFPv4或AArch64的ARM,Intel Haswell或AMD Bulldozer及更高版本)针对一台机器,则编译器可能会通过将适当的指令放入代码中来替换对fma( )的调用。这不能保证,但通常是好的做法。否则,您将调用数学库,并且:
  • 在具有硬件FMA的处理器上运行时,应使用这些指令来实现该功能。但是,如果您具有较旧版本的操作系统或较旧版本的数学库,则可能无法利用这些说明。
  • 如果您在没有硬件FMA的处理器上运行,或者使用的是较旧的(或不是很好)数学库,则将使用FMA的软件实现。这可以使用巧妙的扩展精度浮点技巧或整数算法来实现。
  • fma( )函数的结果应始终正确取整(即“真实fma”)。如果不是,那是系统数学库中的一个错误。不幸的是,fma( )是更难于正确实现的数学库函数之一,因此许多实现都有错误。请向您的图书馆供应商报告,以使它们得到修复!



  • 只要有一个好的编译器,就没有必要了。使用fma( )函数并告诉编译器您要针对的体系结构就足够了。但是,编译器并不完美,因此您可能需要在x86上使用_mm_fmadd_sd( )和相关的内在函数(但应将错误报告给编译器供应商!)

    关于floating-point - fma()如何实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28630864/

    10-09 07:16