运行 尝试使用 forall 循环对矩阵中的所有元素求和时出错

Running into a error when trying to sum up all the elements in a matrix using a forall loop

当我尝试将矩阵中的所有元素相加时,我在使用 forall 循环时不断收到错误,但它使用 for 循环工作,我不确定为什么。

这里是错误:

error: illegal lvalue in assignment

代码:

config const size = 10;
var grid : [1..size, 1..size] real;
var sum : real = 0;

//for user input
for i in 1..size do
    for j in 1..size do
        grid[i,j] = read(uint(8));

forall i in 1..size {
    forall j in 1..size {
        sum += grid[i,j]; //error here
    }
}

编译器阻止您在 sum 上进行数据竞争。如果您的代码被允许,则外部和内部 forall 循环的多次迭代将在不同步的情况下同时更新同一个变量。因此,编译器会强制循环体中的 sum 成为外部 sum 的只读快照。这种机制称为 "forall intents"。它在 online documentation.

中讨论

如果您打算将矩阵中的所有元素相加,chpl-erific 方法是:

const sum = + reduce grid;

也可以对您的代码进行其他变体,具体取决于您想要完成的任务。

旁白:在二维space上使用单个forall会更有效率,例如:

forall (i,j) in {1..size,1..size} // {1..size,1..size} is a "domain"

或者,更好的是:

forall (i,j) in grid.domain