第 3 章 第一部分结束语

在这一部分,我们借助c语言了解了SIMD和多线程编程的基本知识,并通过示例程序展示了并行计算带来的性能提升。
希望这一部分能对您有所帮助。

最后的最后,我们来解答这一部分中最神秘的问题:为什么要计算a×b+c。其实,是为了介绍一个非常有用的指令——FMA。由于这份指南是关于并行计算的,所以关于FMA的事情就放在角落里了。
FMA —— Fused Multiply-Add,称作“积和熔加”运算。该运算直接计算a*b+c的值。其实这条指令的目的并不是加速计算(虽然好像的确比先乘后加快),其目的在于提高精度。众所周知,浮点数并不是无限精度的(可以参考附录中的浮点数的机器表示方法)。先乘后加包含了两次近似,而“积和熔加”只进行一次近似。但是要注意,这条指令也不是万能的。维基百科上有举例:计算\(x^2-y^2\),如果\(x=y\),而程序写成FMA(x,x,-y*y),那么y*y会先进性近似,之后可能会与x*x的精确值不相等,从而得到一个非0的结果。如果进行多步运算,误差也许会累积到后面,甚至逐渐放大。不过一般来说,FMA还是一个好指令。在c语言中,math.h定义了fma函数用于做“积和熔加”运算。具体的汇编语言怎么写就不在这里详述了。