如何修改%dopar%block的共享变量?

时间:2016-01-08 14:44:42

标签: r multithreading

我想在R中计算时使用多个CPU。到目前为止,我已尝试foreach方法。我知道它可能返回我需要的值,但是,我想知道我是否能以某种方式直接修改共享变量。

这是我想要实现的一个例子 - result变量应该有一个增加的对角线。请注意,这是一个说明性示例 - 实际上我需要计算大约十几个可变维度的矩阵,并且解析foreach的输出将非常困难。计算大约需要一个小时,难以调试。

library("doParallel")
library("foreach")

cluster <- makeCluster(4)
registerDoParallel(cluster)

result = matrix(nrow=5, ncol=5)

foreach (i = 1:5)  %dopar% {
    result[[i, i]] <<- i
}

您能否建议我应该使用哪些运算符/函数/包来实现这种行为,即从某些并行代码块修改共享变量?我们假设没有碰撞和/或竞争条件。

1 个答案:

答案 0 :(得分:0)

我认为%dopar%首先将共享变量的副本发送到每个群集节点。除非你再次运行%dopar%,否则基本上无法更改它们。

如果您需要计算多个矩阵,您可以在每个群集节点上计算一个完整的矩阵,因此您不必在群集节点之间共享变量。