分析 mex 函数

发布于 2024-08-01 19:13:15 字数 450 浏览 7 评论 0原文

我刚刚用 c++ 将 Matlab 程序重写为 mex 函数以加快速度,并取得了出色的结果。 这个优化决策是一个非常非常好的主意,无需线程即可将速度提高 20 倍。 它仍然让我很好奇 mex 函数将时间花在什么上,并希望找出可能的瓶颈。

我正在寻找一种分析 mex 函数的方法。 matlab 分析器没有多大用处,我下载的其他分析器(免费和试用版)都需要可执行文件来运行。 我不是 mex 专家,但据我所知,运行 mex 的唯一方法是在 Matlab 中。 mex 函数被编译为 dll,但称为 .mex64。 所以这个问题应该类似于分析一个dll。 为了编写 c++ mex 函数,我使用了单用户 VS2005(即不是团队版本),并且在 x64 平台上运行。

有谁知道分析 mex 函数的好方法? 当我从 Matlab 内部开始时,我应该使用什么工具以及如何使用它? 或者还有其他方法来分析 C++ 代码吗?

I have just rewritten a Matlab program in c++ as a mex-function to speed things up, with fantastic results. This optimization decision was a very very good idea, with up to a factor 20 speed up without threading. It still left me curious about what the mex-function was spending time on and wanting to identify possible bottlenecks.

I'm looking for a way to profile mex-functions. The matlab profiler is not much use, and the other profilers I've downloaded (both free and trial) all want an executable to run. I'm no mex-guru, but as far as I've understood the only way to run a mex is from within Matlab. The mex-function is compiled into a dll, but is called .mex64. So this problem should be similar to profiling a dll. To write the c++ mex-function I used a single-user VS2005 (i.e., not the team version), and am running on a x64-platform.

Does anyone know of a good way to profile a mex-function? What tool should I use and how do I use it when I start from within Matlab? Or is there any other way to profile the c++-code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花之痕靓丽 2024-08-08 19:13:15

有没有办法在 VC IDE 下运行整个程序。 就像你可以说“调试 DLL Foo.dll,使用 Matlab 作为启动应用程序”。

然后,如果您在 Foo.dll 中使用的函数 Bar 运行于 < 1秒,确保Matlab多次调用它,或者在DLL中添加一个包装函数来多次调用它。

如果您能做到这一点,您可以使用 手动调用堆栈采样技术,尽管不流行或不需要安装工具,但确实有效。

Is there a way to run the whole thing under a VC IDE. Like you could say "debug DLL Foo.dll, using Matlab as the startup app".

Then, if the function Bar you're using in Foo.dll runs in < 1 sec, make sure Matlab calls it a lot of times, or add a wrapper function in the DLL to call it a lot of times.

If you can get to that point, you can use the manual call stack sampling technique, that really works in spite of not being popular or requiring installation of a tool.

过期情话 2024-08-08 19:13:15

我设法做到这一点的唯一方法是分离出执行工作的函数并编写一个单独的包装器(而不是 mexFunction),该包装器加载带有测试数据的 .mat 文件并作为独立的可执行文件运行。 然后可以使用 gprof 等进行分析

the only way i've managed to do this is to separate out the function doing the work and writing a separate wrapper (instead of mexFunction) that loads .mat files with test data and runs as a standalone executable. this can then be profiled using e.g. gprof

|煩躁 2024-08-08 19:13:15

除了已经建议的最佳解决方案之外,还有两种可能的解决方案。

  1. 可以编写一个脚本来加载数据,运行 mex 函数,然后退出。 然后,您可以让分析器使用该脚本调用 Matlab 可执行文件。 当我分析 CUDA mex 函数时,这对我来说适用于 nVidia 的可视化分析器。

  2. 如果您在 Visual Studio 中构建了 mex 函数,您应该能够附加到 Matlab 进程,然后运行该函数进行调试或分析。

Two possible solutions in addition to the fine ones already suggested.

  1. It's possible to write a script which loads the data, runs your mex function, and then exits. You can then let the profiler call the Matlab executable with that script. This worked for me with nVidia's visual profiler when I was profiling my CUDA mex functions.

  2. If you built the mex function in Visual Studio, you should be able to do attach to the Matlab process and then run the function for either debugging or profiling.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文