可以创建一个对象来存储多个域吗?
Can one create an object to store multiple domains?
我有一些我认为应该如下所示的代码:
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
吗?我想我可以解决这个问题,但我很好奇。
要存储多个域,您需要创建一个域数组(或其他一些域集合)。具体来说,上面代码的主要问题是它似乎试图索引到一个域( slice(0)
)——请记住,域只是索引集,而不是从索引到值的 arrays/maps 。
以下示例程序创建一个分布式数组 (A
),我们要查询其分布,以及一个域数组 (slicePerLocale
),我们将使用它来跟踪谁拥有什么.它通过 localSubdomain()
查询填充 slicePerLocale
以确定每个语言环境拥有的子域并将其存储在 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}
我有一些我认为应该如下所示的代码:
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
吗?我想我可以解决这个问题,但我很好奇。
要存储多个域,您需要创建一个域数组(或其他一些域集合)。具体来说,上面代码的主要问题是它似乎试图索引到一个域( slice(0)
)——请记住,域只是索引集,而不是从索引到值的 arrays/maps 。
以下示例程序创建一个分布式数组 (A
),我们要查询其分布,以及一个域数组 (slicePerLocale
),我们将使用它来跟踪谁拥有什么.它通过 localSubdomain()
查询填充 slicePerLocale
以确定每个语言环境拥有的子域并将其存储在 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}