2

ここここで関連する投稿を読み、ここで Dirk Eddelbuettel の講演を見ましたが、.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、スクリプトを対話的に実行すると、行に表示されます。

4

2 に答える 2

4

私は OS X マシンにアクセスできませんが、 C++ コードにProfilerStart/ProfilerStop呼び出しを追加しただけの Debian 8 で次のように動作しました (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()sourceCpprebuild = 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)

私はその場で 2 番目のステップを一緒に投げたので、それで私を判断しないでください。しかし、最近作成された(変更された)ファイルを探すために、渡したディレクトリcacheDir(私の場合)を検索しているだけです。マシンにこれらのプログラムがない場合は、Finder などを使用してファイル名を手動で取得することもできます。/tmp/profdir.so

于 2016-10-18T21:21:05.473 に答える
3

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これを実現する方法については、 を参照してください。

于 2016-10-19T18:04:29.043 に答える