多核编程:使用包`parallel`的主/从系统

时间:2013-03-15 20:35:59

标签: r parallel-processing

这个问题没有答案 在R?中并行化矢量化函数的最简单方法是什么?因为我不是要求一个简单的方法,而是通过主/从系统对进程执行什么以及何时死亡进行额外控制。

以下是我的问题:我成功使用mcparallelmccollect来并行化某些任务,沿着以下行(X是一个列表):

p1 <- mcparallel( lapply( X[1:25],  function(x) my.function(x, theta) ) )
p2 <- mcparallel( lapply( X[26:50], function(x) my.function(x, theta) ) )
p3 <- mcparallel( lapply( X[51:75], function(x) my.function(x, theta) ) )
x4 <- lapply(X[76:100], function(x) my.function(x, theta) )

c( mccollect(p1), mccollect(p2), mccollect(p3), x4 )

X的元素很大,参数theta很小,目的是在theta上执行优化。请注意mclapply(X, ...)对我的问题执行非常(几乎没有时间)。我还尝试了%dopar%套餐中的foreach:根本没有获得任何时间!

为了减少开销并避免每次计算时出现新的分支,我想使用this Rmpi tutorial中举例说明的主/从逻辑。我可以为从属服务器提供theta的新值,这样可以避免每次新计算时出现新的分支,并且(我猜)在每个新的分支上复制整个内存,等等。由于theta很小,my.function的结果也很小,因此进程之间的计算速度很快,这将允许在后续计算中获得大量时间。

但是,我被告知MPI是一种更适合使用多台计算机的协议。我使用多核计算机(16核),我被告知更轻的协议适合。

你能给我一个建议吗?特别是,是否可以使用parallel包在多核计算机上实现主/从系统?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案。

> library('parallel')
> makeCluster(2) -> cl
> # loading data to nodes:
> invisible(clusterApply( cl, 4:5, function(t) a <<- t ))
> # computations on these data with different arguments
> clusterApply( cl, 1:2, function(t) a+t )
[[1]]
[1] 5

[[2]]
[1] 7
> clusterApply( cl, 10:11, function(t) a+t )
[[1]]
[1] 14

[[2]]
[1] 16
> stopCluster(cl)

我认为它会做我想要的,但我仍然在等待其他建议(因此我不接受我自己的答案)。

相关问题