LAPACK dgesv VS MATLAB mldivide

时间:2016-07-08 16:56:24

标签: matlab matrix matrix-multiplication numerical-methods lapack

我正在编写有限差分方法程序 我使用的是英特尔数学核心库。

例如,1000x1000矩阵A和100​​0x1000矩阵B.
在英特尔MKL中,使用cblas_dgemm()函数的A * B大约需要600毫秒 在MATLAB中,A * B大约需要800毫秒 我认为MKL非常快。

但是,1000x1000矩阵A和100​​0x1矢量B,
MATLAB中的A \ B(mldivide),花了40毫秒,
但是在MKL中,使用LAPACKE_dgesv,花了400毫秒!

所以我的问题是, 为什么在mldivide中,MATLAB如此之快,MKL如此之慢?

矩阵A和向量B完全填充随机值。

我正在使用
MATLAB R2012b
Visual Studio 2015
英特尔Parallel Studio XE 2016 Update 3 Cluster Edition

谢谢。

EDITED

首先,C ++代码。

#include "mkl.h"
#include "time.h"

int n = 1000;
double *a = (double *)malloc(sizeof(double) * n * n);
for(int i = 0;i < n * n;i++) a[i] = rand();
double *b = (double *)malloc(sizeof(double) * n);
for(int i = 0;i < n;i++) b[i] = rand();
int *ipiv = (int *)malloc(sizeof(int) * n);
time_t now = clock();
int info = LAPACKE_dgesv(LAPACK_ROW_MAJOR,n,1,a,n,ipiv,b,1);
time_t ms = clock() - now;
printf("%d ms",ms);

其次,MATLAB代码。

n = 1000;
a = rand(n,n);
b = rand(n,1);
tic;
c = a\b;
toc * 1000

我认为我没有在测量时间方面犯错误 谢谢。

1 个答案:

答案 0 :(得分:2)

你的时间问题。 MKL和MATLAB都显示出对此操作的预热效果。如果你在C代码中对MKL进行两次计时,你会发现第二种方法比

快得多
247.349940 ms
14.353588 ms

对于Matlab,它是

ans =

  825.5090

ans =

   21.7870

请注意,结果也很大程度上取决于您的多线程设置。

不同之处在于,除非你退出Matlab并重新开始,否则你不会再看到预热效果,因为Matlab会保留在预热阶段创建的资源,直到你退出为止。如果再次运行Matlab脚本,将重用资源。但是对于MKL,如果你只有一次时间,你总是在热身阶段解决问题,退出c程序并释放资源而不重复使用它们。

预热不是特定于Matlab的现象。资源可以预先分配可重用的内存缓冲区,用于解决MKL的LAPACK中的方程式,这会影响C程序和Matlab脚本。