我如何在教堂的forall循环中计算迭代



我想知道使用Chapel的forall时执行了多少次循环。使用CDO库的代码失败,我相信这样做是正确的。有人可以给我一个很好的例子吗?

var j:int = 0;
writeln("n=== FORALL LOOP ===");
forall row in cursor {
  writeln("from: ", row['from_nm'], "tto: ", row['to_nm']);
  j += 1;
}
writeln("Expected 10 rows, got ", j);

错误是

faerr.chpl:59: error: illegal lvalue in assignment
faerr.chpl:57: note: The shadow variable 'j' is constant due to forall intents in this loop

默认情况下,大多数变量类型(数组除外(被复制到forall循环中,因此您无法修改它们。这样做是为了避免种族条件。如果您想在forall循环中修改j,则需要使用forall intent

在教堂语言规范的"数据并行性"部分中定义了意图。由于此代码希望将任务的j值降低到单个值,因此您可以在forall循环上使用降低意图来计算迭代:

var j:int = 0;
writeln("n=== FORALL LOOP ===");
forall row in cursor with (+ reduce j) {
  writeln("from: ", row['from_nm'], "tto: ", row['to_nm']);
  j += 1;
}
writeln("Expected 10 rows, got ", j);

最新更新