- 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: Difference between revisions

From HLRS Platforms
Jump to navigationJump to search
No edit summary
Line 14: Line 14:
* gnu single and double precision
* gnu single and double precision


Unload the loaded modules and load the modules that you need. See [https://kb.hlrs.de/platforms/index.php/Module_command here] how to use the module environment.
=== Example ===
This example shows the basic steps when using fftw.  


Example in case of the intel double precision version:
Load the necessary module (example in case of the intel double precision version):
{{Command| command =<nowiki>module load compiler/gnu/4.4.3
{{Command| command =<nowiki>
module load compiler/gnu/4.4.3
module load compiler/intel/11.1
module load compiler/intel/11.1
module load mpi/openmpi/1.4.1-intel-11.1 (only if mpi programs are compiled)
module load mpi/openmpi/1.4.1-intel-11.1 (only if mpi programs are compiled)
module load unsupported-modules
module load numlib/fftw/3.2.2_double-openmpi-1.4.1-intel-11.1
module load numlib/fftw/3.2.2_double-openmpi-1.4.1-intel-11.1
</nowiki>
}}


#The command "module avail numlib" lists the available fftw modules. E.g.:
#numlib/fftw/3.2.2_double-openmpi-1.4.1-gnu-4.4.3
#numlib/fftw/3.2.2_double-openmpi-1.4.1-intel-11.1
#numlib/fftw/3.2.2_single-openmpi-1.4.1-gnu-4.4.3
#numlib/fftw/3.2.2_single-openmpi-1.4.1-intel-11.1
#Here you can see the version too of the intel and gnu compiler that you need to load in the module. </nowiki>
}}


=== Example ===
{{File|filename = ex1_fftw.c
{{File|filename = ex1_fftw.c
| content = <pre>
| content = <pre>
Line 97: Line 92:
Compile with:
Compile with:
{{Command| command = gcc ex1_fftw.c -o ex1 -I/$FFTW_HOME/include -L/$FFTW_HOME/lib -lfftw3
{{Command| command = gcc ex1_fftw.c -o ex1 -I/$FFTW_HOME/include -L/$FFTW_HOME/lib -lfftw3
(lfftw3f for single version)
(lfftw3f for single version)
}}
}}
Line 102: Line 98:


For the gnu fftw version you need the gnu version of the mpi module if mpi programs are compiled.
For the gnu fftw version you need the gnu version of the mpi module if mpi programs are compiled.
(e.g. mpi/openmpi/1.4.1-gnu-4.4.3)


For the single precision version all FFTW identifiers will begin with fftwf_ instead of fftw_.
For the single precision version all FFTW identifiers will begin with fftwf_ instead of fftw_.

Revision as of 16:04, 21 September 2012

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.
Fftw-logo.gif
Developer:
Platforms: NEC Nehalem Cluster
Category: Numerical Library
License: Open Source / GNU GPL
Website: FFTW Home Page


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

Example

This example shows the basic steps when using fftw.

Load the necessary module (example in case of the intel double precision version):

module load compiler/gnu/4.4.3 module load compiler/intel/11.1 module load mpi/openmpi/1.4.1-intel-11.1 (only if mpi programs are compiled) module load numlib/fftw/3.2.2_double-openmpi-1.4.1-intel-11.1


File: ex1_fftw.c
      /*
       * 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:

gcc ex1_fftw.c -o ex1 -I/$FFTW_HOME/include -L/$FFTW_HOME/lib -lfftw3 (lfftw3f for single version)

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.

For the single precision version all FFTW identifiers will begin with fftwf_ instead of fftw_.

See also

External links