LAPACK dgesv与MATLAB mldivide

LAPACK dgesv与MATLAB mldivide,matlab,matrix,matrix-multiplication,numerical-methods,lapack,Matlab,Matrix,Matrix Multiplication,Numerical Methods,Lapack,我正在写有限差分法程序。 我正在使用英特尔数学内核库 例如,1000x1000矩阵A和1000x1000矩阵B。 在英特尔MKL中,使用cblas_dgemm()函数的A*B大约需要600毫秒。 在MATLAB中,A*B大约需要800毫秒。 我觉得MKL很快 但是,1000x1000矩阵A和1000x1向量B, 而A\B(mldivide)在MATLAB中,需要40毫秒, 但在MKL中,使用LAPACKEëdgesv,需要400毫秒 所以我的问题是, 为什么在mldivide中,MATLAB如此

我正在写有限差分法程序。
我正在使用英特尔数学内核库

例如,1000x1000矩阵A和1000x1000矩阵B。
在英特尔MKL中,使用cblas_dgemm()函数的A*B大约需要600毫秒。
在MATLAB中,A*B大约需要800毫秒。
我觉得MKL很快

但是,1000x1000矩阵A和1000x1向量B,
而A\B(mldivide)在MATLAB中,需要40毫秒,
但在MKL中,使用LAPACKEëdgesv,需要400毫秒

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

矩阵A和向量B充满了随机值

我正在使用
MATLAB R2012b
Visual Studio 2015
英特尔并行工作室XE 2016更新3群集版

多谢各位

编辑

首先,C++代码.< /P>
#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);
我想我在测量时间时没有弄错。

谢谢。

您的时间安排有问题。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脚本。

@kangshiyin对,我误读了。谢谢。你能给我看一下计时代码吗?在计时过程中可能会出现很多问题。@ShuS
tic
toc
需要预热时间。我建议您改用
timeit
。执行类似于
t=timeit(@()a\b)的操作假设您事先声明了
a
b
。使用
timeit
将花费一点时间进行测试,因为它会多次执行要计时的操作并找到平均值。虽然R2013b中引入了此函数,但您可以在MATLAB FEX上找到它:。事实上,这个函数非常流行,这就是为什么它从R2013b开始可用的原因。您的比较不公平,因为MATLAB使用列主矩阵。@kangshiyin给出的示例代码,Matlab可能会使用类似的
dgesv
方法,因为
rand
不太可能生成具有任何特殊结构的矩阵。谢谢。我将DGESV参数改为LAPACK_COL_MAJOR,并在MATLAB和MKL中计算了100次(第一次的计算中包括预热时间,其他99次可能不包括预热时间)。结果是,MKL的速度快了1.76倍!!非常感谢。
ans =

  825.5090

ans =

   21.7870