可以创建一个对象来存储多个域吗?

时间:2017-05-05 01:17:54

标签: chapel

我有一些代码,我觉得应该是这样的:

on Locales[0] {
  var slice: domain(1) = {0..#widthOfLocaleMatrix};
  on Locales[1] {
    slice(0) = A.localSubdomain();
  }
  var localSlice: [slice(0)] int = A[slice(0)];
}

基本上,我试图从其他numLocales - 1语言环境中获取多个数据片段。我可以创建一个对象来存储来自所有其他语言环境的localSubdomain吗?我想我可以解决这个问题,但我很好奇。

1 个答案:

答案 0 :(得分:2)

要存储多个域,您需要创建一个域数组(或其他一些域集合)。具体来说,上面代码的主要问题是它似乎正在尝试索引到域(slice(0)) - 请记住,域只是索引集,而不是从索引到值的数组/映射。

以下示例程序创建了一个分布式数组(A),我们想要询问它们的分布以及一组域(slicePerLocale),我们将用它们来跟踪谁拥有什么。它通过slicePerLocale查询填充localSubdomain()以确定每个区域设置所拥有的子域,并将其存储在slicePerLocale的相应元素中。最后,它打印出它所学到的东西:

use BlockDist;

config const n = 10;
var D = {1..n, 1..n} dmapped Block({1..n, 1..n});
var A: [D] real;

var slicePerLocale: [LocaleSpace] domain(2);

coforall loc    in Locales do
  on loc do
slicePerLocale[loc.id] = A.localSubdomain();

for (loc, slice) in zip(LocaleSpace, slicePerLocale) do
  writeln("locale ", loc, " owns: ", slice);

在默认问题大小为10的四个区域设置上运行此操作会导致:

locale 0 owns: {1..5, 1..5}
locale 1 owns: {1..5, 6..10}
locale 2 owns: {6..10, 1..5}
locale 3 owns: {6..10, 6..10}