如果我运行以下代码:
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>
返回矩阵(下方)?
0 1
2 3
或者,这是我应该实施的吗?
答案 0 :(得分: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数组的等级与应用分发的域的等级匹配。 (因此,在分配2D域和数组时,targetLocales必须是2D,而对于3D域和数组,则必须是3D)。
答案 1 :(得分:2)
数组,域和发行版都有一个targetLocales()
方法,它返回分配数组/域/分布的语言环境数组。请参阅: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