<< Chapter < Page | Chapter >> Page > |
This Chapter complements the mathematical perspective of Algorithms with a more focused view of the low level details that are relevant to efficient implementation on SIMD microprocessors. These techniques arewidely practised by today's state of the art implementations, and form the basis for more advanced techniques presented in later chapters.
Fast Fourier transforms (FFTs) can be succinctly expressed as microprocessor algorithms that are depth first recursive. Forexample, the Cooley-Tukey FFT divides a size N transform into two size N /2 transforms, which in turn are divided into size N /4 transforms. This recursion continues until the base case of two size 1transforms is reached, where the two smaller sub-transforms are then combined into a size 2 sub-transform, and then two completed size 2 transforms arecombined into a size 4 transform, and so on, until the size N transform is complete.
Computing the FFT with such a depth first traversal has an important advantage in terms of memory locality: at any point during the traversal, the two completedsub-transforms that compose a larger sub-transform will still be in the closest level of the memory hierarchy in which they fit (see, i.a., [link] and [link] ). In contrast, a breadth first traversal of a sufficiently large transform couldforce data out of cache during every pass (ibid.).
Many implementations of the FFT require a bit-reversal permutation of either the input or the output data, but a depth first recursive algorithm implicitlyperforms the permutation during recursion. The bit-reversal permutation is an expensive computation, and despite being the subject of hundreds of researchpapers over the years, it can easily account for a large fraction of the FFTs runtime – more so for the conjugate-pair algorithm with the rotatedbit-reversal permutation. Such permutations will be encountered in later sections, but for the mean time it should be noted that the algorithms inthis chapter do not require bit-reversal permutations – the input and output are in natural order.
IF
$N\phantom{\rule{3.33333pt}{0ex}}=\phantom{\rule{3.33333pt}{0ex}}1$ RETURN
${x}_{0}$ ELSE
${E}_{{k}_{2}=0,\cdots ,N/2-1}\phantom{\rule{3.33333pt}{0ex}}\leftarrow \phantom{\rule{3.33333pt}{0ex}}\mathtt{DITFFT}{\mathtt{2}}_{N/2}\left({x}_{2{n}_{2}}\right)$
${O}_{{k}_{2}=0,\cdots ,N/2-1}\phantom{\rule{3.33333pt}{0ex}}\leftarrow \phantom{\rule{3.33333pt}{0ex}}\mathtt{DITFFT}{\mathtt{2}}_{N/2}\left({x}_{2{n}_{2}+1}\right)$ FOR
$k=0$ to
$N/2-1$
${X}_{k}\phantom{\rule{3.33333pt}{0ex}}\leftarrow \phantom{\rule{3.33333pt}{0ex}}{E}_{k}\phantom{\rule{3.33333pt}{0ex}}+\phantom{\rule{3.33333pt}{0ex}}{\omega}_{N}^{k}\phantom{\rule{3.33333pt}{0ex}}{O}_{k}$
${X}_{k+N/2}\phantom{\rule{3.33333pt}{0ex}}\leftarrow \phantom{\rule{3.33333pt}{0ex}}{E}_{k}\phantom{\rule{3.33333pt}{0ex}}-\phantom{\rule{3.33333pt}{0ex}}{\omega}_{N}^{k}\phantom{\rule{3.33333pt}{0ex}}{O}_{k}$ END FOR
RETURN
${X}_{k}$ ENDIF
${\mathtt{DITFFT2}}_{N}\left({x}_{n}\right)$
A recursive depth first implementation of the Cooley-Tukey radix-2 decimation-in-time (DIT) FFT is described with pseudocode in [link] , and an implementation coded in C with only the most basic optimization – avoiding multiply operations where ${\omega}_{N}^{0}$ is unity in the first iteration of the loop – is included in Appendix 1 . Even when compiled with a state-of-the-art auto-vectorizing compiler, Intel(R) C Intel(R) 64 Compiler XE for applications running on Intel(R) 64, Version 12.1.0.038 Build 20110811. the code achieves poor performance on modern microprocessors, and is useful only asa baseline reference. Benchmark methods contains a full account of the benchmark methods.
Implementation | Machine | Runtime |
Danielson-Lanczos, 1942 [link] | Human | 140 minutes |
Cooley-Tukey, 1965 [link] | IBM 7094 | $\sim $ 10.5 ms |
Listing 1, Appendix 1 , 2011 | Macbook Air 4,2 | $\sim $ 440 $\mu $ s |
Notification Switch
Would you like to follow the 'Computing the fast fourier transform on simd microprocessors' conversation and receive update notifications?