Intel MKL FFTW接口函数的配置和调用
一、Intel MKL库和oneAPI HPC Toolkit的安装
Intel MKL的安装相对简单,网上的教程可以随便找到。一如既往,为减轻各位奋战在各种环境配置的道路上的朋友的痛苦,这里给出一个相对而言比较简单的方法的链接: CFDer工作站配置之OneAPI(现只在Ubuntu
系统上测试通过)。
注意:现在MKL库已经集合到
OneAPI
里面。
二、Intel MKL FFTW接口函数的配置
安装好MKL库后,FFTW
接口函数并没有自动配置好,需要进一步手动配置。下面是配置步骤:
- 确定
FFTW
接口版本。
Intel MKL 支持 FFTW 2.x 与 3.x 的 Fortran 与 C 的接口。相应的接口分别在下面的目录下:
/opt/intel/oneapi/mkl/xxxx.x.x/interfaces/fftw2xc
/opt/intel/oneapi/mkl/xxxx.x.x/interfaces/fftw2xf
/opt/intel/oneapi/mkl/xxxx.x.x/interfaces/fftw3xc
/opt/intel/oneapi/mkl/xxxx.x.x/interfaces/fftw3xf
注意上面的xxxx.x.x
是自己安装MKL的版本号,如/opt/intel/oneapi/mkl/2022.1.0/interfaces/fftw2xf
。
- 创建接口函数
下面是一个用Intel Compiler中的mpicc
编译器,在Ubuntu 22.04 LTS
平台上创建一个FFT2.x Fortran接口的例子:
cd /opt/intel/oneapi/mkl/2022.1.0/interfaces/fftw2xf
vim makefile
CC = mpicc # 修改makefile中的93行中CC为Intel C编译器中的任意一种,如果你的系统本来就有icc,这一行不需要修改,修改后保存退出makefile
sudo make libintel64 PRECISION=MKL_SINGLE
编译成功后,FFTW接口函数存储在文件libfftw2xf_single_intel.a
中,该文件只是Intel编译器 FFTW2.x Fortran接口,位于路径/opt/intel/oneapi/mkl/2022.1.0/lib/intel64
中。
注意:上面
CC = mpicc
是在makefile文件中修改的,其他的在Linux终端输入。如果你的系统本来就有icc
,这一行不需要修改。mpicc
编译器在安装好oneAPI HPC Toolkit
包后就可以使用,请参考上面给出的链接:CFDer工作站配置之OneAPI。此外,sudo make libintel64 PRECISION=MKL_SINGLE
在makefile中有说明,请查看。
三、Intel MKL FFTW接口函数的调用
配置好Intel MKL FFTW的接口函数后,就可以快乐地使用FFTW的内容了。给出链接程序时,只需要链接FFTW接口函数与Intel DFT MKL函数。下面是在Ubuntu 22.04 LTS
的平台上,使用Intel Compiler的一个例子:
ifort -I/opt/intel/oneapi/mkl/2022.1.0/include/ -I/opt/intel/oneapi/mkl/2022.1.0/include/fftw/ mycode.f -L/opt/intel/oneapi/mkl/2022.1.0/lib/intel64/ -lfftw2xf_single_intel -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread
或者在多个文件的项目中的makefile中使用也可以:
FC = mpiifort
FLINKER = mpiifort
OPTFLAGS = -w -mcmodel=large -i-dynamic
WARNFLAGS = -w
mklinc = /opt/intel/oneapi/mkl/2022.1.0/include
mklinc_fftw = $(mklinc)/fftw
mkllib = /opt/intel/oneapi/mkl/2022.1.0/lib/intel64
FCCFLAG= -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread
FFLAGS = $(OPTFLAGS)
EXECS = parpost
default: $(EXECS)
$(EXECS): *.o
$(FLINKER) $(OPTFLAGS) -DMKL_SINGLE -I$(mklinc) -I$(mklinc_fftw) *.F90 -L$(mkllib) -lfftw2xf_single_intel $(FCCFLAG) -o $(EXECS)
*.o: *.F90
$(FC) $(FFLAGS) -c *.F90
clean:
rm -f *.o