为什么到达MEX文件的最后一行后需要这么长时间才能返回Matlab?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么到达MEX文件的最后一行后需要这么长时间才能返回Matlab?相关的知识,希望对你有一定的参考价值。
在我的MEX文件的最后一行完成执行后,返回matlab命令行大约需要大约14秒。
从matlab定时MEX文件:
D=rand(14000)+rand(14000)*1i;
tic;
[A B C]=myMexFile(D);
toc
disp(datetime('now'));
输出是:
Elapsed time is 35.192704 seconds.
15-Sep-2018 16:51:35
使用以下最小工作示例从C内对MEX文件进行计时:
#include <mex.h>
#include <sys/time.h>
#include <time.h>
#include <cuComplex.h>
double getHighResolutionTime()
struct timeval tod;
gettimeofday(&tod, NULL);
double time_seconds = (double) tod.tv_sec + ((double) tod.tv_usec / 1000000.0);
return time_seconds;
void double2cuDoubleComplex(cuDoubleComplex* p, double* pr, double* pi,int numElements)
for(int j=0;j<numElements;j++)
p[j].x=pr[j];
p[j].y=pi[j];
void cuDoubleComplex2double(cuDoubleComplex* p, double* pr, double* pi,int numElements)
for(int j=0;j<numElements;j++)
pr[j]= p[j].x;
pi[j]= p[j].y;
void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
double tic=getHighResolutionTime();
int m=(int)mxGetM(prhs[0]);
int n=(int)mxGetN(prhs[0]);
int SIZE=m*n;
//get pointers to input data from matlab and convert to
//interleaved (Fortran) ordering
cuDoubleComplex *Gr= (cuDoubleComplex*) mxMalloc(SIZE*sizeof(cuDoubleComplex));
double2cuDoubleComplex(Gr,mxGetPr(prhs[0]),mxGetPi(prhs[0]),SIZE);
//modify the input data, allocate output matrices, and convert
//back to split (matlab) ordering.
Gr[0].x=0.0;
plhs[0] = mxCreateDoubleMatrix(m,m,mxCOMPLEX);
cuDoubleComplex2double(Gr,mxGetPr(plhs[0]),mxGetPi(plhs[0]),SIZE);
Gr[0].x=1.0;
plhs[1] = mxCreateDoubleMatrix(m,m,mxCOMPLEX);
cuDoubleComplex2double(Gr,mxGetPr(plhs[1]),mxGetPi(plhs[1]),SIZE);
Gr[0].x=2.0;
plhs[2] = mxCreateDoubleMatrix(m,m,mxCOMPLEX);
cuDoubleComplex2double(Gr,mxGetPr(plhs[2]),mxGetPi(plhs[2]),SIZE);
mxFree(Gr);
double elapsed=getHighResolutionTime()-tic;mexPrintf("%f\n", elapsed);
time_t current_time = time(NULL);
char* c_time_string = ctime(¤t_time);
mexPrintf("time at end of MEX file %s\n", c_time_string);
输出是:
21.676793
time at end of MEX file Sat Sep 15 16:51:21 2018
Matlab返回35.19s的时间,而MEX文件实际需要21.67s才能到达最后一行。日期和时间相差约14秒,即MEX文件为16:51:21,matlab为16:51:35。
输出是非常大的矩阵,但它们在MEX文件的最后一行之前成功分配和初始化。我想不出别的什么。是什么导致了这种行为,我该如何避免呢?
更新:我在更多的机器上尝试了这个,时间差异仍然存在。
更新:我用最小的工作示例替换了上面的伪代码。请注意,上面代码的代码实际上并不使用任何GPU功能。我包含cuComplex.h标头只是为了使用cuDoubleComplex数据类型。
以上是关于为什么到达MEX文件的最后一行后需要这么长时间才能返回Matlab?的主要内容,如果未能解决你的问题,请参考以下文章
为啥没有网络连接时 Alamofire 需要这么长时间才能超时?
为啥 azure 需要这么长时间才能创建 Windows 核心服务器容器实例?
为啥我的 Create React App Dev Server 需要这么长时间才能启动?
Braintree - 为啥通过 API 或沙盒创建的 Braintree 交易需要这么长时间才能完成?