【问题标题】:FFTW exports wisdom file but cannot load itFFTW 导出智慧文件但无法加载
【发布时间】:2015-06-30 11:59:00
【问题描述】:

我正在努力为 FFTW 操作实现更好的性能。出于这个原因,我决定使用智慧文件来创建计划,但问题是它无法从智慧文件中加载计划(导出智慧效果很好)。我试图将智慧导出到一个文件中,并在下一个程序运行时将其加载回智慧文件,但该函数总是为任何文件名返回 0(即使对于不存在的文件名)。我也尝试过从字符串加载,但它也不起作用。

这里似乎提出了类似的问题,但没有一个问题得到回答,或者问题出在其他地方。 那么这是图书馆的错误,还是我做错了什么?

编辑 仅用于演示并查看导出功能是否真的有效: 下面的代码展示了使用文件从字符串中加载智慧进行内容导入的操作(仅表明该内容在文件中可用):

FILE * pfile;
vector<char> buffer;
pfile=fopen("WisdomFile.txt","r");

if(pfile==0)
    cout<<"Could not open file"<<endl;
else
    cout<<"Could open file successfully"<<endl;

long length;

if(pfile)
{
    fseek(pfile,0,SEEK_END);
    length=ftell(pfile);
    fseek(pfile,0,SEEK_SET);
    buffer.assign(length+1,'\0'); //allocate space with the same length as the file
    int n=fread(&buffer[0],1,length,pfile); //read whole file to the buffer
    assert(n==length);
    fclose(pfile);
}
string show_wisdom(buffer);
cout<<show_wisdom<<endl;    //content could be read

int ret=fftwf_import_wisdom_from_string(reinterpret_cast<const char*>(&buffer[0])); // returns 0 for every filename
buffer.clear();
//... further FFTW code trying to use `FFTW_PATIENT | FFTW_USE_WISDOM_ONLY` ->but never uses the wisdom file

输出如下:

    (fftw-3.3.4 fftwf_wisdom #xbedb7e38 #x1ac524dc #x7a69378e #x21629161
  (fftwf_codelet_t2_8 3 #x11048 #x11048 #x0 #xa75017ef #xb6eb4747 #x4bef8a59 #xb03d9427)
  (fftwf_dft_thr_vrank_geq1_register 1 #x11048 #x11048 #x0 #x27a0c32d #x4e3441f9 #xb3fb3f2d #x90ae8374)
  (fftwf_dft_vrank_geq1_register 0 #x11048 #x11048 #x0 #x9be02645 #x53c7643d #xf6cf9608 #xed5460b7)
  (fftwf_dft_r2hc_register 0 #x11048 #x11048 #x0 #x52a71bc4 #x3c83e70d #x942dd977 #xf047f7e9)
  (fftwf_codelet_n1_64 0 #x11448 #x11448 #x0 #x11559ac4 #xea86db86 #xad6ae8e4 #x97f477c6)
  (fftwf_codelet_t1_16 0 #x11048 #x11048 #x0 #x8811820f #xea00b698 #x861ae7ed #x109ec45a)
  (fftwf_rdft_rank0_register 2 #x11048 #x11048 #x0 #x0095ff64 #x86e47338 #x76e9cf55 #x6cde6434)
  (fftwf_codelet_t1_16 1 #x11048 #x11048 #x0 #x29eda2bf #x97038fb2 #x0eddb089 #xafc2b57e)
  (fftwf_dft_indirect_register 0 #x11048 #x11048 #x0 #x1bea55f5 #x48417896 #x04bc4c58 #x571ce0b9)
  (fftwf_dft_thr_vrank_geq1_register 0 #x11048 #x11048 #x0 #x7b53c8cd #xda17faa2 #x220c1322 #x7c207bbd)
)

因此,如上所示,导出功能似乎可以工作,但按照 FFTW 教程中所示导入它似乎没有效果(程序仍然尝试使用 FFTW_PATIENT 选项创建一个新计划,大约需要 5 分钟。

【问题讨论】:

  • @JoachimPileborg 抱歉,我发布了一个半编辑的代码(我已经按照你提到的那样使用了它,但是在 eclipse 允许的情况下“撤消”了很多次)
  • buffervector&lt;char&gt; 还是 char*?如果向量在尝试使用free(buffer) 时无法编译此代码。您应该使用buffer.clear() 来清除其内容,并且您可能希望在调用fftwf_import_wisdom_from_string 之后 执行此操作。
  • @SleuthEye 对不起,我的软弱。我希望这次我可以分别解释正确地改进我的问题。缓冲区的类型是vector&lt;char&gt;。它只是一个演示代码,用于显示导出功能有效。但是导入好像没有效果,因为程序还在尝试创建新的计划
  • 没人知道吗?

标签: c++ file import signal-processing fftw


【解决方案1】:

我一直遇到这个问题,直到我注意到我正在使用函数 void fftw_set_timelimit(double seconds) 来限制总计划创建时间。在此时间限制下生成的智慧无法加载,而在禁用时间限制的情况下生成的智慧可以加载。即使没有超过时间限制,似乎也是如此。

由于您的代码已经过编辑,我不确定这是否适用于您的具体问题,但其他人可能会觉得这很有用。

【讨论】:

    【解决方案2】:

    根据FFTW's documentation

    只要规划标志不比创建智慧的标志更“耐心”,智慧就会自动用于任何适用的规模。

    换句话说,如果您想为使用FFTW_PATIENT 标志创建的计划导入智慧,那么必须已经为使用FFTW_PATIENTFFTW_EXHAUSTIVE 标志创建的具有相同大小的计划导出智慧.

    接下来的顺序是首先提前制定计划并通过以下方式输出智慧:

    // Might as well use FFTW_EXHAUSTIVE if we can afford it ahead of time
    fftw_plan plan = fftw_plan_dft_r2c_1d(N, in, out, FFTW_EXHAUSTIVE);
    fftw_export_wisdom_to_filename("WisdomFile.txt");
    

    最后,导出的智慧可以导入和使用:

    if (!fftw_import_wisdom_from_filename("WisdomFile.txt"))
    {
      std::cout << "Warning: could not import wisdom file" << std::endl;
    }
    // plan can now be created with any flags less or equal to 
    // FFTW_EXHAUSTIVE used for the exported wisdom.
    fftw_plan plan = fftw_plan_dft_r2c_1d(N, in, out, FFTW_PATIENT);
    

    【讨论】:

    • 还是不能解决问题。因为我已经用FFT_PATIENT 导出了一个计划,并分别用FFTW_PATIENTFFTW_PATIENT | FFTW_USE_WISDOM_ONLY 创建了计划。但我会尝试为FFTW_EXHAUSTIVE 导出智慧文件并将其用于FFTW_PATIENT 的计划。我认为这可能是我的 FFTW 版本中的一个错误,所以我也会尝试使用更新的版本
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多