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