MATLAB Wrapper中的MEX代码

时间:2012-06-29 15:42:52

标签: c++ matlab mex

我有以下代码:

for i=1:N,
    some_mex_file();
end

我的MEX文件执行以下操作:

  1. 声明一个我定义的类的对象,它有两个大的内存块,即32x2048x2的double类型。
  2. 处理此对象中的数据。
  3. 销毁物品。
  4. 我想知道在循环中调用MEX文件为其对象分配大内存块是否需要更多时间。我正在考虑迁移到C ++,这样我就可以只声明一次对象,然后重置它的内存空间,这样就可以在没有新声明的情况下一次又一次地使用它。这会产生影响还是会成为毫无价值的努力?换句话说,在MEX文件中分配内存需要花费更多时间而不是声明它并重复使用它吗?

1 个答案:

答案 0 :(得分:1)

所以,这里通常的建议适用:描述你的代码(在Matlab和使用C / C ++探查器),或者至少在调试器中多次停止它以查看它在哪里花费它时间。停止“想知道”它花费时间的地方,并且实际上衡量它花费时间的地方。

但是,我遇到了这样的问题,在MEX函数中分配/解除分配内存是主要的性能接收器。但是,您应该通过分析(或在调试器中停止代码)验证

解决此类性能问题的最简单方法有两个:

  1. 将循环移动到MEX功能。使用迭代计数调用MEX函数,让您的快速C / C ++代码实际执行循环。这消除了从Matlab调用MEX函数的成本(对于大N来说可能很大),并且有利于第二次优化:

  2. 让你的MEX功能缓存它的分配/解除分配,如果你将循环移动到MEX功能,这将更容易(也更安全)。这可以通过多种方式完成,但最简单的方法是只分配一次空间(在循环外部),并在循环完成后释放它。