1

我知道我不应该嵌套并行运算符,但我的情况是我必须mclapply()在我的代码中基本上嵌套两个调用。这是因为在我的代码中,我有一个已经在其中使用的函数(我们称之为它foo()mclapply()。我想要的基本上是运行顺序版本的并行线程foo(),执行如下操作:

mclapply(X, function(x) {
  foo(x, mc.cores = 1)
},
mc.cores = 4)

我可以只运行内部mclapply()还是mc.cores = 1我应该实现一个顺序版本foo()

换句话说:mclapply(..., mc.cores = 1)行为是否完全一样lapply(...)?在这种情况下,是否存在减慢程序的并行开销?

4

1 回答 1

7

的源代码parallel::mclapply包含这段代码:

 ... 
 if (cores < 2L) 
        return(lapply(X = X, FUN = FUN, ...))
 ... 

所以我相信答案是肯定的,你应该得到和直接使用一样的结果lapply,但也有一些额外的开销。我怀疑这会非常显着地影响运行时。

该文件还指出:

细节

mclapply 是 lapply 的并行版本,前提是 mc.cores > 1:对于 mc.cores == 1,它只调用 lapply。

于 2018-06-26T10:29:50.903 回答