2016-09-29 105 views
1

我需要重複進行3d函數的傅里葉變換/逆傅里葉變換以求解微分方程。例如:非立體網格上的FFT速度

import pyfftw.interfaces.numpy_fft as fftw 
for i in range(largeNumber): 
    fFS = fftw.rfftn(f) 
    # Do stuff 
    f = fftw.irfftn(fFS) 

f的形狀非常非立體。是否有基於尺寸順序的性能差異,例如(512,32,128)與(512,128,32)等?

我正在尋找任何可用的加速ups。我已經嘗試過玩弄智慧。我認爲如果最大尺寸最後一個尺寸變得最大(例如32,128,512),所以fFS.shape =(32,128,257),但這似乎並不是這樣。

回答

0

如果您真的想擠出所有的性能,可以直接使用FFTW對象(最容易通過pyfftw.builders訪問)。通過這種方式,您可以仔細控制發生副本的情況以及歸一化是否在逆過程中執行。

您的代碼原樣可能會從使用緩存(通過調用pyfftw.interfaces.cache.enable()啓用)中受益,這會盡可能減少一般和安全情況下的設置時間,但不會消除它。

關於尺寸的最佳排列方式,您必須吮吸它並觀察。嘗試所有各種選項並查看最快的(使用timeit)。確保當你做測試時,你實際上是按照預期使用排列在內存中的數據,而不是僅僅考慮內存中的同一個數組(這可以很好地處理,而不需要拷貝 - 儘管這種調整參數的東西)。

FFTW嘗試很多不同的選項(不同的FFT算法在不同的FFT表示方式下)並選擇最快的方式,因此最終會出現非明顯的實現,這些實現可能會改變爲表面上非常相似的不同數據集。

一般提示:

  • 開啓多線程以獲得最佳性能(設置threads=N如適用)。
  • 請確保您的陣列適當地進行字節對齊 - 這與現代硬件相比具有較小的影響,但可能會有所作爲(特別是如果所有較高尺寸的字體都將字節對齊作爲因素)。
  • 閱讀tutorialapi docs