从Cobegin中获取非原始变量 - Chapel

时间:2017-04-18 11:16:50

标签: chapel

我想并行计算一些信息,并使用cobegin之外的结果。

更确切地说,我的要求是检索域(和其他非基本类型),如

var a,b: domain(1,stridable=true);
cobegin{
  a = foo1();
  b = foo2();
}
foo3(a,b);

我知道sync/single类型,但不适用于域名。

注意: 在过程参数中使用out也不起作用。

1 个答案:

答案 0 :(得分:4)

为了使写入竞争条件更加明确,并行构造中使用的变量被视为传递给具有blank意图的函数。对于大多数类型,这意味着它们可以被读取,但不能写入。

要使变量在并行语句中可修改,可以使用任务意图子句赋予它们ref意图。

cobegin with (ref a, ref b) {
  a = foo1();
  b = foo2();
}

法律任务意图包括refinconstconst inconst refoutinout意图不支持作为任务意图,因为每个任务会以未指定的顺序复制一个值,从而导致竞争条件。

有关详细信息,请参阅Chapel language spec的“任务并行和同步”部分中的“任务意图”小节。