通过FFTW Wrapper 使用 MKL DFT 函数

 提起FFT/DFT计算,我们会常常想起两个函数库:FFTW 与Intel MKL.  FFTW 提供一个广为流行关于FFT计算的函数接口。 现有的许多应用,就是基于了FFTW接口的调用。 而Intel MKL 是一个高度优化的数学计算函数。对于一些常用的计算函数,如矩阵运算,方程求解,随机数生成等, 它提供了高性能,对不同平台专门优化的代码。 Intel MKL 提供了一些FFT 计算的函数,但MKL函数接口与FFTW 有所区别。

我原有的程序调用了FFTW函数,如果想使用高效的MKL 的优化代码,除了改写原程序,使用 Intel MKL 的函数,还有没有其它更为方便的的办法呢?
所幸的是,在Intel MKL 中,提供一个针对FFTW接口的Wrapper.  通过这个Wrapper, 程序可以将FFTW函数调用,转化为Intel MKL 的函数调用。 这样,无需修改原程序,我们也能调用 MKL的DFT 计算函数。

我们看看一些具体的步骤:

首先,需要确定程序中FFTW接口的版本
Intel MKL提供针对FFTW 2.x and FFTW 3.x以及MPI FFTW相兼容的wrapper。 其Fortran 与 C 的接口在下面的目录下:
/interfaces/fftw2xc 
/interfaces/fftw2xf
/interfaces/fftw3xc
/interfaces/fftw3xf
/interfaces /fftw2x_cdft
/interfaces /fftw3x_cdft

其次,编译Wrapper 的代码
每个wrapper 的目录下都提供了Makefile, 在命令行下,运行编译命令。
如在Intel 64 平台的,使用Intel 编译器编译64位的双精度的接口函数,可以用下面的命令: 
    make libintel64 compiler=intel PRECISION= MKL_DOUBLE
编译完成后,将生成名如lib/intel64/libfftw2xc_intel.a 的Wrapper 库(其他编译器,生成的库函数名与此类似)。

最后,链接FFTW  Wrapper 库与Intel MKL函数
编译FFTW接口后, 我们需要将新生成的FFTW Wrapper 库,以及Intel DFT MKL库一起链接到应用中:
比如,下面的命令,使用Intel 编译器,在64位的平台上链接Intel MKL与FFTW 接口:
   icc -I MKLDIR/include/ -I MKLDIR/include/fftw/ testcode.c -L MKLDIR/lib/intel64/ -l libfftw2xc_intel -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core –liomp5 –lpthread

这样简单的三步,我们就可以将原调用FFTW程序改为Intel MKL 的函数。

 

 进步的参考资料:
Intel MKL 用户手册(参见 Appendix F: FFTW Interface to Intel® Math Kernel Library):/sites/products/documentation/hpc/mkl/mklman/index.htm

相关性能数据:http://www.intel.com/software/products/mkl/

Intel MKL 购买与测试:/en-us/articles/intel-mkl/

Tags:
For more complete information about compiler optimizations, see our Optimization Notice.