FFTW 數學庫
官網地址:
下載地址:
http://www.fftw.org/download.html
目前最新版本爲
Version 3.3.6 is the latest stable release of FFTW ( 截止2017-04-30)
1.什麼是DFT?
DFT(Discrete Fourier Transform),即離散傅里葉變換,是傅里葉變換在時域和頻域上都呈離散的形式,將信號的時域採樣變換爲其DTFT的頻域採樣。
2.什麼是FFT?
FFT(Fast Fourier Transformation),即爲快速傅氏變換,是離散傅氏變換(DFT)的快速算法,它是根據離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。
3.什麼是FFTW?
FFTW ( the Faster Fourier Transform in the West)是一個快速計算離散傅里葉變換的標準C語言程序集,其由MIT的M.Frigo和S. Johnson開發。可計算一維或多維實和複數據以及任意規模的DFT。
4.FFTW庫所需的編譯環境
Intel Compiler /GNU Compiler + MPI Compiler (如果編譯mpi版的fftw)
5.安裝 Intel Compiler編譯器,設置編譯環境(如果使用intel的編譯器)
如果使用的是Intel的CPU,建議使用Intel的編譯器。
詳細安裝方法參見博客相關文章。
例如使用TH-1A的Intel 2013編譯器編譯lammps,可以加載如下環境變量:
source /opt/intel/composer_xe_2013.0.079/bin/iccvars.sh intel64
source /opt/intel/composer_xe_2013.0.079/bin/ifortvars.sh intel64
編譯並行版的程序需要並行編譯器,例如MPI並行的程序需要MPI編譯器,常用的MPI例如Intel MPI 、MPICH、OPENMPI等。
不同的機器可能針對自身硬件進行MPI優化,天河系統的MPI是基於開源MPICH進行的二次開發優化,進而支持性能卓越的天河自主高速互聯網絡。
詳細安裝方法參見博客相關文章。
例如使用TH-1A的Intel 2013編譯器編譯的mpich,可以加載如下環境變量:
export MPI_HOME=/usr/local/mpi-intel2013
export PATH=$MPI_HOME/bin:$PATH
export LD_LIBRARY_PATH=$MPI_HOME/lib:$LD_LIBRARY_PATH
7.默認編譯fftw-3.3.6
安裝fftw僅需要遵循常見的三步驟即可(configure+make+make install),在這裏先介紹一下默認安裝,再然着重介紹一些configure的配置選項。
以fftw-3.3.6-pl2.tar.gz爲例,先從官網下載該壓縮包。解壓縮,並進入源碼目錄進行編譯即可。
tar zxvf fftw-3.3.6-pl2.tar.gz
cd fftw-3.3.6-pl2
./configure
make
make install
這樣就可以把fftw庫按照默認配置,安裝到默認的路徑下。
使用的是GNU的編譯器,安裝到的是/usr/local下面。
8.優化編譯參數介紹
但是,我們通常會依據./configure -help得到的信息來添加一些參數來達到優化編譯的目錄。
接下來我們使用命令查看一些常用配置參數:
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX[/usr/local]
設定安裝目錄
Optional Features:
--enable-shared[=PKGS] build shared libraries [default=no]
是否編譯動態庫
--enable-static[=PKGS] build static libraries [default=yes]
是否編譯靜態庫
--enable-single compile fftw in single precision
--enable-float synonym for --enable-single
是否編譯單精度版本
--enable-sse enable SSE optimizations
--enable-sse2 enable SSE/SSE2 optimizations
--enable-avx enable AVX optimizations
--enable-avx2 enable AVX2 optimizations
--enable-neon enable ARM NEON optimizations
開啓針對特定機器架構的優化,這個取決於機器CPU(下面有介紹)。
--enable-fma enable optimizations for machineswith fused multiply-add
開啓積和熔加運算(Fused Multiply-Add/FMA)的優化
--enable-mpi compile FFTW MPI library
是否編譯mpi版的fftw庫
--enable-openmp use OpenMP directives for parallelism
是否使用OpenMP指令進行並行
--enable-threads compile FFTW SMP threads library
是否編譯FFTW SMP線程庫
Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
CPP C preprocessor
MPICC MPI C compiler command
F77 Fortran 77 compiler command
FFLAGS Fortran 77 compiler flags
這部分是指定編譯器及編譯參數,默認是用GNU的編譯器。
爲了用intel的編譯器,我們需要特別指定一下:CC=icc F77=ifort,相關的參數通常保持默認即可。
備註:
1)如何查看CPU是否支持某個指令集呢?使用如下命令可以列出支持的指令集名稱
cat /proc/cpuinfo | grep flags | uniq
2)SIMD
SIMD單指令流多數據流(SingleInstructionMultiple Data,SIMD)是一種採用一個控制器來控制多個處理器,同時對一組數據(又稱“數據向量”)中的每一個分別執行相同的操作從而實現空間上的並行性的技術。
MMX是由英特爾開發的一種SIMD多媒體指令集,SSE(Streaming SIMDExtensions)是MMX的擴充指令集,AVX(Advanced VectorExtensions)是Intel的SSE延伸架構,FMA(Fused MultiplyAccumulate)是Intel的AVX擴充指令集。
NEON實際上是ARM的SIMD(Single InstructionMultiple Data)技術的延續,它是一個結合64和128 bit的SIMD(Single InstructionMultiple Data 單指令多重數據)指令集。
9.優化編譯單雙精度版本的FFTW
tar zxvf fftw-3.3.3.tar.gz
cd fftw-3.3.3
# 單精度
./configure --prefix=$HOME/software/fftw/3.3.6-pl2-icc13 \
CC=icc F77=ifort \
--enable-shared --enable-static \
--enable-float \
--enable-sse --enable-sse2 \
--enable-avx --enable-avx2 --enable-fma \
--enable-mpi \
--enable-threads--enable-openmp
make
make install
# clean一下
make clean
# 雙精度
./configure --prefix=$HOME/software/fftw/3.3.6-pl2-icc13 \
CC=icc F77=ifort \
--enable-shared --enable-static \
--enable-sse2 --enable-avx --enable-avx2 --enable-fma \
--enable-mpi \
--enable-threads--enable-openmp
make
make install
歡迎交流!