一次乘法需要几个浮点操作啊?

一次float型复数的乘法需要几次浮点操作呢,

LZ您好,根据复数运算法则,假定两个复数为 a+bi和c+di,那么乘积以后的实部为ac-bd,虚部为bc+ad。

一共有4次乘法和2次加法。
以及编译后,或许可以通过使用FMA来将一次乘法和一次加法合并。

大致情况如此,供您参考。
祝您编码顺利~

感谢哈,您说的我知道,四次乘法和两次加法各需要几次浮点运算呢?比如Tesla2075单精度浮点运算速度是1030GFOLPS,它1秒能算多少次单精度的实数乘法呢?或者多少次复数乘法呢?

LZ您好,我再来详细说一下:
(下文中一般说的浮点运算都只讨论单精度情况)

1:一次单精度的乘法算一次(单精度的)浮点运算,一次单精度的加法也算一次浮点运算。

2:因为fermi有FMA单元,所以可以将一次浮点乘法和一次浮点加法(形如 d=a*b+c这样)一次性完成,此时虽然是一次性完成的,但是确实完成了两次浮点运算(一个加法,一个乘法),而且中间过程的精度更高,所以FMA一次,一般算两次浮点运算。因为fermi的FMA单元是全速的,所以此时达到最大浮点运算峰值。这一点后面详细讲。

3:所以,您说的4次乘法和2次加法,算6次浮点运算的,无论是否使用FMA。

上面是回答您 浮点相乘算几次浮点运算,这个问题的。
下面说一下针对特定的GPU,又将如何看待此问题,以及GPU的浮点峰值是如何计算出来的。

首先需要明确一下,Telsa 2075的理论单精度浮点峰值是按照最理想的情况计算的,同样是单精度的浮点运算指令,其吞吐量是不同的,具体的参数,您可以参考一下 CUDA C Programming Guide 5.4.1的内容(手册中是按照每个SM计算的吞吐量,下面我是按照每个SP计算的)。

那么GPU的某个特定的浮点操作指令的吞吐量一般这样计算:

SP(CUDA Core)数量SP(CUDA Core)频率该指令每SP,每SP周期的吞吐量(需要多个周期的指令,这里是小于一的值)*该指令算多少次浮点操作(FMA为2)

Telsa 2075有448个SP/CUDA Core,SP频率为1150MHz,FMA的吞吐量是每SP每SP周期1条(也就是说是全速的),每条FMA计算算两次浮点操作。
这样可以算得2075的单精度浮点峰值是 4481150E61*2=1030.4G Flops

换句话说,也只有在跑FMA的时候,能达到此峰值。
如果是浮点的加法和乘法,虽然也是全速的,但是计算一次算一次浮点操作,所以此时只能达到515.2G Flops。
如果是其他吞吐量更低的指令,能达到的速度更低。

那么回到您的问题,在2#我分析过,您的一次复数单精度乘法,其实是变成实数的实虚部计算的,实部为ac-bd,虚部为bc+ad。

那么在计算ac-bd的时候,编译器将会编译为一次乘法和一次FMA(而不是两次乘法和一次加法,因为用FMA更快)。那么不考虑其他问题,这有一半计算能跑到理论峰值1030G,有一半能跑到515G。(bc+ad情况与之类似)
那么,理论上,能发挥出2075理论峰值1030G的75%,也就是772.8G Flops。

如果您确实需要折算回去,计算每秒多少次复数乘法,那么实际上需要两次FMA和两次MUL才能计算出来一个复数乘法,此时可以等效看做此种指令“吞吐量为1/4条每SP 每SP周期(因为需要算4个单周期完成的指令才能完成一次复数乘法)”

所以一秒可以计算的次数是 4481150E6(1/4)=128.8G次/秒(这里不用G Flops表示,因为G Flops习惯上说的是实数浮点数的计算)

大致如上,请LZ参考。

祝您编码愉快~

修改了一处文字遗漏。