2

我想并行计算一些信息并在cobegin.

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

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

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

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

4

1 回答 1

4

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

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

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

法定任务意图是refinconst和。不支持and意图作为任务意图,因为每个任务都会以未指定的顺序复制一个值,从而导致竞争条件。const inconst refoutinout

有关更多详细信息,请参阅Chapel 语言规范的“任务并行和同步”部分中的“任务意图”小节。

于 2017-04-18T13:28:08.587 回答