我是新來的並行計算的概念爲什麼增加「內核」的數量會有所不同?
(我正努力申請在其中一個循環建立幾個迴歸模型爲約1000倍的腳本,使每個預測時間基於這些模型的係數,每種情況下的數據集都太大,模型中包含虛擬代碼和權重,這會進一步減慢這個過程,因此,我試圖應用foreach而不是'for'循環。
我試圖使用
doParallel
和foreach
庫,並設置內核的數量與registerDoParallel()
。我有一臺Windows 10機器。我的理解是,電話像detectCores()
和Sys.getenv('NUMBER_OF_PROCESSORS')
將返回「邏輯處理器」,而不是內核數量:> detectCores() [1] 4
我的任務管理器顯示這些規範
我試着實驗了與什麼是我應該用
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芯模式」運行我的腳本?
我想使用更高性能的計算機來運行我的腳本;我是否需要重複此過程以找到最佳(=最快)的性能?
如果我告訴過你,使用像Revolution R這樣的優化發行版可以在不使用任何工人的情況下將性能提高四倍?在四核機器上,大型陣列上的svd運行速度提高了7倍,因爲該函數本身使用SIMD命令和英特爾的數學庫。該代碼也很清潔 –
如果我告訴你,這對革命R來說不是獨一無二的?您已經能夠將英特爾MKL與R結合至少十年。並請解釋哪些代碼更清潔。 –
至於你的具體問題,除了SIMD之外,CPU還有很多技巧,比如高速緩存,預取數據和超線程。如果有的話,你的時間表明你的代碼沒有適當的優勢,甚至兩個核心 –