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

Can one generate a grid of the Locales where a Distribution is mapped?

如果我运行下面的代码:

use BlockDist;
config const dimension: int = 5;
const space = {0..#dimension, 0..#dimension};
const matrixBlock: domain(2) dmapped Block(boundingBox=space) = space;
var A : [matrixBlock] int;
[a in A] a = a.locale.id;
writeln(A);

在 4 个语言环境中,我得到:

0 0 0 1 1
0 0 0 1 1
0 0 0 1 1
2 2 2 3 3
2 2 2 3 3

是否有 A.<function> returns 矩阵(下图)?

0 1
2 3

或者,这是我应该实施的东西吗?

数组、域和分布都有一个 targetLocales() 方法,即 returns 分布 array/domain/distribution 的语言环境数组。请参阅:Domain and Array Operations 文档。

以下通话:

writeln(A.targetLocales());
writeln(A.domain.targetLocales());
writeln(A.domain.dist.targetLocales());

将全部打印:

LOCALE0 LOCALE1
LOCALE2 LOCALE3

要提取积分 ID,您可以使用 .id 访问器:

var targetLocs = A.targetLocales();
var targetLocIDs: [targetLocs.domain] int = targetLocs.id;
writeln(targetLocIDs);

打印:

0 1
2 3

表达式 A.targetLocales() 几乎可以满足您的要求,也许您会发现更有用的东西:它提供的不是您要求的 int 数组,而是一个数组目标语言环境本身。因此,writeln(A.targetLocales()) 打印 2x2 语言环境数组:

LOCALE0 LOCALE1
LOCALE2 LOCALE3

此例程和其他与数组位置查询相关的例程可以在联机文档的 domain and array operations 部分的数组类型下找到。

表达式A.targetLocales().id应该给你你想要的,但由于longstanding unimplemented feature没有(至少,从1.15版开始教堂)。简而言之,这会向每个语言环境询问其 ID,并且 应该 产生一个与目标语言环境数组具有相同大小和形状的整数数组;然而,由于提升不会按预期保留形状,如果不保留形状,形状就会丢失。例如,writeln(A.targetLocales.id) 结果:

0 1 2 3

而不是:

0 1
2 3

但是,您可以将此类提升的表达式分配到所需形状的数组中。因此,今天获得所需整数数组的一种方法是编写:

// declare an array whose domain is the same as that of A's target locales
// and initialize the array using the IDs of A's targetLocales array:
var IDs: [A.targetLocales().domain] int = A.targetLocales().id;

最后,请注意,如果您希望指定特定的目标语言环境集,而不是使用它为您设置的默认目标语言环境集,则可以将您自己的语言环境数组传递给 Block() 分布的构造函数.例如,添加以下两行:

const locGridSpace = {0..#numLocales, 0..0};
const locGrid: [locGridSpace] locale = [(i,j) in locGridSpace] Locales[i];

将创建一个 numLocales x 1 区域设置数组,然后可以将其传递到您对 Block() 的调用中,如下所示:

const matrixBlock: domain(2) dmapped Block(boundingBox=space, 
                                           targetLocales=locGrid) = space;

或者,您可以将部分或全部语言环境排列成其他形状或顺序。主要限制是 targetLocales 数组的排名与应用分布的域的排名相匹配。 (因此 targetLocales 在分配 2D 域和数组时必须是 2D,而对于 3D 域和数组则必须是 3D)。