为什么Windows上的FFTW比Linux上的快?

为什么Windows上的FFTW比Linux上的快?,linux,windows,performance,fft,fftw,Linux,Windows,Performance,Fft,Fftw,我在Linux和Windows中使用fftw库编写了两个完全相同的程序(fftw3.a,fftw3.lib),并计算fftwf\u execute(m\u wfpftplan)语句(16 fft)的持续时间 10000次跑步: 在Linux上:平均时间为0.9 在Windows上:平均时间为0.12 我不明白为什么Windows上的速度比Linux快九倍 处理器:英特尔(R)核心(TM)i7CPU 870@2.93GHz 每个操作系统(Windows XP 32位和Linux OpenSUS

我在Linux和Windows中使用fftw库编写了两个完全相同的程序(
fftw3.a
fftw3.lib
),并计算
fftwf\u execute(m\u wfpftplan)
语句(16 fft)的持续时间

10000次跑步:

  • 在Linux上:平均时间为0.9
  • 在Windows上:平均时间为0.12
我不明白为什么Windows上的速度比Linux快九倍

处理器:英特尔(R)核心(TM)i7CPU 870@2.93GHz

每个操作系统(Windows XP 32位和Linux OpenSUSE 11.4 32位)都安装在相同的机器上

我从internet下载了fftw.lib(适用于Windows),但不知道它的配置。使用此配置构建FFTW后:

/configure --enable-float  --enable-threads --with-combined-threads  --disable-fortran  --with-slow-timer  --enable-sse  --enable-sse2  --enable-avx   

在Linux中,它产生的lib比默认配置快四倍(0.4毫秒)。

16 FFT非常小。您会发现,小于64的FFT将是无循环的硬编码汇编程序,以获得尽可能高的性能。这意味着它们很容易受到指令集、编译器优化、甚至64位或32位字变化的影响

当您以2的幂从16->1048576运行FFT大小测试时会发生什么?我这样说是因为Linux上一个特定的硬编码asm例程可能不是针对您的机器进行的最佳优化,而您可能在Windows实现中幸运地获得了这种特定的大小。比较此范围内的所有大小可以更好地说明Linux与Windows的性能

你校准过FFTW吗?当第一次运行FFTW时,会猜测每台机器的最快实现速度,但是如果您有特殊的指令集、特定大小的缓存或其他处理器功能,则这些功能会对执行速度产生显著影响。因此,执行校准将测试各种FFT例程的速度,并为特定硬件选择每种大小最快的。校准涉及重复计算计划并保存生成的FFTW“WITHESS”文件。保存的校准数据(这是一个漫长的过程)可以重新使用。我建议在软件启动时执行一次,每次都重新使用该文件。校准后,我注意到某些尺寸的性能提高了4-10倍

下面是我用来校准特定尺寸FFTW的代码片段。请注意,此代码是从我处理的DSP库中逐字粘贴的,因此某些函数调用是特定于我的库的。我希望FFTW的具体电话能有所帮助

//校准FFTW
无效DSP::强制校准(无效)
{
//尝试导入FFTw智慧以快速创建计划
文件*fftw_willity=fopen(“DSPDLL.ftw”,“r”);
//如果不存在智慧,请用户进行校准
如果(fftw_=0)
{
int iStatus2=AfxMessageBox(“未在此机器上校准FFTw。”\
“是否要执行一次性校准?\n\n”\
“注意:\t可能需要40分钟(在P4 3GHz上),但所有后续基于FFT的滤波和卷积运算的速度最高可达100%。\n”\
“\t结果保存到磁盘(DSPDLL.ftw),每台机器只需执行一次。\n\n”\
“\t确保确实要执行此操作,无法取消部分校准!”,
MB|u YESNO | MB|u ICONSTOP,0);
如果(iStatus2==Y)
{
//对从8到4194304的2的所有功率进行校准
//(最常用的FFT-用于信号处理)
AfxMessageBox(“即将执行校准。\n”\
关闭所有程序,关闭屏幕保护程序,此时不要移动鼠标!\n\
“注意:\t在校准结束之前,此程序将显示为无响应。\n\n”
“\t校准完成后,将显示消息框。\n”);
startTimer();
//创建一整套FFTw计划(智慧自动累积)

for(int i=8;i是使用相同编译器(和版本)编译的fftw库?它们是用相同的标志编译的吗?它们是为相同的体系结构编译的吗?也许Windows版本更好地利用了CPU功能。也许它是一个不同的编译器,所以它的优化方式不同。请发布您在两个平台上使用的编译器的详细信息,以及用于您的代码和用于构建该平台的编译选项位是否相同(32位对64位)?相同数量的可用RAM?还有哪些进程并行运行?是否有虚拟化活动?如果不研究两个程序的源代码并检查测试所用系统的硬件、软件和软件配置,就无法回答此问题。:)我只是查找了一些我在奔腾4单核3GHz上使用FFTW计算的FFT计时(早在2005年)16长度FFT的计算时间不到2us,即:0.002ms。直到长度为16384时,时间才超过1ms。16长度FFT应该非常轻。您是否在基准计时器之外执行规划阶段?规划时是否使用FFTW_度量?必须使用SSE/SSE2和完全优化(特别是Visual Studio)将在选择发布模式时默认启用这些
DSP::pCF = fftw_plan_dft_1d (i, DSP::cFFTin, DSP::cFFTout, 
   FFTW_FORWARD, FFTW_MEASURE);