如何分析 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 上)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 上为旧 R 匹配 Rcpp 和 RcppArmadillo 的版本?
OpenMP 在 SEIR 模型的 Rcpp 代码中生成段错误