如何分析 Rcpp 代码(在 linux 上)

Posted

技术标签:

【中文标题】如何分析 Rcpp 代码(在 linux 上)【英文标题】:How to profile Rcpp code (on linux) 【发布时间】:2017-09-25 20:03:58 【问题描述】:

我用 Rcpp 制作了一个 R 包,其中整个模拟在 C++ 中运行,结果在 R 中分析。现在我需要分析我的函数以便优化它们,但是 R 分析器无法区分 C++ 函数内部发生的情况,并且当函数只能从 R 内部运行时,我不知道如何运行 C++ 分析器。

到目前为止,我发现了一些使用 gperftools 的建议(questions 和 tutorials),但指南不完整(也许他们假设我缺乏一定的知识水平?),缺少链接,我继续运行入墙。因此这个问题。这是我所在的位置:

    安装 gperftools(我是用 pacman 从 extra/gperftools 安装的) 在 C++ 头文件中包含 gperftools/profiler.h 在 C++ 代码中围绕我想要分析的内容添加 ProfilerStart("myprof.log") 和 ProfilerStop() 使用 -lprofiler 编译 运行“$ CPUPROFILE="myprof.log" R -f myscript.R"

当前的墙是 gcc 告诉我“Undefined Symbol: ProfilerStart”,所以我认为链接有问题?

【问题讨论】:

嗯,它在过去对我有用,如我网站上的一些较旧的幻灯片所示... 【参考方案1】:

gperftools 给我的印象不是很深。此外,它似乎是一个检测分析器,基于采样的分析器更易于使用并且可能运行得更快。 Intels VTune 是一款出色的基于采样的分析器,如果您是教育用户,可免费使用。即使您没有,您的组织也可能已经拥有许可证。

转到您的 gperftools 问题,是的,这是一个链接器问题。由于您已决定不分享任何相关信息(链接命令?编译命令?实际错误消息?),我们无法进一步帮助您。

【讨论】:

你完全正确,我真的应该在问题中包含我的 Makevars。我想我希望人们会完全推荐我其他的分析器?【参考方案2】:

毕竟这是一个链接错误,由于我是第一次使用 Makevars,所以缺乏经验。 在第 4 步中,我将“-lprofiler”添加到 PKG_CXXFLAGS,用于编译,而我应该将它添加到 PKG_LIBS。我进行了更改,现在分析器工作正常。这是我现在的 Makevars:

PKG_CXXFLAGS += -Wall -pedantic -g -ggdb #-fno-inline-small-functions PKG_LIBS += -lprofiler CXX_STD = CXX11

【讨论】:

以上是关于如何分析 Rcpp 代码(在 linux 上)的主要内容,如果未能解决你的问题,请参考以下文章

逐元素矩阵乘法:R 与 Rcpp(如何加快此代码的速度?)

如何在 Windows 上为旧 R 匹配 Rcpp 和 RcppArmadillo 的版本?

rcpp报错,在mac上学习Rcpp和C++

OpenMP 在 SEIR 模型的 Rcpp 代码中生成段错误

在 Windows 上使用 Rtools 中包含的不同 gcc 版本和 Rcpp

将字符缓冲区移植到 Rcpp