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