我刚刚用c ++重写了一个matlab程序,作为一个mex函数来加快速度,结果很棒。这个优化决策是一个非常好的主意,在没有线程的情况下可以加速20倍。它仍然让我对mex-function花费时间和想要识别可能的瓶颈感到好奇。
我正在寻找一种分析mex功能的方法。 matlab profiler用处不大,我下载的其他分析器(免费和试用版)都希望运行可执行文件。我不是mex-guru,但据我所知,运行mex的唯一方法是在Matlab中。 mex-function被编译成一个dll,但被称为.mex64。所以这个问题应该类似于分析一个DLL。为了编写c ++ mex-function,我使用的是单用户VS2005(即不是团队版本),而是在x64平台上运行。
有没有人知道配置mex功能的好方法?我应该使用什么工具,当我从Matlab开始时如何使用它?或者有没有其他方法来分析c ++代码?
答案 0 :(得分:8)
我设法做到这一点的唯一方法是分离出完成工作的函数,并编写一个单独的包装器(而不是mexFunction),它将.mat文件加载到测试数据并作为独立的可执行文件运行。然后可以使用例如gprof的
答案 1 :(得分:3)
有没有办法在VC IDE下运行整个事情。就像你可以说“调试DLL Foo.dll,使用Matlab作为启动应用程序”。
然后,如果您在Foo.dll中使用的函数Bar在< 1秒,确保Matlab多次调用它,或者在DLL中添加一个包装器函数来调用它很多次。
如果你能够达到这一点,你可以使用manual call stack sampling technique,尽管不受欢迎或需要安装工具,但它仍然有用。
答案 2 :(得分:1)
除了已经建议的好的解决方案之外,还有两种可能的解决方案。
可以编写一个加载数据的脚本,运行mex函数,然后退出。然后,您可以让探查器使用该脚本调用Matlab可执行文件。当我分析我的CUDA mex功能时,这对我有了nVidia的视觉分析器。
如果在Visual Studio中构建了mex函数,则应该能够附加到Matlab进程,然后运行该函数进行调试或分析。