私はparallelとdoParallelパッケージでubuntu 12.04とR 2.15.1を実行しています。私が何かを並行して動かすと、コアの100%に制限されます.8%のコアで実行しているので、最大800%にする必要があります。システムモニタに表示されるのは、各子プロセスがわずか12%しか得られないということです。Rでの並列処理が制限されています
私の実行速度を制限していることは何ですか?
私はparallelとdoParallelパッケージでubuntu 12.04とR 2.15.1を実行しています。私が何かを並行して動かすと、コアの100%に制限されます.8%のコアで実行しているので、最大800%にする必要があります。システムモニタに表示されるのは、各子プロセスがわずか12%しか得られないということです。Rでの並列処理が制限されています
私の実行速度を制限していることは何ですか?
libblas.so(.3gf)
パッケージのために同じ問題が発生しましたが、これが問題の原因になるかどうかはわかりません。 R
が起動すると、システムにインストールされたBLAS
システムが呼び出され、線形代数計算が実行されます。私はlibopenblas.so(.3gf)
を持っており、 "CPU Affinity"というオプションで高度に最適化されています。つまり、数値ベクトルや行列計算を行うと、openblasパッケージは8つのスレッドを作成し、それぞれのスレッドを指定されたものに固執させます。コードを高速化するために固定されたCPU。ただし、これを設定すると、すべてのCPUが非常にビジーであることがシステムに伝えられ、さらに並列処理が行われると、システムはCPUを1つのCPUに絞って、混雑していないCPUに干渉しないようにします。
これが働いていた私の解決策だった:私はopenblasパッケージソースをダウンロードし、ファイルとそれをコンパイルした「Makefile.rule
」に変更:の後にコンパイルされるようにそこに1行「#NO_AFFINITY = 1
」はあると私はちょうど削除「#
」があり、類似性オプションは選択されていません。その後、パッケージをインストールし、問題は解決されました。このの参考のために
、https://github.com/ipython/ipython/issues/840
を参照してください、これはトレードオフであることに注意してください。 CPUの親和性を削除すると、数値計算を行う際に効率が低下するため、openblasのメンテナー(Dr. Xianyi Zhang)は問題を知っていますが、引き続きデフォルトオプションとしてCPUアフィニティのコードを公開します。
はい、これも同様に起こります。 – cbeleites
私のMakefile.ruleでは、この行は既にコメントアウトされているので、NO_AFFINITY = 1でコンパイルされていますが、まだ私の問題は残っています – Lindon
こんにちはLindon、コンパイルしたソースファイル'' sudo update-alternatives --config libblas.so.3gf''と '' sudo ''を使っている場合は、makefileはマルチスレッドを使用して出力が非常に速くスクロールするはずです) update-alternatives --config libblas.so''を実行すると、現在のblasは実際にopenblasシステムになりますか?うまくいけば、これは役に立ちます。 –
問題は、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報告し、その後、これが問題でした。上記の行は、それを解決する(すなわち二行目)がFFF(または類似を報告する必要があります。サイモンUrbanekは、マルチコアのために、このコントロールを可能にする機能mcaffinity
を書いた
。私の知る限りでは、それはR-develの中ではまだです。
必要があります。詳細については、このdiscussion on R-sig-hpc例えば
の更新を参照してください、そして新郭の回答に加えて:
あなたが一緒に(パラレル/雪/マルチコア経由)openblasと明示的並列化を経由して、暗黙的な並列化を使用する場合は、あなたがかもしれませんopenblasが使用するスレッドの数を変更したいあなたが明示的に並行している部分の中にいるかどうかを調べる。
これは可能です(Linuxではopenblasで、スレッド数に関数を提供する通常の最適化されたBLASは認識していません)。詳細はSimon Fuller's blog postを参照してください。
おそらく間違ったコードがあったと思います。私はオンラインhttp://www.r-bloggers.com/parallel-r-loops-for-windows-and-linux/からコピーされた一例投稿したいと思います:
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)
しかし、彼はそれぞれ12%のCPU使用量を持つ8つの子プロセスを見ると報告しています。 – cbeleites
あなたはより多くのコードを投稿する必要がありますあなたは確かに知っているために実行している。しかし、ubuntu 12.04では、私はこの問題はまったく持っておらず、24コアを100%何回もうまく固定しています。 – Justin
特定のコードに固有のものではありません。 –
それから私はあまり助けられません。それは私のために働くので! 'doMC'パッケージを試してみることもできます...' doParallel'を使っている方法と使用している実装( '' plyr''から 'foreach''''parallel'?)を見ることなく、誰もが助けることができると思う。 – Justin