2017-01-09 79 views
0

我是新來的並行計算的概念爲什麼增加「內核」的數量會有所不同?

(我正努力申請在其中一個循環建立幾個迴歸模型爲約1000倍的腳本,使每個預測時間基於這些模型的係數,每種情況下的數據集都太大,模型中包含虛擬代碼和權重,這會進一步減慢這個過程,因此,我試圖應用foreach而不是'for'循環。

我試圖使用doParallelforeach庫,並設置內核的數量與registerDoParallel()。我有一臺Windows 10機器。我的理解是,電話像detectCores()Sys.getenv('NUMBER_OF_PROCESSORS')將返回「邏輯處理器」,而不是內核數量:

> detectCores() 
    [1] 4 

我的任務管理器顯示這些規範

task manager

我試着實驗了與什麼是我應該用registerDoParallel()設置的「正確」(?)內核數量,並意識到它將接受任何數量。我進一步嘗試了一下,發現這甚至會有所作爲。我已經對這兩個libraries(第3頁)的創建者的腳本進行了調整,以便將不同數量的內核的串行執行與並行執行進行比較。

x <- iris[which(iris[,5] != "setosa"), c(1,5)] 
trials <- 10000 

library(foreach) 
library(doParallel) 

#detectCores() 
#Sys.getenv('NUMBER_OF_PROCESSORS') 
registerDoParallel(cores = 4) 
getDoParWorkers() 

ptimes = numeric(15) 
stimes = numeric(15) 

for (i in 1:15) { 
stime <- system.time({ 
    r <- foreach(icount(trials), .combine=cbind) %do% { 
    ind <- sample(100, 100, replace=TRUE) 
    result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) 
    coefficients(result1) 
    } 
})[3] 
stimes[i] = stime 
} 

for (i in 1:15) { 
ptime <- system.time({ 
    r <- foreach(icount(trials), .combine=cbind) %dopar% { 
    ind <- sample(100, 100, replace=TRUE) 
    result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) 
    coefficients(result1) 
    } 
})[3] 
ptimes[i] = ptime 
} 

這裏的結果,如以秒的平均時間爲一次迭代測定。它似乎有12個「核心」的甜蜜點。

過程     平均  SD
順序:53.8       5.4
「2芯」:      32.3   1.9
「4芯」:        28.7     2.6
「12-core」:    22.9     0.5
「24芯」:    27.5     1.9

我甚至比之間,比方說, 「2芯」 和 「12核」 與t檢驗平均性能並且它們不是由於機會。

我的問題是:

它是很好的做法,基於上述情況,使用可並行化代碼時,在「12芯模式」運行我的腳本?

我想使用更高性能的計算機來運行我的腳本;我是否需要重複此過程以找到最佳(=最快)的性能?

+0

如果我告訴過你,使用像Revolution R這樣的優化發行版可以在不使用任何工人的情況下將性能提高四倍?在四核機器上,大型陣列上的svd運行速度提高了7倍,因爲該函數本身使用SIMD命令和英特爾的數學庫。該代碼也很清潔 –

+1

如果我告訴你,這對革命R來說不是獨一無二的?您已經能夠將英特爾MKL與R結合至少十年。並請解釋哪些代碼更清潔。 –

+0

至於你的具體問題,除了SIMD之外,CPU還有很多技巧,比如高速緩存,預取數據和超線程。如果有的話,你的時間表明你的代碼沒有適當的優勢,甚至兩個核心 –

回答

1

實際上,在計算線程中設置相同數量的硬件(物理的,在您的示例中爲2)內核將會很不錯。


更多細節:

如果你的工作量計算密集型,多線程(不是硬件核心大)會爭奪資源和降低性能。但是,在某些情況下(如您的示例),工作負載每次計算需要大量內存訪問權限,以便讓更多線程隱藏內存延遲。實際上,CPU是以延遲爲導向的,並且可以自動隱藏延遲。在你的情況下,超過2個線程可以獲得進一步的改進,但不是太多。

因此,與每次運行時不同系統的調整時間(應該使用多少線程?)相比,在並行計算程序中使用硬件內核數量會更好。

here中介紹了與R並行計算的很好的介紹。

+0

感謝您的回答。爲了澄清並確保我遵循您的觀點,您是否會將術語「計算線程」與術語「邏輯處理器」互換使用? – Tony

+1

@Tony,實際上,計算線程是軟件級別的概念,所以它意味着你設置了多少個線程/程序,例如你已經嘗試過的2/4/12/24。另一方面,「邏輯/物理處理器」是指針對機器固定的硬件資源,例如機器中的2個物理核心和4個邏輯處理器。然後,我們考慮如何將計算線程映射到硬件核心。在這裏,我推薦ONE計算線程的策略爲一個物理核心。順便說一句,類似的[在這裏](http:// stackoverflow。com/questions/28829300/doparallel-cluster-vs-colors/34717363#34717363) – Patric

相關問題