Я прочитал похожие посты Вот а также Вот, и посмотрел на выступление Дирка Эддельбюттеля Вот и все же я не могу даже получить файл .log от gperftools
, Вот мой R
файл, называемый Rcpp_practice.R
:
library(Rcpp)
Sys.setenv("PKG_LIBS"="-lprofiler")
sourceCpp('eigen.cpp')
a <- matrix(rnorm(300^2), 300, 300)
getEigenValues(a)
Вот содержимое eigen.cpp
:
#include <RcppArmadillo.h>
#include <gperftools/profiler.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec getEigenValues(arma::mat M) {
return arma::eig_sym(M);
}
Затем на терминале (я использую OSX):
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, я получаю это сообщение об ошибке:
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
если я запускаю скрипт в интерактивном режиме.
У меня нет доступа к машине с OS X, но следующее работает в Debian 8, где я только что добавил ProfilerStart
/ ProfilerStop
вызовы вашего кода C ++ (и вообще не изменили код R):
// [[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();
}
¹Смотрите обновление ниже.
Затем из терминала,
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
позвонить
sourceCpp(
'eigen-prof.cpp',
verbose = TRUE,
rebuild = TRUE,
cacheDir = "/tmp/profdir")
где я использую cacheDir = "/tmp/profdir"
переопределить случайный каталог по умолчанию (tempdir()
) тот sourceCpp
использует для создания общей библиотеки; а также rebuild = TRUE
чтобы убедиться, что новый .so
генерируется при каждом запуске.
Вернувшись в свою оболочку, запустите эти команды, подставив соответствующий файл & имена каталогов по мере необходимости:
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
Это дает мне
# 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
для некоторой информации о том, как это может быть достигнуто.