Intel MKL (Math Kernel Library)是Intel公司开发的数学函数库,其提供了一系列用于数值计算的Fortran和C语言接口,用户通过调用MKL可以高效并行地完成矩阵乘法,线性方程组求解,FFT快速傅里叶变换等工作。MKL库具有优秀的计算性能,在笔者常用的线性方程组的求解上,MKL库的计算效率甚至能够超过matlab,从计算效率上来说,和全世界范围内各种数值计算库相比,MKL基本上也处于第一梯队。
Intel MKL主要包含如下内容:
(1)基本线性代数子系统库(BLAS, level 1, 2, 3)和线性代数库(LAPACK):提供向量、向量-矩阵、矩阵-矩阵操作。
(2)ScaLAPACK分布式线性代数库:含基础线性代数通信子程序(Basic Linear Algebra Communications Subprograms, BLACS)和并行基础线性代数子程序(Parallel Basic Linear Algebra Subprograms, PBLAS)
(3)PARDISO直接离散算子:一种迭代离散算子,支持用于求解方程的离散系统的离散BLAS (level 1, 2, and 3)子函数,并提供可用于集群系统的分布式版本的PARDISO。
(4)快速傅立叶变换方程(Fast Fourier transform, FFT):支持1、2或3维,支持混合基数(不局限与2的次方),并有分布式版本。
(5)向量数学库(Vector Math Library, VML):提供针对向量优化的数学操作。
(6)向量统计库(Vector Statistical Library, VSL):提供高性能的向量化随机数生成算子,可用于一些几率分布、剪辑和相关例程和汇总统计功能。
(7)数据拟合库(Data Fitting Library):提供基于样条函数逼近、函数的导数和积分,及搜索。
(8)扩展本征解算子(Extended Eigensolver):基于FEAST的本征值解算子的共享内存版本的本征解算子。
MKL库的使用通常通过C接口或者Fortran接口进行,而针对Fortran接口,又包含F77接口和F95接口。一般情况下,F95接口所需要的参数更少,更易使用,F77接口更传统全面,对于某些函数,MKL不提供F95接口。本文主要介绍如何使用F95接口。
(一)安装
一般情况下,在VS IVF或者VS oneAPI平台下MKL库不需要单独安装,安装好VS oneAPI后就已经包含了MKL库,关于VS oneAPI的安装步骤,可参考b站up主地球屋里老师的视频:https://www.bilibili.com/video/BV1oh411o7AT/?spm_id_from=333.999.0.0
(二)使用
2.1 创建fortran项目,添加.f90源代码文件。
本文用于演示的源代码文件如下:
program Console1_mkl95
use blas95
implicit none
integer,parameter::n=100
real(kind=8)::a(n),sum1,res
integer::i
do i=1,n
a(i)=i
enddo
sum1=asum(a)
write(*,*)"sum",sum1
res=dot(a,a)
write(*,*)"res",res
end program Console1_mkl95
关于F95接口函数的具体使用,可参考MKL文档进行:
以MKL中的Blas routines下的求和函数为例,syntax下以s,sc,d,dz开头的位F77接口的函数,而不带上述字母开头的为f95接口,因此求和函数的f95接口函数名为asum,同理,对于内积的dot函数:
其F95接口的函数名为dot。
在这个代码中,通过use blas95使用blas库的95接口,asum函数和dot函数为Blas中的用于对向量求和和求内积的函数。
2.2 选择解决方案平台:
2.3 点击 项目-属性,确保平台为前一步选择的平台,进入fortran-Libraries,将Use Intel Math Kernel Library选择为3者中的一个(一般选Parallel)
2.4 进入Link-input,将Additinal Dependencies中加入要用到的MKL函数的依赖库,本文的示例代码用的是blas中的函数的95接口,因此依赖库为 mkl_blas95_ilp64.lib或者mkl_blas95_lp64.lib。
2.5 经过上述步骤,MKL的F95接口已经配置完成,运行即可。如出现错误,重新按照上述步骤进行。
以上,就是MKL库的F95接口配置,在后面的文章中,还将描述F77接口及C接口的配置。感谢您的阅读。
【完】