chapel - 检查/确保两个数组具有相同的域和分布的最佳方法是什么?

标签 chapel

Chapel 的一个很好的特性是它区分了数组的域和它的分布。检查两个数组是否具有相同的域和分布(通常想要的)的最佳方法是什么?

我能看到的最好的方法是检查 D1==D2D1.dist==D2.dist , 如果 D1D2都是域。

特别地,请考虑以下代码:

const Dom = {1..5, 1..5};
const BDom = newBlockDom(Dom);
var x : [Dom] int;
var y : [BDom] int;

test(x,y);

proc test(a : [?Dom1] int, b : [Dom1] int) {
}

这编译并运行得很好,如果函数声明中的查询语法只是测试域相等性,而不是分布相等性(即使 Dom1 也知道 a 是如何分布的),这是有意义的。在这种情况下检查分布相等的唯一方法是执行 a.domain.dist==b.domain.dist ?

最佳答案

要检查两个域是否描述了 Chapel 中相同的分布式索引集,您使用 D1 == D2 是正确的。和 D1.dist == D2.dist . Chapel 中的域相等性检查两个域是否描述了相同的索引集,因此与域映射/分布无关。类似地,两个域映射/分布之间的相等性检查会检查它们是否以相同的方式分布索引。

请注意,在 Chapel 中,域和分布都有标识的概念,因此如果您按如下方式创建了两个分布式域:

var BDom1 = newBlockDom(Dom),
    BDom2 = newBlockDom(Dom);

它们将通过上述相等性检查,但具有不同的域值。在某些情况下,怀疑两个域表达式是否指代相同的域实例可能是合理的,但我相信今天在 Chapel 中没有正式的面向用户的方法可以做到这一点。如果对此感兴趣,值得在我们的 GitHub issues 上提出功能请求。页。

关于您的代码示例:
const Dom = {1..5, 1..5};
const BDom = newBlockDom(Dom);
var x : [Dom] int;
var y : [BDom] int;

test(x,y);

proc test(a : [?Dom1] int, b : [Dom1] int) {
}

这里有一个微妙之处,需要一些解释。首先,请注意,如果您将参数反转为 test()例程,它不会编译,其行为可能与您期望的更相似( TIO ):
test(y,x);

这样做的原因是没有明确域映射的域在正式数组参数中被特殊处理。具体来说,在定义 Chapel 时,我们不希望有一个像 X 这样声明的形式参数。这里:
proc foo(X: [1..n] real) { ... }

要求实际的数组参数是非分布式的/具有默认的域映射。换句话说,我们希望用户能够传入一个从 1..n 索引的块或循环分布式数组。这样形式就限制了数组的索引集,而不是它的分布。相反,如果根据显式域映射定义形式参数的域,例如:
proc bar(X: [BDom] int) { ... }

(使用上面 BDom 的块分布式定义),它需要实际的数组参数来匹配该域。

这样做的结果是在您的示例中,因为 Dom1与具有默认域映射的域匹配,b同样松散地限制为具有相同的索引集但具有任何分布。而当第一个实际参数是块分布的(如在我的调用中)时,Dom1对该分布进行编码并将约束应用于 b .

如果您对此的 react 是感觉困惑/不对称,我倾向于同意。我相信我们已经讨论了在这方面将声明/命名域与匿名域区别对待的方式(因为我们在采用此规则时关注的是 X: [1..n] 中域的匿名性,以及它对诸如 Dom1 之类的查询域的应用)在这种情况下,这是当前实现的副作用)。再次,GitHub issue质疑/挑战这种行为将是完全公平的游戏。

关于chapel - 检查/确保两个数组具有相同的域和分布的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62397173/

相关文章:

parallel-processing - Chapel 中的正交递归二分法(Barnes-Hut 算法)

arrays - 从 dmapped 数组实例中提取 DSI 数组类?

tuples - 将标量分配给元组

file - "channel"类型的字段给出错误 "Cannot default-initialize a variable with generic type"

chapel - 如何配置 Chapel/GASNet 以使用分区 key 在 MXM Infiniband 网络上运行多语言环境代码?

syntax - `[<var> in <distributed variable>]` 等价于 `forall` 吗?

chapel - 是否可以生成映射 Distribution 的 Locales 网格?

list-comprehension - 如何在 Chapel 中执行内联 IF 数组构造函数?

nvidia - 使用 Chapel 使用两个 Nvidia Jetson nano 开发工具包时遇到问题