从 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();
}
合法的任务意图是 ref
、in
、const
、const in
和 const ref
。不支持 out
和 inout
意图作为任务意图,因为 each 任务会以未指定的顺序复制一个值,从而导致竞争条件。
有关详细信息,请参阅 Chapel language spec 的 "Task Parallelism and Synchronization" 部分中的 "Task Intents" 小节。
我想并行计算一些信息并在 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();
}
合法的任务意图是 ref
、in
、const
、const in
和 const ref
。不支持 out
和 inout
意图作为任务意图,因为 each 任务会以未指定的顺序复制一个值,从而导致竞争条件。
有关详细信息,请参阅 Chapel language spec 的 "Task Parallelism and Synchronization" 部分中的 "Task Intents" 小节。