0

如果我想加快下面的代码,我该怎么做?

pcg <- foreach(boot.iter=1:boot.rep) %dopar% {
d.boot<-d[in.sample[[boot.iter]],]

*here in.sample[[boot.iter]] 随机生成 1000 个行号。

我计划拆分整体任务并将单独的试验发送到每个核心。例如,

sub_task<-foreach(i=1:cores.use)%dopar%{
for (j in 1:trialsPerCore){
d.boot<-d[in.sample[[structure[i,j]]],]}}

*结构是一个矩阵,包含从 1 到 boot.rep

但这不起作用,似乎我们不能在 foreach 中使用“for”循环?此外,d.boot 仅保留每个内核的最后一次迭代。

我尝试在线搜索,发现以下代码有效,

sub_task<foreach(i=1:cores.use)%:%
foreach(j=1:trialsPerCore)%dopar%{
d.boot<-d[in.sample[[structure[i,j]]],]}

但是我觉得和我原来的功能差不多,我觉得没有很大的提升。

你们有什么建议吗?

4

1 回答 1

0

除非我遗漏了什么,否则看起来你在foreach循环中没有做太多计算。您似乎只是从创建一个矩阵列表d。除非您可以对循环中的这些矩阵执行操作,并且理想情况下从该操作返回相对较小的结果,否则这不会从并行计算中受益。

尽管“分块”通常有助于更有效地执行并行循环,但我认为它在这里没有帮助。通信可能会更有效一些,但您仍然只是进行大量通信而基本上没有计算。

请注意,您的分块尝试不起作用,因为for循环中的foreach循环重复地将矩阵分配给同一个变量。然后,for循环本身返回 aNULL作为foreach循环体,因此这sub_task是一个 NULL 列表。在这种情况下, Anlapply会工作得更好。

在循环中计算in.sample列表中的值会有所帮助。foreach这将减少自动导出到每个工作人员的数据量,代价是对工作人员进行更多计算,这通常是您希望在并行循环中执行的操作。至少,您可以in.sample直接迭代:

pcg <- foreach(i=in.sample) %dopar% d[i,]

在这种形式下,更明显的是没有足够的计算来保证并行计算。如果没有任何真正的计算要执行,你最好使用lapply

pcg <- lapply(in.sample, function(i) d[i,])
于 2013-07-03T12:55:18.307 回答