为什么到达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(&current_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 交易需要这么长时间才能完成?

什么是 Qt MaintenanceTool 元数据,为什么要花这么长时间才能获取?

为啥 psycopg2 INSERT 需要这么长时间才能循环运行,我该如何加快速度?