我是新來張貼在這裏 - 我搜索並找不到我的問題的答案。我在兩臺不同的機器上使用parallel
軟件包運行以下R並行代碼(來自R中並行計算的blog),但仍得到非常不同的處理時間結果。第一臺機器是具有Windows 8,8GB RAM,Intel i7,2核/ 4個邏輯處理器的聯想筆記本電腦。第二臺機器是戴爾臺式機,Windows 7,16GB RAM,Intel i7,4核/ 8個邏輯處理器。代碼有時在第二臺機器上運行速度要慢得多。我相信原因是第二臺機器沒有使用工作節點來完成任務。當我使用snow
包中的函數snow.time()來檢查節點使用情況時,第一臺機器正在使用所有可用的工作人員來完成任務。但是,在功能更強大的機器上,它從不使用工人 - 整個任務由主人處理。爲什麼第一臺機器使用工人,但第二臺機器沒有完全相同的代碼?我如何「強制」第二臺機器使用可用的工人,以便代碼真正並行化並且處理時間加快了?這些答案可以幫助我完成我正在做的其他工作。提前致謝。從功能snow.time()
的圖表低於還有我使用的代碼:
如何強迫閒散人員同時兼任R?
runs <- 1e7
manyruns <- function(n) mean(unlist(lapply(X=1:(runs/4), FUN=onerun)))
library(parallel)
cores <- 4
cl <- makeCluster(cores)
# Send function to workers
tobeignored <- clusterEvalQ(cl, {
onerun <- function(.){ # Function of no arguments
doors <- 1:3
prize.door <- sample(doors, size=1)
choice <- sample(doors, size=1)
if (choice==prize.door) return(0) else return(1) # Always switch
}
; NULL
})
# Send runs to the workers
tobeignored <- clusterEvalQ(cl, {runs <- 1e7; NULL})
runtime <- snow.time(avg <- mean(unlist(clusterApply(cl=cl, x=rep(runs, 4), fun=manyruns))))
stopCluster(cl)
plot(runtime)
你可以檢查你的任務管理器,看看工作人員在做什麼?我修改了一下代碼,好像它們都很忙(儘管在linux上)。 –
任務管理器按預期顯示了4個R會話,每個會話的CPU級別爲13。但是snow.time()繼續表明只有主人用於處理,桌面時間比筆記本電腦更長(229秒)(使用所有4個核心的時間爲5.3秒)。我應該在任務管理器中尋找其他東西嗎? – KUZ
現在只有手機。 a)制定明確的集羣類型(mpi,socket)。我在Linux上看到了fork集羣的這種行爲。 b)簡化代碼,刪除clusterEval,僅保留makeCluster和parLapply。 c)重啓R. –