2017-11-22 7 views
-1

ベースRは計算の高速化にBLASを使用することが知られています。私のコードでは、基底Rからそれらの関数を使いたいし、BLASを使うパッケージかもしれません。 BLASを正確に使用するR関数のリストを取得するにはどうすればよいですか?または、私のコードで使用したい機能がBLAS(ATLAS、LAPACKなど)を使用しているかどうかをどうやって確認できますか?どのR関数がBLAS(ATLAS、LAPACKなど)に基づいていますか?

+0

、私はあなたがBLASルーチンを使用してのかなり良いチャンスだと思います。 [The R inferno、第3章「ベクトル化に失敗する」](http://www.burns-stat.com/pages/Tutor/R_inferno.pdf)と[ベクター化に関するSOの質問](https://あなたの特定の問題を見つけるためには、stackoverflow.com/questions/tagged/vectorization+r)。 – akraf

答えて

0

私はこれについて専門家ではないので、これは完全な答えではありません。しかし、多分あなたや他の誰かがこれらの出発いくつかのアイデアを取ると、それからソリューションを作成することができます(あなたがしていることを投稿することができれば素晴らしいだろう!)

それらが定義されている場合はRの機能を点検C

でのみ機能Cコードを呼び出すBLASを使用するための疑いがあります。したがって、これらの機能を見つけることが第一歩になります。

capture.output(print(FUN))ので.Internalの観点で定義されているすべての機能を一覧表示するにはあなたの文字列ベクトル(1行につき1つの要素)としての機能の定義を与え、.Primitiveなど次のようにします。

# Set this to the package you want to screen 
envName <- 'base' 
# Get the environment for the given name 
env <- pos.to.env(which(search() == paste0('package:',envName))) 
# Return TRUE if `string` contains `what` 
contains <- function(string, what){ 
    length(grep(what, string, fixed = TRUE)) != 0 
} 
# Build up a matrix which contains true if an element is defined in terms 
# of the following functions which indicate calls to C code 
signalWords <- c('.Primitive', '.Internal', '.External' 
       , '.Call'  , '.C'  , '.Fortran') 
envElements <- ls(envir = env) 
funTraits <- matrix(FALSE, nrow = length(envElements), ncol = length(signalWords), 
        dimnames = list(envElements, signalWords)) 
# Fill up the values of the matrix by reading each elements' definition 
for (elementName in envElements){ 
    element <- get(elementName, envir = env) 
    if(!is.function(element)){ 
    next 
    } 
    fun.definition <- capture.output(print(element)) 
    for(s in signalWords){ 
    if(contains(fun.definition, s)){ 
     funTraits[elementName, s] <- TRUE 
    } 
    } 
} 

とき関数は次のようになり、外部のC関数(.Primitive関数とは対照的に)呼び出し:

dnorm 
## function (x, mean = 0, sd = 1, log = FALSE) 
## .External(C_dnorm, x, mean, sd, log) 
## <bytecode: 0x1b1eebfc> 
## <environment: namespace:stats> 

そして.Externalによって呼び出されたオブジェクトを追い詰めます。対応するC関数の名前を持ちます。それを見つけるためにPACKAGE:::OBJECT$nameを使用します。

stats:::C_dnorm$name 
## [1] "dnorm" 

はさらに参照:コンパイルされた関数のソースコードの入手先についてHow can I view the source code for a function?、それはまたの情報、およびHow to see the source code of R .Internal or .Primitive function?

最後に、あなたは何とかCコードを選別する必要がありますし、それはBLASルーチンを求めて、すべての機能... BLAS関数は

呼び出された場合は、BLASの名前を持っていますが、ちょうどそれをログに記録するDLLを開発する可能性がログに記録

LD_PRELOAD何か実際のBLASルーチンにコールを転送する前にどこから呼び出されたのかを確認します。LD_PRELOAD BLASではなく、このライブラリをロードするためにUNIX環境変数を使用できます。これは、動的にリンクされたライブラリとしてBLASをロードするためにRがコンパイルされた場合にのみ機能します。

https://blog.netspi.com/function-hooking-part-i-hooking-shared-library-function-calls-in-linux/

も参照してください:あなたはベクトル化操作によって、あなたの計算を行った場合Why can R be linked to a shared BLAS later even if it was built with `--with-blas = lblas`?

関連する問題