MEX代码在MATLAB包装

问题描述:

我有以下代码:MEX代码在MATLAB包装

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

我MEX文件执行下列操作:

  1. 声明一个对象,我定义的类,具有2个大存储器的块,即32x2048x2类型的double。
  2. 处理此对象中的数据。
  3. 销毁对象。

我在想,如果在为对象分配大内存块的循环中调用MEX文件时是否需要更多时间。我正在考虑迁移到C++,以便我只能声明一次对象,并重置其内存空间,以便可以一次又一次地使用它,而无需新声明。这是会有所作为还是会变得毫无价值?换句话说,在MEX文件中分配内存需要更多时间而不是声明一次并重用它?

+1

只是为了清楚的事情,你的MEX函数声明C++对象或MATLAB对象(在OOP意义上)? – Amro

+0

@Amro它声明了C++对象。 – ubaabd

因此,这里通常的建议适用于:在Matlab中使用Profile和使用C/C++分析器,或者至少在调试器中多次停止它以查看它花费的时间。停止“想知道”它在哪里花费时间,并且实际上测量花费时间。

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

对这种性能问题的最简单的办法是双重的:

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

  2. 让MEX函数缓存它的分配/释放,这非常容易得多和更安全)做,如果你将循环移入MEX功能。这可以通过几种方式完成,但最简单的方法是只分配一次空间(循环外),并在循环完成后释放空间。