parallel および doParallel パッケージを使用して、ubuntu 12.04 および R 2.15.1 を実行しています。並列で何かを実行すると、コアの 100% に制限されますが、8 コアで実行しているため、最大 800% にする必要があります。システム モニターに表示されるのは、各子プロセスが 12% しか取得していないことです。
実行速度を制限している原因は何ですか?
parallel および doParallel パッケージを使用して、ubuntu 12.04 および R 2.15.1 を実行しています。並列で何かを実行すると、コアの 100% に制限されますが、8 コアで実行しているため、最大 800% にする必要があります。システム モニターに表示されるのは、各子プロセスが 12% しか取得していないことです。
実行速度を制限している原因は何ですか?
問題は、R プロセスが 1 つのコアに制限されている (サブプロセスがそれを継承している) ことです。
これを試して:
> system(sprintf("taskset -p 0xffffffff %d", Sys.getpid()))
pid 3064's current affinity mask: fff
pid 3064's new affinity mask: fff
マシンで現在のアフィニティ マスクが 1 を報告している場合、これが問題でした。上記の行はそれを解決するはずです (つまり、2 行目は fff (または同様のもの) を報告するはずです)。
Simon Urbanek は、mcaffinity
マルチコアでこの制御を可能にする関数を書きました。私の知る限り、それはまだ R-devel にあります。
詳細については、たとえばR-sig-hpc に関するこのディスカッションを参照してください。
Xin Guoの回答への更新と追加:
openblas による暗黙的な並列化と (parallel/snow/multicore による) 明示的な並列化を一緒に使用する場合、明示的な並列部分の内部にいるかどうかに応じて、openblas が使用するスレッドの数を変更することができます。
これは可能です (Linux での openblas では、スレッド数に関数を提供する通常の最適化された BLAS を私は知りません)。詳細については、Simon Fuller のブログ投稿を参照してください。
I experienced the same problem because of the libblas.so(.3gf)
packages, and I do not know if this also causes your problem. When R
starts it calls a BLAS
system installed in your system to conduct linear algebraic computations. I have libopenblas.so(.3gf)
and it is highly optimized with the option "CPU Affinity", that is to say, when you do numerical vector or matrix computation, the openblas package will just make 8 threads and make each one of the threads stuck to one specified and fixed CPU to speed up the codes. However, by setting this, your system is then told that all the CPU's are very busy, and thus if further parallel tasks come, the system will try to squeeze them into one CPU so as to try best not to interfere the busy CPU's.
したがって、これが私の解決策でした: openblas パッケージ ソースをダウンロードし、ファイル " Makefile.rule
" を変更してコンパイルしました: 1 行 " #NO_AFFINITY = 1
" があり、" " を削除しただけ#
なので、コンパイル後にアフィニティ オプションが選択されなくなりました。その後、パッケージをインストールしたところ、問題は解決しました。
このリファレンスについては、https://github.com/ipython/ipython/issues/840を参照してください。
これはトレードオフであることに注意してください。CPU アフィニティを削除すると、数値計算を行うときに効率が低下します。そのため、openblas のメンテナ (Dr. Xianyi Zhang) は問題を認識していますが、CPU アフィニティをデフォルトのオプションとしてコードを公開しています。
おそらく間違ったコードを持っていたと思います。オンラインhttp://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/からコピーした 1 つの例を投稿したいと思います。
library(doMC)
registerDoMC()
x<- iris[which(iris[,5]!='setosa'),c(1,5)]
trials<- 10000
r<- foreach(icount(trials), .combine=cbind) %dopar% {
ind<- sample(100,100,replace=T)
result1<- glm(x[ind,2]~x[ind,1],family=binomial(logit))
coefficients(result1)
}
並列で使用するコアの数を定義できます。
options(cores=4)