2017-12-14 1 views
4

私はthe R package crossmatchを使用しています。これは、他のいくつかのRパッケージ(survival、nbpMatching、MASS)に依存しており、さらに多くの依存関係をインポートします。 クロスマッチパッケージは、非常に頻繁に(MCMCアルゴリズム内で)計算する必要がある、(潜在的に)大きな行列の統計的テストを実装します。実際の試験が計算される前に、私は(最後の行でcrossmatchtest()である)、いくつかの前処理ステップを計算し、次のラッパーを書いた:Rで使用するCPUの数を制御する方法は?

# wrapper function to directly call the crossmatch test with a single matrix 
# first column of the matrix must be a binary group indicator, following columns are observations 
# code is modified from the documentation of the crossmatch package 
crossmatchdata <- function(dat) { 

    # the grouping variable should be in the first column 
    z = dat[,1] 
    X = subset(dat, select = -1) 

    ## Rank based Mahalanobis distance between each pair: 
    # X <- as.matrix(X) 
    n <- dim(X)[1] 
    k <- dim(X)[2] 

    for (j in 1:k) { 
    X[, j] <- rank(X[, j]) 
    } 

    cv <- cov(X) 
    vuntied <- var(1:n) 
    rat <- sqrt(vuntied/diag(cv)) 

    cv <- diag(rat) %*% cv %*% diag(rat) 
    out <- matrix(NA, n, n) 

    icov <- ginv(cv) 
    for (i in 1:n) { 
    out[i, ] <- mahalanobis(X, X[i, ], icov, inverted = TRUE) 
    } 

    dis <- out 

    ## The cross-match test: 
    return(crossmatchtest(z, dis)) 
} 

私は行列がかなり小さい場合ことに気付きました、このテストを1つのCPUのみを使用します:

library(MASS) 
library(crossmatch) 
source("theCodeFromAbove.R") 
# create a dummy matrix 
m = cbind(c(rep(0, 100), rep(1, 100))) 
m = cbind(m, (matrix(runif(100), ncol=10, nrow=20, byrow=T))) 
while(TRUE) { crossmatchdata(m) } 

htopで監視します。私はこの行列を高めていた場合に利用できますただし、Rは、(少なくとも、それはこのようになります)など、多くのコアを使用します。

# create a dummy matrix 
m = cbind(c(rep(0, 1000), rep(1, 1000))) 
m = cbind(m, (matrix(runif(100000), ncol=1000, nrow=2000, byrow=T))) 
while(TRUE) { crossmatchdata(m) } 

私は一般的に、この並列化で元気ですが、私はなりたいですRプロセスが使用しているコアの数を手動で制御することができます。私はoptions(mc.cores = 4)を成功裏に試しました。

私が設定できる他の変数はありますか?あるいは、複数のコアを使用するパッケージを見つける最良の方法は何ですか?依存関係で

+2

まず、コードのどの部分が並列化されているかを教えてください。あなたが使っている機能はどれですか?または、RにリンクされているBLAS内の並列化は?バニラ(ベース)Rは並列化されません。 – Roland

+0

それは私の質問のポイントです:私はコードを並列化しませんでした、それはちょうど自動的に依存関係の深いどこかで発生し、私はどこを知らないのですか?私はcrossmatch、nbpMatchingとMASSのドキュメントを見て、彼らが並列化について話しているかどうかを確認しましたが、そうではありません。 編集:上記のコードは、自分のPCでこれを実行するのに十分なはずです。面白いことに、並列化はUbuntu 16.04とMacOS 10.12でのみ起こりましたが、Fedora 27では起こりませんでした。 – kartoffelsalat

答えて

1

見てみましょう:かなりの数の依存関係である

library(miniCRAN) 
tags <- "crossmatch" 
dg <- makeDepGraph(tags, enhances = FALSE, suggests = FALSE) 
set.seed(1) 
plot(dg, legendPosition = c(-1, 1), vertex.size = 20) 

resulting plot of dependencies

。一見すると、そこにはRレベルの並列化のためのパッケージはありません。コンパイルされたコードによる並列化を使用するパッケージの可能性が残されています。そのようなパッケージの1つはdata.table(他にもあるかもしれません)です。setDTthreads(1)を使用すると、並列化が無効になります。

もちろん、Rを最適化されたBLASにリンクさせることもできます。その場合、並列化は行列代数の最中に起こりそうです。

更新:

@Dirk Eddelbuettel just pointed outRhpcBLASctl及びOpenMPController BLASまたはOpenMPのが使用するコアの数を制御できるようにパッケージ。以下は、Ubuntuの16.04の下の問題の問題のために働い

:kartoffelsalatによって

編集。それはmacOSの下では動作しませんでした(どちらもパッケージOpenMPControllerを実行しませんでした)。

library(RhpcBLASctl) 
blas_set_num_threads(3) 
+0

ああ、クール、この面白いグラフのおかげで!どうやら、data.tableは私の問題の原因ではありません。なぜなら、今回はmacをロードしたときに次のように報告されるからです。「このdata.tableのインストールはOpenMPサポートを検出していません。スレッドモード。 Rが最適化されたBLASにリンクされているかどうかを調べるには、BLASに最大数のスレッドを提供する方法がありますか? – kartoffelsalat

+0

Rはどのようにインストールしましたか?それはCRAN Rですか?私はそれを最適化されたBLASにリンクしていないと思っています。 – Roland

+0

マックで私は自宅でそれをインストールしました。他のマシン(ubuntu 16.04、fedora 27)では、デフォルトのディストリビューションのソフトウェアリポジトリから来ています。 Rにリンクされたバージョンがあるかどうかを確認するコマンドはありませんか? – kartoffelsalat

関連する問題