可以生成分布映射的Locales网格吗?

时间:2017-05-02 03:12:42

标签: chapel

如果我运行以下代码:

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

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

2 个答案:

答案 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