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