首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rcpp获取Rcpp工具

使用Rcpp获取Rcpp工具
EN

Stack Overflow用户
提问于 2016-10-18 20:31:36
回答 2查看 779关注 0票数 2

我读过这里这里的相关文章,看过Dirk的talk 这里,但是我甚至没有从gperftools那里得到一个.log文件。这是我的R文件,名为Rcpp_practice.R

代码语言:javascript
复制
library(Rcpp)

Sys.setenv("PKG_LIBS"="-lprofiler")
sourceCpp('eigen.cpp')

a <- matrix(rnorm(300^2), 300, 300)
getEigenValues(a)

以下是eigen.cpp的内容

代码语言:javascript
复制
#include <RcppArmadillo.h>
#include <gperftools/profiler.h>
// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
arma::vec getEigenValues(arma::mat M) {
    return arma::eig_sym(M);
}

然后,在终端上(我正在使用OSX):

代码语言:javascript
复制
CPUPROFILE="eigenprof.log" R -f "Rcpp_practice.R"

我希望看到eigenprof.log坐在我的工作目录中,但我没有。而且,我也没有收到我在表单PROFILE: interrupts/evictions/bytes = 012/34/567891的其他帖子中看到的消息

我验证了我已经安装了最新版本的gperftools。($ brew upgrade google-perftools给出Error: gperftools 2.5 already installed)。

我遗漏了什么?

更新

在修改代码以匹配@nrussell之后,我得到以下错误消息:

代码语言:javascript
复制
Error in dyn.load("/private/var/folders/6k/ffcchdq52kbb7d631b5vsqcw0000gn/T/RtmpCIdHkG/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7/sourcecpp_6c3253d60384/sourceCpp_2.so") : 
unable to load shared object '/private/var/folders/6k/ffcchdq52kbb7d631b5vsqcw0000gn/T/RtmpCIdHkG/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7/sourcecpp_6c3253d60384/sourceCpp_2.so':
dlopen(/private/var/folders/6k/ffcchdq52kbb7d631b5vsqcw0000gn/T/RtmpCIdHkG/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7/sourcecpp_6c3253d60384/sourceCpp_2.so, 6): Symbol not found: _ProfilerStart
Referenced from: /private/var/folders/6k/ffcchdq52kbb7d631b5vsqcw0000gn/T/RtmpCIdHkG/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7/sourcecpp_6c3253d60384/sourceCpp_2.so
Expected in: flat namespace
in /private/var/folders/6k/ffcchdq52kbb7d631b5vsqcw0000gn/T/RtmpCIdHkG/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7/sourcecpp_6c3253d60384/sourceCpp_2.so
Calls: sourceCpp -> source -> withVisible -> eval -> eval -> dyn.load
Execution halted

如果我以交互方式运行脚本,这将出现在与sourceCpp一起的行中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-18 21:21:05

我没有访问OS机器的权限,但下面的内容在Debian 8上有效,我刚刚将ProfilerStart / ProfilerStop调用添加到您的C++代码中(而且根本没有更改您的R代码):

代码语言:javascript
复制
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
#include <gperftools/profiler.h>

// [[Rcpp::export]]
arma::vec getEigenValues(arma::mat M) {
    ProfilerStart("./eigen-prof.log");
    return arma::eig_sym(M);
    ProfilerStop();
}

见下文最新情况。

然后从终点站,

代码语言:javascript
复制
R -f eigen-prof.R > /dev/null && google-pprof --text $(which R) eigen-prof.log 

# PROFILE: interrupts/evictions/bytes = 2/0/264
# Using local file /usr/local/bin/R.
# Using local file eigen-prof.log.
# /usr/bin/addr2line: /usr/local/bin/R: File format not recognized
# Total: 2 samples
#        1  50.0%  50.0%        1  50.0% dlamch_
#        1  50.0% 100.0%        1  50.0% dsymv_
#        0   0.0% 100.0%        1  50.0% 00000000004007ca
#        0   0.0% 100.0%        1  50.0% 00000000004007fa
#        0   0.0% 100.0%        1  50.0% 00007f84002bf0bd
#        0   0.0% 100.0%        1  50.0% 00007f84002bf2a8
#        0   0.0% 100.0%        1  50.0% 00007f84002c14c8
#        0   0.0% 100.0%        1  50.0% R_ReplConsole
#        0   0.0% 100.0%        1  50.0% Rf_ReplIteration
#        0   0.0% 100.0%        1  50.0% Rf_applyClosure
#        0   0.0% 100.0%        1  50.0% Rf_eval
#        0   0.0% 100.0%        1  50.0% __libc_start_main
#        0   0.0% 100.0%        1  50.0% dlatrd_
#        0   0.0% 100.0%        1  50.0% do_dotcall
#        0   0.0% 100.0%        1  50.0% dsyev_
#        0   0.0% 100.0%        1  50.0% dsytrd_
#        0   0.0% 100.0%        1  50.0% frame_dummy
#        0   0.0% 100.0%        1  50.0% run_Rmainloop 

