【问题标题】:Delay on call to MATLAB function延迟调用 MATLAB 函数
【发布时间】:2013-03-19 17:23:59
【问题描述】:

我从我的 C++ 代码中调用了一个 MATLAB 函数 (dll)。该函数获取一个数组作为参数。 函数对数组的每个成员进行一些计算。 我做了两个测试。 我第一次用一个有 24 个元素的数组调用这个函数。 第二次我用 8 个元素调用了这个函数 3 次。 第二次测试花费了两倍多的时间。 为什么 ? 进入 MATLAB 函数并退出它需要很多时间吗? 如果是,为什么?

【问题讨论】:

  • 这些结果是否一致?你能复制它们吗?

标签: c++ matlab


【解决方案1】:

您注意到的是,调用 MEX 函数需要花费大量时间。考虑 Matlab 必须做的最低要求:

  1. 扫描 Matlab 路径以确保函数映射到 MEX 文件(并且 MEX 文件未更改)
  2. 从其 DLL 或共享库中加载 MEX 函数,然后解析其 mexFunction 符号。
  3. 分配输入和输出参数数组,并初始化它们
  4. 调用你的函数
  5. 查找并释放 MEX 函数加载的任何临时变量
  6. 释放输入和输出参数数组

理论上,Matlab 可以使用缓存来避免前两个步骤。不过,我不确定它是否确实如此。 Matlab 解释器(或其 JIT 编译器)不能跳过任何后续步骤,甚至不能真正优化。基本上,如果您的计算速度很快,那么调用 MEX 函数的时间将比实际运行它多得多。

您已经找到了最大化 MEX 性能的方法,即让 MEX 函数尽可能多地处理每次调用。

除了让它在每次调用时处理尽可能多的数据外,您还应该将任何简单的外部循环推送到 MEX 函数中。简单的循环很容易在 MEX 函数中实现。它们也比 Matlab 中的循环(甚至是 JIT 编译的 Matlab)更快,并且避免了重复调用 MEX 函数的成本。

您还可以查看是否明智地使用mexLock 函数会有所帮助。您应该提供一些方法来使用mexUnlock 解锁 MEX 功能,否则您可能会开始泄漏内存,并且每次更改 MEX 功能时都必须重新启动您的 Matlab 会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多