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

Get Non-primitive Variables from within a Cobegin - Chapel

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

更准确地说,我的要求是像这样检索域(和其他非原始类型)

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

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

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

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

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

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

合法的任务意图是 refinconstconst inconst ref。不支持 outinout 意图作为任务意图,因为 each 任务会以未指定的顺序复制一个值,从而导致竞争条件。

有关详细信息,请参阅 Chapel language spec 的 "Task Parallelism and Synchronization" 部分中的 "Task Intents" 小节。