是否可以生成映射 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)。
如果我运行下面的代码:
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)。