- Infos im HLRS Wiki sind nicht rechtsverbindlich und ohne Gewähr -
- Information contained in the HLRS Wiki is not legally binding and HLRS is not responsible for any damages that might result from its use -
FFTW
FFTW (Fastest Fourier Transform in the West) is a free collection of fast C routines for computing the Discrete Fourier Transform in one or more dimensions. It includes complex, real, symmetric and parallel transforms and can handle arbitrary array sizes efficiently. FFTW is typically faster than other publically-available FFT implementations and is even competitive with vendor-tuned libraries. |
|
Using FFTW on Nehalem cluster:
There are four versions of FFTW instaled on Nehalem cluster:
- intel single and double precision
- gnu single and double precision
Unload the loaded modules and load the needed modules. See the [[1] Module command] to use the module environment. Example in case of the intel double precision version:
Example
/* * fft.c: compute FFT and IFFT from an array */ #include <stdio.h> #include <fftw3.h> #define SIZE 4 int main( int argc, char** argv ) { double input[SIZE] = { 1.0, 1.0, 1.0, 1.0 }; fftw_complex *data, *fft_result, *ifft_result; fftw_plan plan_forward, plan_backward; int i; data = ( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * SIZE ); fft_result = ( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * SIZE ); ifft_result = ( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * SIZE ); plan_forward = fftw_plan_dft_1d( SIZE, data, fft_result, FFTW_FORWARD, FFTW_ESTIMATE ); plan_backward = fftw_plan_dft_1d( SIZE, fft_result, ifft_result, FFTW_BACKWARD, FFTW_ESTIMATE ); /* populate input data */ for( i = 0 ; i < SIZE ; i++ ) { data[i][0] = input[i]; data[i][1] = 0.0; } /* print initial data */ for( i = 0 ; i < SIZE ; i++ ) { fprintf( stdout, "data[%d] = { %2.2f, %2.2f }\n", i, data[i][0], data[i][1] ); } fftw_execute( plan_forward ); /* print fft result */ for( i = 0 ; i < SIZE ; i++ ) { fprintf( stdout, "fft_result[%d] = { %2.2f, %2.2f }\n", i, fft_result[i][0], fft_result[i][1] ); } fftw_execute( plan_backward ); /* print ifft result */ for( i = 0 ; i < SIZE ; i++ ) { fprintf( stdout, "ifft_result[%d] = { %2.2f, %2.2f }\n", i, ifft_result[i][0] / SIZE, ifft_result[i][1] / SIZE ); } /* free memory */ fftw_destroy_plan( plan_forward ); fftw_destroy_plan( plan_backward ); fftw_free( data ); fftw_free( fft_result ); fftw_free( ifft_result ); return 0; }
Compile with:
The shell variable $FFTW_HOME is available after loading the required modules.
For the gnu fftw version you need the gnu version of the mpi module if mpi programs are compiled: mpi/openmpi/1.4.1-gnu-4.4.3
For the single precision version all FFTW identifiers will begin with fftwf_ instead of fftw_.