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

Posted

技术标签:

【中文标题】如何计算 Chapel forall 循环中的迭代次数【英文标题】:How do I count iterations in a Chapel forall loop 【发布时间】:2018-02-13 16:51:44 【问题描述】:

我想知道在使用 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】:

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

所有意图都在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);

【讨论】:

以上是关于如何计算 Chapel forall 循环中的迭代次数的主要内容,如果未能解决你的问题,请参考以下文章

oracle pl/sql FORALL 语句

FORALL 循环中的多个 SQL 语句

Fortran `forall` 或 `do concurrent` 中的临时变量

继续在教堂的 FORALL 循环之外

Scala:如何在循环中组合数据帧

迭代返回以调整 for 循环中的计算值