Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 智慧不起作用_C++_C_Signal Processing_Fft_Fftw - Fatal编程技术网

C++ 智慧不起作用

C++ 智慧不起作用,c++,c,signal-processing,fft,fftw,C++,C,Signal Processing,Fft,Fftw,我试图利用FFTW的智慧功能更快地创建FFTW计划。智慧似乎正确地保存和加载,但它不会加快后续运行的创建。此外,如果我尝试使用WITHIST_ONLY标志创建计划,它将返回一个空计划,让我知道即使加载WITHIST的调用工作正常,也不能用于制定计划 如果我多次运行下面的代码,第一次它将无法加载WITHIST文件,因为它不存在,在后续的运行中,它将报告它已正确加载。在每次运行(第一次或后续运行)中,创建FFTW计划所需的时间相同 #include <Windows.h> #includ

我试图利用FFTW的智慧功能更快地创建FFTW计划。智慧似乎正确地保存和加载,但它不会加快后续运行的创建。此外,如果我尝试使用WITHIST_ONLY标志创建计划,它将返回一个空计划,让我知道即使加载WITHIST的调用工作正常,也不能用于制定计划

如果我多次运行下面的代码,第一次它将无法加载WITHIST文件,因为它不存在,在后续的运行中,它将报告它已正确加载。在每次运行(第一次或后续运行)中,创建FFTW计划所需的时间相同

#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。您还计算了导入和导出智慧所需的时间,作为智慧计算时间的一部分。