C++ 智慧不起作用
我试图利用FFTW的智慧功能更快地创建FFTW计划。智慧似乎正确地保存和加载,但它不会加快后续运行的创建。此外,如果我尝试使用WITHIST_ONLY标志创建计划,它将返回一个空计划,让我知道即使加载WITHIST的调用工作正常,也不能用于制定计划 如果我多次运行下面的代码,第一次它将无法加载WITHIST文件,因为它不存在,在后续的运行中,它将报告它已正确加载。在每次运行(第一次或后续运行)中,创建FFTW计划所需的时间相同C++ 智慧不起作用,c++,c,signal-processing,fft,fftw,C++,C,Signal Processing,Fft,Fftw,我试图利用FFTW的智慧功能更快地创建FFTW计划。智慧似乎正确地保存和加载,但它不会加快后续运行的创建。此外,如果我尝试使用WITHIST_ONLY标志创建计划,它将返回一个空计划,让我知道即使加载WITHIST的调用工作正常,也不能用于制定计划 如果我多次运行下面的代码,第一次它将无法加载WITHIST文件,因为它不存在,在后续的运行中,它将报告它已正确加载。在每次运行(第一次或后续运行)中,创建FFTW计划所需的时间相同 #include <Windows.h> #includ
#include <Windows.h>
#include <omp.h>
#include "fftw3.h"
#define THREADS 4
int main ()
{
LARGE_INTEGER li, li2;
__int64 init, run;
double freq;
int Xfft = 384;
int Yfft = 384;
int iterations = 1000;
fftwf_plan pFft[THREADS];
QueryPerformanceFrequency ( &li );
freq = (double)li.QuadPart / 1000000.0;
// Malloc buffer
fftwf_complex* arr[THREADS];
for ( int i = 0; i < THREADS; i++)
{
arr[i] = (fftwf_complex*) fftwf_malloc ( sizeof(fftwf_complex) * Xfft * Yfft );
}
// Setup FFT plan
QueryPerformanceCounter ( &li );
if (fftw_import_wisdom_from_filename("fftw.wis") == 1 )
{
printf("SUCCESS!\n");
}
else
{
printf("FAILURE!\n");
}
for ( int i = 0; i < THREADS; i++ )
{
pFft[i] = fftwf_plan_dft_2d ( Xfft, Yfft, arr[i], arr[i], FFTW_FORWARD, FFTW_PATIENT );
}
fftw_export_wisdom_to_filename("fftw.wis");
QueryPerformanceCounter ( &li2 );
init = li2.QuadPart - li.QuadPart;
// Init array to random numbers
for ( int i = 0; i < THREADS; i++ )
for ( int j = 0; j < Xfft * Yfft; j++ )
{
arr[i][j][0] = (float)rand();
arr[i][j][1] = (float)rand();
}
omp_set_num_threads(THREADS);
// Perform FFTs
QueryPerformanceCounter ( &li );
#pragma omp parallel
{
int ID = omp_get_thread_num();
#pragma omp for
for ( int i = 0; i < iterations; i++ )
{
fftwf_execute ( pFft[ID] );
}
}
QueryPerformanceCounter ( &li2 );
run = li2.QuadPart - li.QuadPart;
// Free Buffer / destroy plan
for ( int i = 0; i < THREADS; i++ )
{
fftwf_destroy_plan ( pFft[i] );
fftwf_free ( arr[i] );
}
printf ( "Plan creation time: %6.4f microseconds\n", (double)init / freq );
printf ( "FFT execution time: %6.4f microseconds\n", (double)run / freq / (double)iterations );
system( "pause" );
return EXIT_SUCCESS;
}
忘了添加,这是一个有点奇怪的设置,因为它被用来进行一些测量,这些测量模拟了一些代码,这些代码使用多个单线程FFTW计划,这些计划同时在不同的线程中使用,每个线程都在不同的数据集上运行。强制性问题:您使用的是什么编译器,你在运行优化版本吗?我正在使用MSVC2010和他们网站提供的FFTW DLL。这在关闭优化的调试模式和完全优化的发布模式下都会发生。您在每个循环迭代中花费了多少时间?调用fftwf_plan_dft_2d四次,然后执行fftwf_四次。如果你使用FFTW_,有智慧和没有智慧有什么区别?因为FFTW_患者并不是那么有耐心,384x384也不是那么大的FFT。您还计算了导入和导出智慧所需的时间,作为智慧计算时间的一部分。