【问题标题】:FFTW - Fail to create a FFT plan when input is very largeFFTW - 当输入非常大时无法创建 FFT 计划
【发布时间】:2013-06-18 17:58:31
【问题描述】:

我想使用 FFTW 库计算自相关。当我的输入包含超过 18 亿个元素时,我无法创建计划。例如:

// my input 
size_t size = 1024UL * 1024 * 1024 * 2;
float * in = (float *) malloc(sizeof(float) * (size + 2));
assert(in);

// insert values in input... in[0] to in[size -1]

// I want to perform an inplace FFT (this should explains the "+2" in prev malloc)
fftwf_complex * out = (fftwf_complex *) in;

// create a real to complex FFT plan
p = fftwf_plan_dft_r2c_1d(size, in, out, FFTW_ESTIMATE);

// this assertion fails...
assert(p); 

一些信息:

  • Linux 64 位,64GB 物理内存 + 64GB 交换
  • FFTW 3.3.3 --enable-float
  • 使用大约 18 亿个元素,之前的代码可以工作,并且在计算过程中使用了大约 10-12GB 的 RAM(输入 + 一些 FFTW 临时数据???)
  • 我也尝试过不适当或复杂到复杂的 FFT
  • sizeof(size_t) == 8, sizeof(float) == 4, sizeof(fftwf_complex) == 8

我的代码有什么问题?使用 FFTW 时输入大小有上限吗?

【问题讨论】:

    标签: c fftw


    【解决方案1】:

    来自

    http://www.fftw.org/doc/Real_002ddata-DFTs.html

     fftw_plan fftw_plan_dft_r2c_1d(int n0,
                                    double *in, fftw_complex *out,
                                    unsigned flags);
    

    fftw_plan_dft_r2c_1d 的第一个参数的类型似乎是int 而不是size_t。由于您的size 值很大并且看起来大于INT_MAX,因此您很可能将负值传递给您的函数。

    【讨论】:

    • 你是对的。谢谢你。有没有办法使用 FFTW 输入超过 INT_MAX 个元素?
    • 我在同一条船上,您找到解决方案了吗?
    • @Valmond 我意识到这有点晚了,但是是的,FFTW 确实提供了对 64 位数组的支持。查看 FFTW 手册中的 guru64 接口。
    猜你喜欢
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2020-09-26
    • 2013-02-24
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多