我想运行一个函数100次。该函数本身包含一个for循环,需要运行4000次。我将我的代码在线放置在EC2上以在多个内核上运行,但是不确定我是否做得正确,因为它无法显示其是否真正利用了所有内核。下面的代码有意义吗?
#arbitrary function:
x = function() {
y=c()
for(i in 1:4000){
y=c(y,i)
}
return(y)
}
#helper Function
loop.helper<-function(n.times){
results = list()
for(i in 1:n.times){
results[[i]] = x()
}
return(results)
}
#Parallel
require(foreach)
require(parallel)
require(doParallel)
cores = detectCores() #32
cl<-makeCluster(cores) #register cores
registerDoParallel(cl, cores = cores)
这是我的问题,我不确定是否应该这样:
out <- foreach(i=1:cores) %dopar% {
helper(n.times = 100)
}
还是应该这样:
out <- foreach(i=1:100) %dopar% {
x()
}
它们都可以工作,但是我不确定第一个将任务分配给我拥有的32个内核,还是在第二个foreach
循环实现中自动执行。
谢谢
out <- foreach(i=1:100) %dopar% {
x()
}
是正确的方法。该foreach
软件包将自动在已注册的内核之间分配100个任务(在您的情况下为32个内核)。
如果您阅读了包装文档,则可以阅读其中的一些示例,这对您来说应该格外清晰。
编辑:
要回复@ user1234440的评论:
一些注意事项:
需要花费一些时间来设置和管理并行任务(例如,设置多个作业以同时运行,然后在最后合并结果)。对于某些琐碎的任务或小的工作,有时运行并行进程比简单的顺序循环要花更长的时间,这仅仅是因为设置并行进程所花费的时间超过了所节省的时间。但是,对于大多数需要一些非平凡计算的任务,您可能会体验到速度的提高。
另外,根据我的阅读,随着使用更多内核,您将看到收益递减(例如,使用8个内核可能不一定比使用4个内核快2倍,但可能仅快1.5倍)。另外,根据我的个人经验,使用系统上所有可用的内核都会导致性能下降。我认为这是因为我将所有系统资源专用于并行作业,并且这减慢了我的其他系统进程。
话虽如此,当我使用该foreach
功能提供的并行处理功能时,我几乎总是体验到速度的提高。以运行32个核心的100个作业为例,4个核心将接收4个作业,而其他28个核心将接收3个作业。现在,好像32台计算机正在运行小型for
循环,遍历分配给每个内核的4或3个作业。每个循环完成后,结果将合并并返回给您。
如果使用简单for
循环比并行foreach
循环更快地完成100个任务,那么在常规for
循环中运行这100个任务4000次将比在并行化foreach
循环中运行100个任务快4000次。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句