FFTW3 е C библиотека за реализация на дискретна Фурие-трансформация (DFT). Този документ показва как тази библиотека да бъде компилирана и инсталирана с GNU Compilers, ако това е нужно за даден проект и вградния в дистрибуцията пакет fftw не покрива нужните изисквания. Няма смисъл тази компилация да бъде извършвана с Intel Compilers, доколкото вградената в пакета с компилаторите MKL (Math Kernel Library) предлага fftw библиотека. Въпреки това, за пълнота, този случай е представен в документацията по-долу.
Изходният код на библиотеката може да бъде изтеглен от страницата на проекта:
https://github.com/FFTW/fftw3/releases
Препоръчително е да изтеглите и компилирате последната стабилна версия на кода на проекта. За примера тук се предполага, че това е 3.0.5. По времето, по което вие посетите страницата на проекта, там може да има по-нова стабилна версия. Изтеглянето и разпакетирането на кода може да стнане по следния начин:
$ mkdir ~/build
$ cd ~/build
$ wget https://github.com/FFTW/fftw3/archive/fftw-3.3.7.tar.gz -O fftw3-fftw-3.3.7.tar.gz
$ tar xvf fftw3-fftw-3.3.7.tar.gz
Влезте в новосъздадената при разпакетирането директория:
$ cd ~/build/fftw3-fftw-3.3.7
$ mkdir build
$ cd build
Конфигурирането на компилационния процес за създаването на динамичните библиотеки за свързване трябва да стане по начин, по-който едновремено да бъдат компилирани OpenMP и GNU Threads библиотеките на fftw3 (забележете наличието на -DENABLE_OPENMP=ON -DENABLE_THREADS=ON
):
-
с използването на GNU Compilers:
$ cmake .. -DENABLE_AVX2=ON -DENABLE_FLOAT=ON -DENABLE_LONG_DOUBLE=ON -DENABLE_OPENMP=ON -DENABLE_THREADS=ON -DBUILD_TESTS=NO -DCMAKE_INSTALL_PREFIX=/usr/unite/fftw3-3.3.7-gnu
-
с използването на Intel Compilers:
$ CC=icc CFLAGS=-xHost cmake .. -DENABLE_AVX2=ON -DENABLE_FLOAT=ON -DENABLE_LONG_DOUBLE=ON -DENABLE_OPENMP=ON -DENABLE_THREADS=ON -DBUILD_TESTS=NO -DCMAKE_INSTALL_PREFIX=/usr/unite/fftw3-3.3.7-intel
-
с използването на PGI Compilers:
$ CC=pgcc CFLAGS=-fast cmake .. -DENABLE_AVX2=ON -DENABLE_FLOAT=ON -DENABLE_LONG_DOUBLE=ON -DENABLE_OPENMP=ON -DENABLE_THREADS=ON -DBUILD_TESTS=NO -DCMAKE_INSTALL_PREFIX=/usr/unite/fftw3-3.3.7-pgi
След като процесът на конфигуриране завърши успешно, може да пристъпите към компилиране и инсталиране:
$ make -j6
$ make install
Трябва да повторите същия процес и за да компилирате статичните библиотеки:
-
с използването на GNU Compilers:
$ cmake .. -DENABLE_AVX2=ON -DBUILD_SHARED_LIBS=NO -DENABLE_FLOAT=ON -DENABLE_LONG_DOUBLE=ON -DENABLE_OPENMP=ON -DENABLE_THREADS=ON -DBUILD_TESTS=NO -DCMAKE_INSTALL_PREFIX=/usr/unite/fftw3-3.3.7-gnu
-
с използването на Intel Compilers:
$ CC=icc CFLAGS=-xHost cmake .. -DBUILD_SHARED_LIBS=NO -DENABLE_AVX2=ON -DENABLE_FLOAT=ON -DENABLE_LONG_DOUBLE=ON -DENABLE_OPENMP=ON -DENABLE_THREADS=ON -DBUILD_TESTS=NO -DCMAKE_INSTALL_PREFIX=/usr/unite/fftw3-3.3.7-intel
-
с използването на PGI Compilers:
$ CC=pgcc CFLAGS=-fast cmake .. -DBUILD_SHARED_LIBS=NO -DENABLE_AVX2=ON -DENABLE_FLOAT=ON -DENABLE_LONG_DOUBLE=ON -DENABLE_OPENMP=ON -DENABLE_THREADS=ON -DBUILD_TESTS=NO -DCMAKE_INSTALL_PREFIX=/usr/unite/fftw3-3.3.7-pgi
След като процесът на конфигуриране завърши успешно, може да пристъпите към компилиране и инсталиране:
$ make -j6
$ make install
Компилиране на код и свързването му с динамично свързаните fftw3 библиотеки (с използване на OpenMP):
-
с използването на GNU Compilers:
$ gcc -I/usr/unite/fftw3-3.3.7-intel/include -c file.c -o file.o
$ gcc -L/usr/unite/fftw3-3.3.7-gnu/lib64 -lfftw3l_omp -lfftw3l -o file file.o
-
с използването на Intel Compilers:
$ icc -I/usr/unite/fftw3-3.3.7-intel/include -c file.c -o file.o
$ icc -L/usr/unite/fftw3-3.3.7-intel/lib64 -lfftw3l_omp -lfftw3l -o file file.o
-
с използването на PGI Compilers:
$ pgcc -I/usr/unite/fftw3-3.3.7-intel/include -c file.c -o file.o
$ pgcc -L/usr/unite/fftw3-3.3.7-pgi/lib64 -lfftw3l_omp -lfftw3l -o file file.o
При изпълнението на код трябва да укажете пътя до библиотеките (с използване на OpenMP), например:
-
с използването на GNU Compilers:
$ LD_LIBRARY_PATH=/usr/unite/fftw3-3.3.7-gnu/lib64:$LD_LIBRARY_PATH ./file
-
с използването на Intel Compilers:
$ LD_LIBRARY_PATH=/usr/unite/fftw3-3.3.7-intel/lib64:$LD_LIBRARY_PATH ./file
-
с използването на PGI Compilers:
$ LD_LIBRARY_PATH=/usr/unite/fftw3-3.3.7-pgi/lib64:$LD_LIBRARY_PATH ./file
Компилиране на код и свързването му със статично свързаните fftw3 библиотеки (с използване на OpenMP):
-
с използването на GNU Compilers:
$ gcc -I/usr/unite/fftw3-3.3.7-gnu/include -c file.c -o file.o
$ gcc -o file file.o /usr/unite/fftw3-3.3.7-gnu/lib64/libfftw3l.a /usr/unite/fftw3-3.3.7-gnu/lib64/libfftw3l_omp.a
-
с използването на Intel Compilers:
$ icc -I/usr/unite/fftw3-3.3.7-intel/include -c file.c -o file.o
$ icc -o file file.o /usr/unite/fftw3-3.3.7-intel/lib64/libfftw3l.a /usr/unite/fftw3-3.3.7-intel/lib64/libfftw3l_omp.a
-
с използването на PGI Compilers:
$ pgcc -I/usr/unite/fftw3-3.3.7-pgi/include -c file.c -o file.o
$ pgcc -o file file.o /usr/unite/fftw3-3.3.7-pgi/lib64/libfftw3l.a /usr/unite/fftw3-3.3.7-pgi/lib64/libfftw3l_omp.a