尝试使用forall循环求和矩阵中的所有元素时遇到错误

时间:2019-12-17 21:53:52

标签: chapel

当尝试将矩阵中的所有元素加起来时,在使用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
    }
}

1 个答案:

答案 0 :(得分:2)

编译器阻止您进行sum上的数据竞赛。如果您的代码被允许,则外部和内部forall循环的多次迭代将同时更新同一变量,而无需同步。因此,编译器会强制循环主体中的sum是外部sum的只读快照。此机制称为“全部意图”。在online documentation中进行了讨论。

如果您打算将矩阵中的所有元素相加,则最有用的方法是:

const sum = + reduce grid;

根据您要完成的工作,还可以对代码进行其他更改。

此外:在二维空间上拥有一个forall更为有效,例如:

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

或者更好的是:

forall (i,j) in grid.domain