2015-03-03 128 views
9

使用doParallel包時registerDoParallel中羣集和內核之間有什麼區別?doParallel,羣集vs內核

我的理解是正確的,單臺機器上,這些是可以互換的,我會得到相同的結果:

cl <- makeCluster(4) 
registerDoParallel(cl)  

registerDoParallel(cores = 4) 

唯一的區別我看到makeCluster(),必須明確停止使用stopCluster()

+0

不確定,但我想你會受到內核數量的限制,但不受簇數量的限制,即「並行運行並通過套接字進行通信的R副本數」。當然,集羣可能會共享相同的核心,具體取決於集羣數量/內核數量。 – 2015-03-03 10:34:50

+1

我傾向於同意@Pascal,並且在單個機器上沒有任何區別,除了實際嘗試能夠實現什麼以及如何工作。如果你只是想對一些代碼進行並行處理,那麼這兩種方法都不應該有問題。 – LauriK 2015-03-03 11:22:52

回答

5

是的,它從軟件視圖來看是正確的。

單機上這些是可以互換的,我會得到相同的結果。


要了解「集羣」和「核心」顯然,我建議從「硬件」和「軟件」水平思考。

在硬件層面上,'cluster'表示可以通過socket之類的通信協同工作的網絡連接機器(需要更多初始化/停止操作,如您指出的那樣,請指定stopCluster)。雖然「核心」意味着本地CPU中的多個硬件核心,並且它們通常通過共享存儲器一起工作(不需要從A到B明確地發送消息)。

在軟件層面上,有時候clustercores的邊界不太清楚。該程序可以通過核心本地運行,也可以通過羣集遠程運行,高級軟件無需知道詳細信息。因此,我們可以混合使用兩種模式,例如在本地使用顯式通信,在一臺機器上設置cl, ,並且還可以在每臺遠程機器上運行多核。


回到你的問題,是設置clcores平等的嗎?

從軟件來看,程序將運行相同數量的客戶端/服務器,然後得到相同的結果。

從硬件來看,可能會有所不同。 cl表示明確通信,cores表示共享內存,但是如果高級軟件優化得非常好。在本地機器中,兩種設置都將進入相同的流程。我現在不深究doParallel,所以我不太確定這兩者是否相同。

但實際上,最好指定cores爲單機,cl爲羣集。

希望爲您提供幫助。

+0

這太籠統了。 OP的問題是關於doParallel包的具體問題,而不是一般概念問題。對於這個問題,它更多的是關於平臺實現,甚至對於單機也是不同的。 – dracodoc 2017-07-12 19:27:09

1

我認爲所選答案過於籠統,實際上並不準確,因爲它沒有涉及到包裝本身的細節doParallel。如果你看過這些小插曲,那其實很清楚。

並行包基本上是多核 包,寫由西蒙Urbanek的合併,雪包, 寫由盧克·蒂爾尼等。多核 功能僅支持那些支持fork系統調用的操作系統的多個worker;這不包括Windows。默認情況下,doParallel在類Unix系統上使用多核功能 和Windows上的積雪功能。

我們將在這個小品用雪一樣的功能,所以我們通過 開始加載包和啓動集羣

要使用多核一樣的功能,我們將指定 核心的數量,而不是使用

總之,這是依賴於系統的。集羣是覆蓋所有平臺的更一般模式,而核心僅適用於類Unix系統。

爲了使接口一致,包使用相同的功能這兩種模式。

> library(doParallel) 
> cl <- makeCluster(4) 
> registerDoParallel(cl) 
> getDoParName() 
[1] "doParallelSNOW" 

> registerDoParallel(cores=4) 
> getDoParName() 
[1] "doParallelMC" 
3

doParallel::registerDoParallel(<numeric>)行爲依賴於操作系統,看print(doParallel::registerDoParallel)瞭解詳情。

在Windows計算機上,

doParallel::registerDoParallel(4) 

有效呢

cl <- makeCluster(4) 
doParallel::registerDoParallel(cl) 

,即它成立四年( 「PSOCK」),在後臺的R會話運行工人。那麼,%dopar%將基本上利用parallel::parLapply()機器。通過這種設置,您不必擔心每個工作人員都會附加全局變量和軟件包。

然而,在非Windows機器,

doParallel::registerDoParallel(4) 

的結果將是%dopar%將利用parallel::mclapply()機械,而這又依賴於分叉過程。由於使用了分叉,所以您不必擔心全局和包。