在 Chapel 中获取当前任务 ID?
Get current task ID in Chapel?
如何找出哪些任务正在执行一个迭代的哪些迭代
forall 循环?
例如,我想感受一下不同 DynamicIter 的行为方式,
use DynamicIters;
var r = 1..1000;
var A: [r] int;
forall i in adaptive(r) {
A[i] = ???;
}
我可以使用 here.id
来发现 forall 循环放置了哪个语言环境
迭代,但我不知道如何 "see" 内的什么任务
每个迭代分配给的语言环境。
Chapel 的设计有意避免支持标准语言级别的方式来查询任务的 ID,因为我们不希望它强加任何特定的编号或可能需要的开销,以维护跨不同底层的功能 runtime/OS/hardware 选择。在编写 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、massivethreads),也不保证它将继续在 Chapel 的未来版本中工作。例如,在 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
是实现内部的不透明类型,因此可以打印出来,但不能保证它具有任何给定类型跨任务选项或使用任何特定的值集。
如何找出哪些任务正在执行一个迭代的哪些迭代 forall 循环?
例如,我想感受一下不同 DynamicIter 的行为方式,
use DynamicIters;
var r = 1..1000;
var A: [r] int;
forall i in adaptive(r) {
A[i] = ???;
}
我可以使用 here.id
来发现 forall 循环放置了哪个语言环境
迭代,但我不知道如何 "see" 内的什么任务
每个迭代分配给的语言环境。
Chapel 的设计有意避免支持标准语言级别的方式来查询任务的 ID,因为我们不希望它强加任何特定的编号或可能需要的开销,以维护跨不同底层的功能 runtime/OS/hardware 选择。在编写 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、massivethreads),也不保证它将继续在 Chapel 的未来版本中工作。例如,在 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
是实现内部的不透明类型,因此可以打印出来,但不能保证它具有任何给定类型跨任务选项或使用任何特定的值集。