在FFTW中,单精度数学比双精度数学慢



我正在查看FFT库的基准测试,并想知道为什么双精度数学会比单精度数学更快(即使在32位硬件上)。

假设英特尔CPU-这一切都取决于编译器。编译32位应用程序时,可以使用普通i87浮点,其中单精度和双精度速度相同。或者,您可以为SP选择SSE,为DP选择SSE2,其中SSE(寄存器中的4个字)是SSE2(每个寄存器2个字)的两倍。为64位编译,i87指令不可用。然后浮点总是被编译为使用SSE/SSE2。由于编译器或特定程序的原因,这些可以编译为SIMD(单指令多数据-一次4/2个字)或SISD(每个寄存器使用一个字的单数据)。然后,我想,SP和DP将具有相似的速度,并且代码可能比32位编译慢。

使用来自RAM(可能还有缓存)的数据,性能可能会受到总线速度的限制,其中SP将比DP快。如果代码像我的FFT基准测试一样,它取决于跳过的顺序读写。然后,速度会受到以至少64字节的突发读取数据的影响,其中SP可能会快一点。

例如trig函数通常在DP中计算。然后,由于DP到SP的转换,SP会稍微慢一点。

最新更新