R 中的并行处理做错了吗?

Parallel processing in R done wrong?

我有一段代码正在尝试使用 foreach-package 并行处理。代码正在运行,但是当我 运行 它在一台有 4 个内核的计算机上时它需要大约 26 分钟,而当我切换到一个有 32 个内核的计算机上时,它仍然需要 13 分钟才能完成。我想知道我是否做错了什么,因为我使用了 8 倍多的内核,但只将时间减少了一半。我的代码如下所示:

no_cores <- detectCores()
cl <- makeCluster(no_cores)
registerDoParallel(cl)
Xenopus_Data <- foreach(b=1:length(newly_populated_vec),.packages = c("raster", "gdistance", "rgdal","sp")) %dopar% { Xenopus_Walk(altdata=altdata,water=water,habitat_suitability=habitat_suitability,max_range_without_water=max_range_without_water,max_range=max_range,slope=slope,Start_Pt=newly_populated_vec[b]) }
stopCluster(cl)  

对于 4 核计算机,我得到以下时间:

Time_of_Start
[1] "2016-07-12 13:07:23 CEST"
Time_of_end
[1] "2016-07-12 13:33:10 CEST"

And for the one with 32 cores:
Time_of_Start
[1] "2016-07-12 14:35:48 CEST"
Time_of_end
[1] "2016-07-12 14:48:08 CEST"

这正常吗?如果是这样,有谁知道如何另外加快速度,也许使用不同的包? 非常感谢任何类型的帮助!

编辑:这些是我按照建议应用更正后得到的时间。对于 32 核:

User      System     elapsed 
5.99       40.78      243.97

对于 4 核:

user  system  elapsed 
  1.91    0.94  991.71 

请注意,我之前通过一些循环进行了多次计算,这就是为什么计算时间大幅减少的原因,但我相信仍然可以看出两台计算机之间的差异增加了。

试试这个,如果问题解决了请告诉我:

library(doParallel)
library(foreach)
registerDoParallel(cores=detectCores())
n <- length(newly_populated_vec)
cat("\nN = ", n, " | Parallel workers count = ", getDoParWorkers(), "\n\n", sep="")

t0 <- proc.time()
Xenopus_Data <- foreach(b=1:n,.packages = c("raster", "gdistance", "rgdal","sp"), .combine=rbind) %dopar% { 
        Xenopus_Walk(
        water=water,
        altdata=altdata,
        habitat_suitability=habitat_suitability,
        max_range_without_water=max_range_without_water,
        max_range=max_range,
        slope=slope,
        Start_Pt=newly_populated_vec[b]) 
}
TIME <- proc.time() - t0

此外,尝试监控 PC/laptop 中的逻辑内核,以检查是否所有内核都参与了计算。 (Windows 的 TaskManager 和 Linux 的 htop

另请注意,内核数量加倍并不一定会带来双倍性能。