使用doParallel包時registerDoParallel
中羣集和內核之間有什麼區別?doParallel,羣集vs內核
我的理解是正確的,單臺機器上,這些是可以互換的,我會得到相同的結果:
cl <- makeCluster(4)
registerDoParallel(cl)
和
registerDoParallel(cores = 4)
唯一的區別我看到makeCluster()
,必須明確停止使用stopCluster()
。
使用doParallel包時registerDoParallel
中羣集和內核之間有什麼區別?doParallel,羣集vs內核
我的理解是正確的,單臺機器上,這些是可以互換的,我會得到相同的結果:
cl <- makeCluster(4)
registerDoParallel(cl)
和
registerDoParallel(cores = 4)
唯一的區別我看到makeCluster()
,必須明確停止使用stopCluster()
。
是的,它從軟件視圖來看是正確的。
單機上這些是可以互換的,我會得到相同的結果。
要了解「集羣」和「核心」顯然,我建議從「硬件」和「軟件」水平思考。
在硬件層面上,'cluster'表示可以通過socket之類的通信協同工作的網絡連接機器(需要更多初始化/停止操作,如您指出的那樣,請指定stopCluster
)。雖然「核心」意味着本地CPU中的多個硬件核心,並且它們通常通過共享存儲器一起工作(不需要從A到B明確地發送消息)。
在軟件層面上,有時候cluster
和cores
的邊界不太清楚。該程序可以通過核心本地運行,也可以通過羣集遠程運行,高級軟件無需知道詳細信息。因此,我們可以混合使用兩種模式,例如在本地使用顯式通信,在一臺機器上設置cl
, ,並且還可以在每臺遠程機器上運行多核。
回到你的問題,是設置cl
或cores
平等的嗎?
從軟件來看,程序將運行相同數量的客戶端/服務器,然後得到相同的結果。
從硬件來看,可能會有所不同。 cl
表示明確通信,cores
表示共享內存,但是如果高級軟件優化得非常好。在本地機器中,兩種設置都將進入相同的流程。我現在不深究doParallel
,所以我不太確定這兩者是否相同。
但實際上,最好指定cores
爲單機,cl
爲羣集。
希望爲您提供幫助。
這太籠統了。 OP的問題是關於doParallel包的具體問題,而不是一般概念問題。對於這個問題,它更多的是關於平臺實現,甚至對於單機也是不同的。 – dracodoc 2017-07-12 19:27:09
我認爲所選答案過於籠統,實際上並不準確,因爲它沒有涉及到包裝本身的細節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"
的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()
機械,而這又依賴於分叉過程。由於使用了分叉,所以您不必擔心全局和包。
不確定,但我想你會受到內核數量的限制,但不受簇數量的限制,即「並行運行並通過套接字進行通信的R副本數」。當然,集羣可能會共享相同的核心,具體取決於集羣數量/內核數量。 – 2015-03-03 10:34:50
我傾向於同意@Pascal,並且在單個機器上沒有任何區別,除了實際嘗試能夠實現什麼以及如何工作。如果你只是想對一些代碼進行並行處理,那麼這兩種方法都不應該有問題。 – LauriK 2015-03-03 11:22:52