簡體   English   中英

R限制中的並行處理

[英]Parallel processing in R limited

我使用parallel和doParallel包運行ubuntu 12.04和R 2.15.1。 當我並行運行任何東西時,我限制在100%的核心,當我應該有高達800%,因為我運行8核心。 系統監視器上顯示的是每個子進程只獲得12%。

是怎么回事限制了我的執行速度?

問題可能是R進程僅限於一個核心(並且子進程繼承了該進程)。

試試這個:

> system(sprintf("taskset -p 0xffffffff %d", Sys.getpid()))
pid 3064's current affinity mask: fff
pid 3064's new affinity mask: fff

現在,如果在您的機器上,當前關聯掩碼報告1,那么這就是問題所在。 上面的行應解決它(即第二行應報告fff(或類似)。

Simon Urbanek編寫了一個函數mcaffinity ,允許對多核進行控制。 據我所知,它仍然在R-devel。

有關詳細信息,請參閱例如關於R-sig-hpc的討論

更新,除了新國的回答:

如果您通過openblas和顯式並行化(通過parallel / snow / multicore)一起使用隱式並行化,則可能需要更改openblas使用的線程數,具體取決於您是否位於顯式並行部分內。
這是可能的(在Linux下使用openblas,我不知道任何其他通常優化的BLAS'提供線程數的功能),有關詳細信息,請參閱Simon Fuller的博客文章

我遇到了同樣的問題,因為libblas.so(.3gf)包,我不知道這是否也會導致你的問題。 R啟動時,它會調用系統中安裝的BLAS系統來進行線性代數計算。 我有libopenblas.so(.3gf)並且它使用“CPU Affinity”選項進行了高度優化,也就是說,當你進行數值向量或矩陣計算時,openblas包只會生成8個線程並使每一個線程卡在一個指定的和固定的CPU上以加速代碼。 但是,通過設置此項,系統會告知您所有CPU都非常繁忙,因此如果進一步執行並行任務,系統會嘗試將它們壓縮到一個CPU中,以便盡量不干擾繁忙的CPU。

所以這是我的解決方案有效:我下載了一個openblas包源並用文件“ Makefile.rule ”進行了編譯改變了:有一行“ #NO_AFFINITY = 1 ”我剛剛刪除了“ # ”以便在編譯之后沒有選擇親和力選項。 然后我安裝了包,問題解決了。

有關此內容的參考,請參閱https://github.com/ipython/ipython/issues/840

請注意,這是一個權衡。 刪除CPU親和力會讓你在進行數值計算時失去一些效率,這就是為什么雖然openblas維護者(張先生博士)知道這個問題,但他仍然以cpu affinity作為默認選項發布代碼。

我的猜測是你可能有錯誤的代碼。 我想發一個從網上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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM