我从我的 C++ 代码中调用了一个 MATLAB 函数 (dll)。该函数获取一个数组作为参数。函数对数组的每个成员进行一些计算。我做了两个测试。我第一次用一个有 24 个元素的数组调用这个函数。我第二次用 8 个元素调用了这个函数 3 次。第二次测试花费了两倍多的时间。为什么 ?进入 MATLAB 函数和退出它需要很多时间吗?如果是,为什么?
问问题
203 次
1 回答
2
您注意到的是,调用 MEX 函数需要花费大量时间。考虑 Matlab 必须做的最小值:
- 扫描 Matlab 路径以确保函数映射到 MEX 文件(并且 MEX 文件没有更改)
- 从其 DLL 或共享库中加载 MEX 函数,然后解析其
mexFunction
符号。 - 分配输入和输出参数的数组,并初始化它们
- 调用你的函数
- 查找并释放 MEX 函数加载的任何临时变量
- 释放输入和输出参数数组
理论上,Matlab 可以使用缓存来避免前两个步骤。不过,我不确定它是否确实如此。Matlab 解释器(或其 JIT 编译器)不能跳过任何后续步骤,甚至不能真正优化。基本上,如果您的计算速度很快,那么调用 MEX 函数的时间将比实际运行它多得多。
您已经找到了最大化 MEX 性能的方法,即让 MEX 函数尽可能多地处理每个调用。
除了在每次调用中尽可能多地处理数据之外,您还应该将任何简单的外部循环推送到 MEX 函数中。简单的循环很容易在 MEX 函数中实现。它们也比 Matlab 中的循环(甚至是 JIT 编译的 Matlab)更快,并且避免了重复调用 MEX 函数的成本。
您还可以查看是否明智地使用该mexLock
功能会有所帮助。您应该提供一些方法来解锁 MEX 功能mexUnlock
,否则您可能会开始泄漏内存,并且每次更改 MEX 功能时都必须重新启动您的 Matlab 会话。
于 2013-03-19T18:49:18.170 回答