INTEL MKL(特尔数学核心函数库)面的函数都是进行高度优化的,速度很不错。这次调用和测试的关于求解矩阵特征值和特征向量的函数。在MKL中,求解矩阵特征值和特征向量的函数有好几个,这里调用和测试的是最常见的dsyev/ssyev和性能最好的dsyevr/ssyevr。(ssyev和ssyevr是对应float,dsyev和dsyevr是对应double)。
ssyev(jobz, uplo, n, a, lda, w, work, lwork, info)
dsyev(jobz, uplo, n, a, lda, w, work, lwork, info)
ssyevr(jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, iwork, liwork, info)
dsyevr(jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, iwork, liwork, info)
可以看到syevr的参数远远多于syev,而这些参数的具体含义可以参看MKL的帮助文档,里面有详细介绍,很容易明白的。值得一提的是参数lwork,是指运行空间work的大小,这个值如果感觉无法估计的话,可以先设置为-1,然后运行程序,程序就会返回一个最佳取值,然后再设置就可以了。
这次测试的电脑配置是处理器 Intel Core(TM) Duo Processor T2250(双核1.73G) 内存2G DDR2 667 运行环境 Visual studio 2008,用于比较的是INTEL IPP(英特尔高性能多媒体函数库)中的ippmEigenValuesVectorsSym_m_64f()函数,以及MATLAB中的eig()函数。
测试用的矩阵是用MATLAB生成的1000*1000的实对称矩阵,在相同的环境下分别调用以上函数对其进行速度测试,经测试4个函数计算的结果均正确,速度如下:
MATLAB eig() 8.925s
INTEL IPP ippmEigenValuesVectorsSym_m_64f() 26.734s
INTEL MKL dsyev 6.562s
INTEL MKL dsyevr 2.062s
由此可见MKL中dsyevr函数是速度最快的,要说的是经过测试设定环境变量OMP_NUM_THREADS=2,对dsyev和dsyevr两个函数的速度都没有影响,但是当设定环境变量OMP_NUM_THREADS=1时,dsyev的速度降为9.658s而dsyevr的速度降为3.140s。由此,我们可以知道MKL中的函数都是进行了多线程优化的直接调用即可,不需要我们自己设置的。