如何计算Chapel forall循环中的迭代次数

时间:2018-02-13 16:51:44

标签: chapel forall

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

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

1 个答案:

答案 0 :(得分:5)

默认情况下,大多数变量类型(数组除外)都被复制到forall循环中,因此您无法修改它们。这样做是为了避免常见情况下的竞争条件。如果您希望能够在j循环中修改forall,则需要使用forall intent

Forall意图在Chapel language spec的“数据并行”部分中定义。由于此代码希望将任务的j值减少为单个值,因此您可以在forall循环上使用reduce intent来计算迭代次数:

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);