Ada : la bibliothèque FFTW

Description

FFTW est une bibliothèque de FFT 1D, 2D et 3D scalaire et parallèle.

Versions installées

  • FFTW 2.1.5
  • FFTW 3.2.2
  • FFTW 3.3.2
  • FFTW 3.3.3 (version par défaut)
  • FFTW 3.3.5

Caractéristiques

  • la version 2.1.5 est parallélisée MPI; elle est aussi monoprocesseur et multithreadée.
    Attention : cette ancienne version (plus de 10 ans) n'est PAS compatible avec les versions suivantes.
  • la version 3.3.2 est parallélisée MPI et multithreadée.
  • les versions 3.3.x sont parallélisées MPI et multithreadées. De plus, elles intègrent une nouvelle interface Fortran 2003.

Utilisation

La commande module permet d'accéder aux différentes versions. Pour utiliser la version par défaut, il suffit de taper :

$ module load fftw
$ mpiifort appel_fftw.f90

Pour compiler avec une version spécifique :

$ module load fftw/3.3.3
$ mpiifort appel_fftw.f90

Exemple

fftw_1d_f2003.f90
module FFTW3
  use, intrinsic :: iso_c_binding
  include 'fftw3.f03'
end module FFTW3
 
program fftw_1d
 
  use FFTW3
  implicit none
  integer(kind=C_INT), parameter  :: n = 16
  complex(kind=C_DOUBLE_COMPLEX), dimension(n)  :: in, out
  type(C_PTR) :: p, p2
  integer i,j
  real fact
 
  do i=1,N
     j=i-1
     in(i)=cmplx(j*j,1)
  enddo
 
  write(*,*)"create plans"
 
  p  = fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE)
  p2 = fftw_plan_dft_1d(N,in,out,FFTW_BACKWARD,FFTW_ESTIMATE)
 
  write(*,*)"do it"
 
  call fftw_execute_dft(p, in, out)
  do i=1,N
     write(*,"(f12.4,1x,f12.4)")out(i)
  enddo
 
  write(*,*)
  write(*,*)"undo it"
 
  call fftw_execute_dft(p2, out,in)
  fact=1.0/N
  do i=1,N
     write(*,"(f10.2,1x,f10.2)")in(i)*fact
  enddo
 
  write(*,*)"clean up"
  call fftw_destroy_plan(p)
  call fftw_destroy_plan(p2)
 
end program fftw_1d
$ module load fftw
$ ifort fftw_1d_f2003.f90
$ ./a.out

Remarques

  • Le type fftw_plan figurant dans les arguments d'appel des routines correspond à une adresse C; ce type doit être explicitement codé en Fortran INTEGER(kind=8) ou plus rigoureusement type(C_PTR) en utilisant l'interface Fortran 2003 comme dans l'exemple ci-dessus.
  • Les FFTW sont aussi accessibles dans la bibliothèque intel MKL sans changement du code source. Par contre certaines fonctionnalités sont manquantes. Pour en savoir plus nous vous conseillons de consulter la documentation INTEL Appendix E: FFTW Interface to Intel® Math Kernel Library.
  • Si les bibliothèques MKL et FFTW sont chargées ensemble, l'ordre du chargement des bibliothèques MKL et FFTW est donc important. Il faut s'assurer dans un premier temps, lors d'un portage par exemple, que les appels à FFTW sont bien résolus par la bibliothèque FFTW. Si le chargement est fait par module, il faut s'assurer que FFTW a été chargé après MKL. Ce qui est le cas ci-dessous (LAPACK fait partie de la MKL) :
 $ module list
 Currently Loaded Modulefiles:
   1) lapack/intel   2) fftw/3.3.2

Dans un second temps on pourra s'intéresser aux performances en résolvant les appels FFTW par la bibliothèque MKL.

Documentation