首页 > 解决方案 > 尝试使用 forall 循环对矩阵中的所有元素求和时遇到错误

问题描述

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

标签: chapel

解决方案


编译器阻止您在sum. 如果允许您的代码,则外部和内部 forall 循环的多次迭代将同时更新同一个变量而无需同步。因此,编译器强制sum循环体成为外部的只读快照sum。这种机制称为“forall intents”。在线文档中对此进行了讨论。

如果您的意图是将矩阵中的所有元素相加,那么 chpl-erific 方法是:

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


推荐阅读