2

我有一个代码,我正在尝试使用 foreach 包并行处理。代码可以运行,但是当我在 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 

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

4

1 回答 1

1

试试这个,让我知道你的问题是否解决了:

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/笔记本电脑中的逻辑内核,以检查是否所有内核都参与了计算。(Windows 和htopLinux 的任务管理器)

另请注意,核心数量翻倍并不一定会导致性能翻倍。

于 2016-07-12T13:47:50.250 回答