gpt4 book ai didi

c++ - Matlab Mex 库生命周期

转载 作者:可可西里 更新时间:2023-11-01 15:48:54 25 4
gpt4 key购买 nike

有谁知道 matlab mex 库的生命周期是什么?具体来说,我对以下内容感兴趣:

  1. 有没有办法在调用之前强制加载库?
  2. 库是单例还是加载了多个实例?
  3. 在调用之前是否有任何用于初始化的 Hook ?
  4. 当卸载库进行清理时,是否有可以拦截的析构函数 Hook /信号?

我在这里和网上进行了广泛的搜索,但找不到这些问题的答案。我的问题在初始化方面有一些性能成本,我想尽可能避免这种情况,而无需编写服务。

最佳答案

MEX 文件会保持加载状态,直到您清除它(clear myMexFunclear mex)或退出 MATLAB。

对于预加载,我所能建议的是在没有输入或 nop 等效输入的情况下调用函数。我在我的 mexFunction 中创建了简单的代码路径来无错误地处理此类调用,最简单的示例是 if(!nrhs) return;。后续调用不需要从磁盘加载 mexFunction(或 MEX 函数调用的共享库中的任何其他函数),之后您无需担心初始化成本。

关于初始化/清理、构造函数/析构函数等。我不知道有什么方法可以在加载或卸载 MEX 文件时查看 MATLAB 在做什么,但是 MEX 文件是常规共享文件仅导出单个函数 ( mexFunction is the only entry point ) 的库(即 DLL/SO),因此,正如 Amro 指出的那样,您可以在 Windows 中实现 DllMain 来定义模块和线程附加/分离操作(请参阅 his answer 中的优秀示例)。我不知道与图书馆互动的任何其他机制。

要在模块卸载时执行任务,您可以使用 mexAtExitmexFunction 中向 MATLAB 注册一个函数,以便在 MEX 函数卸载(再次清除或 MATLAB 退出)时调用。只需在全局命名空间中定义一个 static 函数,并使用 mexAtExit 注册它。 MATLAB (mexatexit.c) 提供的示例演示了关闭在 mexFunction 中打开但未关闭的文件流。您还可以释放持久内存、关闭流等。这是一个人为的示例:

mexDLLtext.cpp:

#include "mex.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

static FILE *fp=NULL;
static double *pDataC=NULL, *pDataCpp=NULL, *pMxData=NULL;
static char fName[L_tmpnam], counter = 0;

static void CleanUp(void)
{
fclose(fp); /* close file opened with fopen */
free(pDataC); /* deallocate buffer allocated with malloc/calloc */
delete[] pDataCpp; /* deallocate buffer allocated with new double[...] */
mxFree(pMxData); /* free data created with mx function like mxMalloc */

mexPrintf("Closing %s and freeing memory...\n",fName);
}

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if (!fp) { tmpnam(fName); fp = fopen(fName,"w"); }
fprintf(fp,"%d ",++counter);

if (!pDataC) pDataC = (double*) malloc(sizeof(double)*16);
if (!pDataCpp) pDataCpp = new double[16];
if (!pMxData) {
pMxData = (double*) mxMalloc(sizeof(double)*16);
mexMakeMemoryPersistent(pMxData); mexPrintf("First!\n");
}

mexAtExit(CleanUp);
// Then use the persistent data...
}

运行时:

>> mex -largeArrayDims mexDLLtest.cpp
>> for i=1:5, mexDLLtest; end
First!
>> clear mexDLLtest
Closing \s1rg.1 and freeing memory...
>> type E:\s1rg.1

1 2 3 4 5

并且您可以通过 mexLock 控制文件的卸载和 mexUnlock .

当函数启动并返回到 MATLAB 时,参数(即 prhsplhs)发生了什么是 very well documented ,另一方面,所以我想这不是您要问的。

关于多个实例,您可以尝试使用 Sysinternals' Process Explorer (如果使用 Window)查看哪些加载模块有线程在 MATLAB.exe 下运行。无论调用函数多少次或调用该函数的速度有多快,我都只在线程列表中看到一个(单线程)MEX 文件的一个实例。但是,一旦回到命令行,您可以执行 version -modules 来查看已加载模块的列表,正如 Amro 所建议的那样。 MEX 文件仍会存在,并且与 Process Explorer 可见的线程列表一样,我只看到 MEX 特定文件的一个实例。

谢谢 Amro 的意见。我很想看到这些问题的一些更权威的答案!

关于c++ - Matlab Mex 库生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20575957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com