如何找出执行哪些迭代的任务 forall loop?
例如,我想了解不同的DynamicIters的行为,
use DynamicIters;
var r = 1..1000;
var A: [r] int;
forall i in adaptive(r) {
A[i] = ???;
}
我可以使用here.id
来发现forall循环所放置的语言环境
迭代,但我不知道如何"看"内在的任务是什么
locale每次迭代都被分配给。
答案 0 :(得分:2)
Chapel的设计有意避免支持标准的语言级方式来查询任务的ID,因为我们并不希望它强加任何可能需要的特定编号或开销来维护任务ID。功能跨越不同的底层运行时/ OS /硬件选择。在编写 coforall
循环时,创建虚拟任务ID的标准技巧是执行以下操作:
coforall (i, tid) in zip(myIter(), 0..) do
由于循环的每次迭代都作为单独的任务执行,tid
将从0
开始唯一地对每个循环进行编号。但正如您所注意到的那样,因为在使用 forall
循环时,任务创建被抽象为迭代器,所以它们不具有直接的等价物 - 您可以通常需要修改驱动循环的并行迭代器中的任务并行结构,以便推断正在创建哪些任务以及它们正在做什么。
在您非常好奇的 DynamicIters
模块的特定情况下,有一个名为{{ config
的参数1}}支持打印有关正在进行的操作的信息,因此如果您使用debugDynamicIters
编译程序,您将了解任务的进展情况。当然,您也可以修改迭代器本身(位于-sdebugDynamicIters=true
)以添加其他调试打印。
可以超出语言并访问运行时使用的任务ID,但不能保证它可以跨不同的运行时任务选项(例如,qthreads,fifo,largethreads)移植,也不能保证它将继续适用于未来版本的Chapel。例如,在Chapel 1.15.0中,以下代码有效:
$CHPL_HOME/modules/standard/DynamicIters.chpl
类型 extern proc chpl_task_getId(): chpl_taskID_t;
forall i in adaptive(r) do
writeln("task ", chpl_task_getId(), " owns iter ", i);
是一种不透明的类型,它是实施的内部类型,因此可以打印出来,但不保证它会有任务类型的任何给定类型或使用任何特定的值集。