C++ 让gperftools与Rcpp一起工作

C++ 让gperftools与Rcpp一起工作,c++,r,rcpp,gperftools,C++,R,Rcpp,Gperftools,我读过相关的帖子和文章,看过德克·埃德尔布埃特尔的演讲,但我甚至无法从gperftools获取.log文件。这是我的R文件,名为Rcpp\u practice.R: library(Rcpp) Sys.setenv("PKG_LIBS"="-lprofiler") sourceCpp('eigen.cpp') a <- matrix(rnorm(300^2), 300, 300) getEigenValues(a) 然后,在终端上(我正在使用OSX): 我希望看到eigenprof.

我读过相关的帖子和文章,看过德克·埃德尔布埃特尔的演讲,但我甚至无法从
gperftools
获取.log文件。这是我的
R
文件,名为
Rcpp\u practice.R

library(Rcpp)

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

a <- matrix(rnorm(300^2), 300, 300)
getEigenValues(a)
然后,在终端上(我正在使用OSX):

我希望看到
eigenprof.log
位于我的工作目录中,但我没有。此外,我没有收到我在其他帖子中看到的信息,这些帖子的形式是
PROFILE:interrupts/executions/bytes=012/34/567891

我已验证是否安装了最新版本的
gperftools
。(
$brew upgrade google perftools
给出
错误:gperftools 2.5已安装

我错过了什么

更新

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

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

<>这条代码与“代码> SooCeCpp< <代码>交互,如果我运行脚本的话,

< p>我不能访问一个OS X机器,但是下面的工作是在Debian 8上,在这里我刚刚添加了<代码> PrruleRealSt/<代码> PrimuleSturt调用C++代码(并且根本没有改变你的R代码):


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

sourceCpp(
    'eigen-prof.cpp',
    verbose = TRUE,
    rebuild = TRUE,
    cacheDir = "/tmp/profdir"
)
其中,我使用
cacheDir=“/tmp/profdir”
覆盖
sourceCpp
用于构建共享库的默认随机目录(
tempdir()
);和
rebuild=TRUE
,以确保每次运行都会生成一个新的
。因此

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

  • R-f eigen-prof.R
  • so|u file=$(find/tmp/profdir/-iname'*.so'-printf“%T+\T%p\n”| sort-r | head-n1 | awk'{print$2})
  • google-pprof--text$so_文件eigen-prof.log
这给了我

# 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等手动获取文件名。如果您的计算机缺少这些程序中的任何一个。

在OS X上,我在天真地尝试编译代码时看到了相同的错误:

> 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 perftools库所需的信息。向链接器调用中添加
-lprofiler
位就足以解决此问题--最简单的方法是向
~/.R/Makevars
中添加如下内容:

LDFLAGS = -L/usr/local/lib -lprofiler
假设您安装了Google perftools,并以标准方式将其符号链接到
/usr/local


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

您只显示了部分命令。这肯定在许多卫星之前就已经起作用了,现在也应该如此。我要做的是在一个C++文件中从最小的<代码>()/<代码>中回溯,确保我已经把所有的编译和链接标志和选项分类了,然后把它带到基于RCPP的构建中。“这东西插进去了吗?”这至少会给我一个新的错误。它是巨大的,但在dyn.load中开始出现
错误
,包括
无法加载共享对象'/a/long/path/sourceCpp_2。因此
以及
在:平面名称空间中预期。
sourceCpp(
    'eigen-prof.cpp',
    verbose = TRUE,
    rebuild = TRUE,
    cacheDir = "/tmp/profdir"
)
# 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)
> 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
LDFLAGS = -L/usr/local/lib -lprofiler