我想并行计算一些信息,并使用cobegin
之外的结果。
更确切地说,我的要求是检索域(和其他非基本类型),如
var a,b: domain(1,stridable=true);
cobegin{
a = foo1();
b = foo2();
}
foo3(a,b);
我知道sync/single
类型,但不适用于域名。
注意:
在过程参数中使用out
也不起作用。
答案 0 :(得分:4)
为了使写入竞争条件更加明确,并行构造中使用的变量被视为传递给具有blank
意图的函数。对于大多数类型,这意味着它们可以被读取,但不能写入。
要使变量在并行语句中可修改,可以使用任务意图子句赋予它们ref
意图。
cobegin with (ref a, ref b) {
a = foo1();
b = foo2();
}
法律任务意图包括ref
,in
,const
,const in
和const ref
。 out
和inout
意图不支持作为任务意图,因为每个任务会以未指定的顺序复制一个值,从而导致竞争条件。
有关详细信息,请参阅Chapel language spec的“任务并行和同步”部分中的“任务意图”小节。