Linux下Intel编译器oneAPI安装和链接MKL库编译
Linux下安装oneAPI
很多时候再Windows下使用VStudio+ivf+mkl进行编译的程序,在Linux下使用会遇到一些问题,这是因为linux下默认的gcc、g++还有gfortran都是开源编译器,与Intel的编译器icc、icpc和ifort所编译的方式不同,因此采用VStudio+ivf+mkl库所写的程序会在linux下无法直接编译,特别是程序中使用了MKL的相关函数情况下,就更需要安装oneAPI,安装教程参考:Linux下安装Intel oneAPI.
具体操作方式如下:
下载Toolkit
访问Intel官方网站,搜索toolkit,或者点击 Intel toolkit 访问,在该页面下方有不同的toolkit,注意不支持Fortran77.
我们主要采用的是Base toolkit和HPC toolkit,其中如上图所示,不同的包里面有不同的工具,Base主要包含一些数学库,HPC包含C/C++和Fortran的编译器。
下载离线安装包
点击上述的Download,下载库文件,官方推荐下载离线目录,并且还提供下载教程
Base toolkit离线安装包大概有3G,HPC toolkit离线安装包大概有1G.
开始安装
下载完成之后,开始安装,首先按照官方教程安装Base toolkit
sudo sh ./l_BaseKit_p_xxxxx_offline.sh #加sudo为所有用户安装,不加则为当前用户安装
输入之后会弹出图形界面,按照图形界面的指示进行安装即可,默认安装路径是
/opt/intel/oneapi/
同样的,HPC toolkit的安装方式也一样
sudo sh ./l_HPCKit_pxxxxx_offline.sh #加sudo为所有用户安装,不加则为当前用户安装
初始化环境
上述安装完成之后,Intel的oneapi环境并没有启动,此时输入icc、icpc或者ifort都弹出没有该命令,因此需要初始化oneAPI环境,采用命令
- 手动初始化
. /opt/intel/oneapi/setvars.sh
此时终端弹出初始化输出结果
此时再在终端输入
icc --version
即可看到icc所对应的版本,表明在该终端下,oneapi环境已经启动。
- 自动初始化
也可以将初始化命令放到.bashrc文件中,这样每一次启动终端,就会自动初始化环境
在.bashrc
中添加
#for oneapi
source /opt/intel/oneapi/setvars.sh
或者在.bashrc
中设置alias,然后在终端输入oneapi
即可启动环境
alias oneapi='source /opt/intel/oneapi/setvars.sh'
但是需要注意,oneapi中带有Intel python环境,每次初始化用,之前安装的anaconda环境会被自动取代,如果初始化之后输入conda init 则.bashrc文件中conda环境路径也会给成Intel环境的路径,注意备份好.bashrc文件,因此本人目前还是在终端输入指令启动环境
注释,这个环境替代问题在最新版本似乎已经没有了
可能遇到的问题
(来自参考链接)
一般来说运行安装脚本几十秒后即可启动安装界面。若有读者运行安装脚本超过3 min仍无反应,屏幕上只有Extract xxxxxxxx completed!字样,而未切换至安装界面,那么可以按键盘组合键Ctrl+C中断安装。然后改用完全静默安装模式
sudo sh ./l_HPCKit_p_2021.2.0.2997_offline.sh -s -a --silent --eula accept
在安装MKL库时若有同样问题,可同样执行
sudo sh ./l_onemkl_p_2021.2.0.296_offline.sh -s -a --silent --eula accept
这样也是默认安装进/opt/intel/。
编译问题
链接MKL库
如上所述,当采用MKL编写程序时,在编译时,编译器必须采用icc( C )、icpc(C++)、ifort(fortran),在编译时,需要给定指令-qmkl,进行链接mkl库编译,例如
icc -qmkl main.c -o main.out #对于c
icpc -qmkl main.cpp -o main.out #对于c++
ifort -qmkl main.f90 -o main.out #对于Fortran
Fortran的双精度编译
在采用ifort编译时,Intel的Fortran编译器默认采用的是单精度编译,例如程序中的real,默认给定的是单精度编译,一次需要加上opt控制指令进行双精度编译,如
ifort -r8 -qmkl main.f90 -o main.out #实现双精度编译
找不到icc如何处理
根据oneapi官网的更新公告, icc,icpc在2023.2月之后的版本被废弃,取而代之的是icx,官网截图如下。推荐用户根据更新公告中的内容做出相应的修改。
Intel-oneapi提供了一个官方的社区,在该链接 下点击Gethelp,即可找到对应的社区,如图所示,用户可以在该链接下搜索自己所遇到的问题。