关于更新,请尝试将sourceCpp调用更改为

代码语言:javascript
复制
sourceCpp(
    'eigen-prof.cpp',
    verbose = TRUE,
    rebuild = TRUE,
    cacheDir = "/tmp/profdir"
)

其中,我使用cacheDir = "/tmp/profdir"覆盖默认的随机目录(tempdir()),sourceCpp用于构建共享库;rebuild = TRUE确保每次运行时都生成一个新的.so

回到shell中,运行以下命令,根据需要替换适当的文件和目录名称:

  • R -f eigen-prof.R
  • so_file=$(find /tmp/profdir/ -iname '*.so' -printf "%T+\t%p\n" | sort -r | head -n1 | awk '{print $2}')
  • google-pprof --text $so_file eigen-prof.log

这给了我

代码语言:javascript
复制
# Using local file /tmp/profdir/sourceCpp-x86_64-pc-linux-gnu-0.12.7/sourcecpp_5dc5531d6f20/sourceCpp_4.so.
# Using local file eigen-prof.log.
# Total: 2 samples
#        1  50.0%  50.0%        1  50.0% dsterf_
#        1  50.0% 100.0%        1  50.0% dsymv_
#        0   0.0% 100.0%        2 100.0% 0x00000000004007ca
#        0   0.0% 100.0%        2 100.0% 0x00000000004007fa
#        0   0.0% 100.0%        2 100.0% R_ReplConsole
#        0   0.0% 100.0%        2 100.0% Rf_ReplIteration
#        0   0.0% 100.0%        2 100.0% Rf_applyClosure
#        0   0.0% 100.0%        2 100.0% Rf_eval
#        0   0.0% 100.0%        2 100.0% __libc_start_main
#        0   0.0% 100.0%        2 100.0% arma::auxlib::eig_sym
#        0   0.0% 100.0%        1  50.0% dlatrd_
#        0   0.0% 100.0%        2 100.0% do_dotcall
#        0   0.0% 100.0%        2 100.0% dsyev_
#        0   0.0% 100.0%        1  50.0% dsytrd_
#        0   0.0% 100.0%        2 100.0% eig_sym (inline)
#        0   0.0% 100.0%        2 100.0% getEigenValues
#        0   0.0% 100.0%        2 100.0% run_Rmainloop
#        0   0.0% 100.0%        2 100.0% sourceCpp_1_getEigenValues
#        0   0.0% 100.0%        2 100.0% syev (inline)

我将第二步放在一起,所以不要对此做出判断;但是它只是搜索传递给cacheDir的目录(在我的例子中是/tmp/profdir),以查找最近创建的(修改的) .so文件。如果您的机器缺少这些程序,您也可以使用Finder等手动获取文件名。

票数 4
EN

Stack Overflow用户

发布于 2016-10-19 18:04:29

在OS上,当我天真地试图编译代码时,我看到了同样的错误:

代码语言:javascript
复制
> Rcpp::sourceCpp('scratch/prof.cpp')
Error in dyn.load("/private/var/folders/tm/5dt8p5s50x58br1k6wpqnwx00000gn/T/RtmpgOwFk7/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7.1/sourcecpp_9f424793a11/sourceCpp_2.so") : 
  unable to load shared object '/private/var/folders/tm/5dt8p5s50x58br1k6wpqnwx00000gn/T/RtmpgOwFk7/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7.1/sourcecpp_9f424793a11/sourceCpp_2.so':
  dlopen(/private/var/folders/tm/5dt8p5s50x58br1k6wpqnwx00000gn/T/RtmpgOwFk7/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7.1/sourcecpp_9f424793a11/sourceCpp_2.so, 6): Symbol not found: _ProfilerStart
  Referenced from: /private/var/folders/tm/5dt8p5s50x58br1k6wpqnwx00000gn/T/RtmpgOwFk7/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7.1/sourcecpp_9f424793a11/sourceCpp_2.so
  Expected in: flat namespace
 in /private/var/folders/tm/5dt8p5s50x58br1k6wpqnwx00000gn/T/RtmpgOwFk7/sourceCpp-x86_64-apple-darwin13.4.0-0.12.7.1/sourcecpp_9f424793a11/sourceCpp_2.so

相关的位,Symbol not found: _ProfilerStart,意味着我们没有为编译器提供链接到Google库所需的信息。向链接器调用添加-lprofiler位足以解决这个问题--最简单的方法是向~/.R/Makevars添加如下内容:

代码语言:javascript
复制
LDFLAGS = -L/usr/local/lib -lprofiler

假设您已经安装了Google工具,并以标准方式将其与/usr/local进行了符号链接。

更彻底的解决方案将涉及实现生成这些标志所需的Rcpp属性代码,这样添加// [[Rcpp::plugin(gperftools)]]就足以确保Rcpp自动添加所需的标志。有关如何完成此操作的一些信息,请参见?Rcpp::Rcpp.plugin.maker

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40117544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档