2013-06-18 63 views
2

我想使用FFTW庫來計算自相關。當我的輸入超過〜1800mln元素時,我無法創建一個計劃。例如:FFTW - 輸入非常大時無法創建FFT計劃

// 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); 

一些信息:

  • 64位的Linux與64GB的物理RAM + 64GB交換
  • FFTW 3.3.3 --enable-浮動
  • 用〜1800mln元素前面的代碼工作並在計算過程中使用大約10-12GB的RAM(輸入+一些FFTW溫度數據)
  • 我也嘗試過不適用或複雜到複雜的FFT
  • sizeof(size_t)== 8,sizeof(float)== 4,sizeof(fftwf_complex)== 8

我的代碼出了什麼問題?使用FFTW時,輸入大小是否有上限?

回答

4

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更大,因此您可能會將負值傳遞給您的函數。

+1

你說得對。謝謝。有什麼辦法可以將FFTW用於超過INT_MAX元素的輸入? – ercoppa

+0

我在同一條船上,你找到了解決方案嗎? – Valmond