MEX代码在MATLAB包装
问题描述:
我有以下代码:MEX代码在MATLAB包装
for i=1:N,
some_mex_file();
end
我MEX文件执行下列操作:
- 声明一个对象,我定义的类,具有2个大存储器的块,即32x2048x2类型的double。
- 处理此对象中的数据。
- 销毁对象。
我在想,如果在为对象分配大内存块的循环中调用MEX文件时是否需要更多时间。我正在考虑迁移到C++,以便我只能声明一次对象,并重置其内存空间,以便可以一次又一次地使用它,而无需新声明。这是会有所作为还是会变得毫无价值?换句话说,在MEX文件中分配内存需要更多时间而不是声明一次并重用它?
答
因此,这里通常的建议适用于:在Matlab中使用Profile和使用C/C++分析器,或者至少在调试器中多次停止它以查看它花费的时间。停止“想知道”它在哪里花费时间,并且实际上测量花费时间。
但是,我遇到过这样的问题,在MEX函数中分配/释放内存是主要的性能下降。但是,您应该通过分析(或在调试器中停止代码)验证。
对这种性能问题的最简单的办法是双重的:
移动循环到MEX功能。使用迭代计数调用MEX函数,并让您的快速C/C++代码实际执行循环。这消除了从Matlab调用到MEX函数的成本(对于大N来说可能相当大),并且便于第二次优化:
让MEX函数缓存它的分配/释放,这非常容易得多和更安全)做,如果你将循环移入MEX功能。这可以通过几种方式完成,但最简单的方法是只分配一次空间(循环外),并在循环完成后释放空间。
只是为了清楚的事情,你的MEX函数声明C++对象或MATLAB对象(在OOP意义上)? – Amro
@Amro它声明了C++对象。 – ubaabd