KUZ*_*KUZ 5 parallel-processing multithreading r
我是新来的人-我已搜索但找不到问题的答案。我已经在两台不同的机器上使用该程序包运行了以下R并行化代码(来自R并行计算博客)parallel,但是得到的处理时间却截然不同。第一台机器是带有Windows 8、8GB RAM,Intel i7、2核/ 4逻辑处理器的Lenovo笔记本电脑。第二台计算机是Dell台式机,Windows 7、16GB RAM,Intel i7、4核/ 8逻辑处理器。该代码有时在第二台计算机上运行得慢得多。我相信原因是第二台计算机未使用工作程序节点来完成任务。当我使用功能中的snow.time()snow包以检查节点使用情况,第一台计算机正在使用所有可用的工作程序来完成任务。但是,在功能更强大的计算机上,它从不使用工人-整个任务由主服务器处理。为什么第一台机器使用工人,而第二台机器没有完全相同的代码?以及如何“强制”第二台机器使用可用的工作程序,以使代码真正地并行化并加快处理时间?这些问题的答案将极大地帮助我完成我正在从事的其他工作。提前致谢。snow.time()下面是该函数的图形以及我使用的代码:

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)
Run Code Online (Sandbox Code Playgroud)
尝试clusterApplyLB代替clusterApply。“ LB”用于负载平衡。
非LB版本在节点之间划分任务数,并分批发送它们,但是如果一个节点提早完成,则它会空闲等待其他节点。
LB版本向每个节点发送一个任务,然后监视节点,当节点完成时,它将向该节点发送另一个任务,直到分配了所有任务。如果每个任务的时间变化很大,则效率更高;但是,如果所有任务都花费相同的时间量,效率将会更低。
还要检查R和parallel的版本。如果我没有记错的话,该clusterApply函数曾经在Windows机器上不可以并行执行操作(但是我再也看不到该注释,所以在最近的版本中可能已经解决了),所以区别可能是并行的不同版本包。该parLapply函数没有相同的问题,因此您可以重写代码以使用它,以查看是否有所作为。
我认为不可能snow.timing在从并行包获取所有其他功能的同时使用 Snow 包中的功能。R 3.2.3 中的并行源有一些用于计时的占位符代码,但它似乎并不完整或与snow.timing雪中的功能兼容。我认为您仍然会得到正确的结果clusterApply,但返回的对象snow.time将相当于执行:
runtime <- snow.time(Sys.sleep(20))
Run Code Online (Sandbox Code Playgroud)
如果你想使用snow.timing,我建议只加载雪,尽管你仍然可以访问detectCores使用语法等功能parallel::detectCores()。
我真的不知道为什么你的脚本偶尔在桌面计算机上运行缓慢,但我认为你并行化它的方式是合理且正确的。您可能需要manyruns在两台机器上依次尝试进行基准测试,以排除两个系统上随机数生成代码的任何差异。但问题可能是由系统服务导致整个系统变慢。
| 归档时间: |
|
| 查看次数: |
803 次 |
| 最近记录: |