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

  • 本文关键字:元素 错误 遇到 forall 循环 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
}
}

编译器阻止您在sum上进行数据竞速。如果允许代码,则外部和内部 forall-loop 的多次迭代将同时更新同一变量而不同步。因此,编译器会强制循环体中的sum是外部sum的只读快照。这种机制称为"所有意图"。在线文档中对此进行了讨论。

如果你打算把矩阵中的所有元素相加,那么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

相关内容

  • 没有找到相关文章

最新更新