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);