【问题标题】:How can I profile a MEX function written using the matlab editor and compiled using gcc如何分析使用 matlab 编辑器编写并使用 gcc 编译的 MEX 函数
【发布时间】:2022-01-11 07:39:10
【问题描述】:

我想分析我在 matlab (2021a) 编辑器中编写的 mex 函数。我现在能做的最好的就是使用matlab的tic、toc函数来测量总执行时间,但我不知道如何使用更详细的诊断工具来评估代码性能。我发现其他 questionsresponses 使用 Visual Studio 讨论此问题,但回复似乎使用的是旧版本的 Visual Studio,而不是我目前的 2019 版本。我对 Visual Studio 也不是很熟悉,所以我不确定在哪里可以找到他们提到的一些工具,这些工具似乎已从以前版本中的位置移动。

【问题讨论】:

标签: c++ visual-studio matlab profiling mex


【解决方案1】:

为此我决定采用两种解决方案。第一个是按照上面的 cmets (stackoverflow.com/a/47888078/7328782) 中的建议在我的代码中添加计时器。然后,您可以使用以下代码 sn-p 编写脚本以将值输出到 matlab 控制台:

       std::ostringstream stream;
           stream << "Here is the name/value pair that you entered." << std::endl;
           displayOnMATLAB(stream);
           stream << SIG.rows() << " " << SIG.cols() << std::endl;
           displayOnMATLAB(stream);

并确保在 mexFunction 的主体之外包含以下函数定义,但仍在 mexFunction 的类定义中:

// outputting to matlab console for debugging
    void displayOnMATLAB(std::ostringstream& stream) {
        // Pass stream content to MATLAB fprintf function
        matlabPtr->feval(u"fprintf", 0,
            std::vector<matlab::data::Array>({ factory.createScalar(stream.str()) }));
        // Clear stream buffer
        stream.str("");
    }

但是,简单地对一段 c++ 代码进行计时并不一定能全面了解您可以使用代码优化什么。例如,Microsoft Visual Studio 的分析工具(包括详细介绍/概述/教程here)可以告诉您在给定行消耗了多少内存、整个脚本中的处理器使用情况等等。您可能明确地希望了解某条线路的整洁和高效程度,或者您可能会发现一条无害的线路相对于您的瓶颈可能运行得很快,但实际上消耗的资源比它应该消耗的多得多。我决定简单地将我的 mex 函数代码移植到 Visual Studio。幸运的是,Matlab 支持在他们的论坛上发布了response,解释了如何做到这一点。到目前为止,它似乎可以与 2021a 和 Visual Studio 2019 一起使用,即使响应是针对旧版本的 Matlab 和 Visual Studio 编写的。

(注意,模块定义文件只需要你用我认为的项目名称替换MYFILE语句即可。其他两行应保持原样)

更新

上面的答案有一些问题需要解决。到目前为止,我发现的最佳选择是使用上面评论中提到的 Cris Luengo 的方法。

【讨论】:

  • 事实证明,这不是一个完全正确或完整的答案。到目前为止,我发现的最佳方法仍然是 Cris Luengo 建议使用标准库的计时函数并拥有脚本的测试版本,其中一个输出是包含计时数据的向量。如果有人找到更好的解决方案,我会留下这个问题。
猜你喜欢
  • 2012-01-23
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
相关资源
最近更新 更多