Chapel 使用块分布时遇到未解决的访问错误

Chapel 使用块分布时遇到未解决的访问错误,chapel,Chapel,我在尝试使用块分发进行编译时遇到了一个错误。 这就是错误: error: unresolved access of '[BlockDom(3,int(64),false,unmanaged DefaultDist)] real(64)' by '[int(64), int(64)]' 当使用单个索引在Chapel中的多维域上迭代时,该索引将具有该域的名称。在上面的示例中,分布式域gridSpace是一个二维域,因此使用单个索引对其进行迭代将生成2个整数的元组 比如说, var dom = {1

我在尝试使用块分发进行编译时遇到了一个错误。 这就是错误:

error: unresolved access of '[BlockDom(3,int(64),false,unmanaged DefaultDist)] real(64)' by '[int(64), int(64)]'

当使用单个索引在Chapel中的多维域上迭代时,该索引将具有该域的名称。在上面的示例中,分布式域
gridSpace
是一个二维域,因此使用单个索引对其进行迭代将生成2个整数的元组

比如说,

var dom = {1..2, 1..2};
for idx in dom {
  writeln(idx); // index type is (int, int)
}
将打印:

(1, 1)
(1, 2)
(2, 1)
(2, 2)
我在使用Chapel 1.19.0编译示例时遇到的错误是:

error: unresolved access of '[BlockDom(2,int(64),false,unmanaged DefaultDist)] real(64)' by '[2*int(64), 2*int(64)]'
这告诉我们,我们正试图将reals(
real(64)
)和2个整数元组(
[2*int(64),2*int(64)]
)索引到一个块分布的二维数组(
[BlockDom(2,int(64),false,unmanaged DefaultDist)]
)中

纠正上述示例的一种方法是显式迭代每个维度:

forall i in gridSpace.dim(1) {
    forall j in gridSpace.dim(2) {
        forall k in gridSpace.dim(1) {
            grid3[i,j] += grid[i,k] * grid2[k,j];
        }
    }
}
但是,请注意,从最内部的循环将有多个迭代试图并行地添加到
grid3
的相同索引中,从而创建数据竞争

通过使内环串行化,可以删除此数据争用:

forall (i,j) in gridSpace {
  for k in gridSpace.dim(2) {
    grid3[i,j] += grid[i,k] * grid2[k,j];
  }
}
或者,您可以使用来处理内部循环求和:

forall (i,j) in gridSpace {
  grid3[i,j] = + reduce (grid[i,..]*grid2[..,j]);
}
我注意到上述代码还有两个其他问题:

  • gridSpace
    只定义了一个类型,没有值,因此它实际上是一个空的分布式域。您可以通过使用
    Space
    的值初始化它来修复此问题:
  • 有关更多示例,请参见

  • 上述所有循环中都不需要
    do
    <代码>do仅在省略循环体的单个表达式的大括号时才需要,例如
  • 有关更多信息,请参阅

    forall (i,j) in gridSpace {
      grid3[i,j] = + reduce (grid[i,..]*grid2[..,j]);
    }
    
    const gridSpace: domain(2) dmapped Block(boundingBox=Space) = Space;
    
    for i in dom do writeln(i);