3

如果我运行以下代码:

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

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

4

2 回答 2

3

该表达式A.targetLocales()几乎为您提供了您所要求的内容,也许您会发现更有用的东西:而不是int您请求的 s 数组,它为您提供了目标语言环境本身的数组。因此,writeln(A.targetLocales())打印 2x2 语言环境数组:

LOCALE0 LOCALE1
LOCALE2 LOCALE3

该例程以及其他与数组局部性查询相关的程序可以在在线文档的域和数组操作部分的数组类型下找到。

该表达式A.targetLocales().id 应该给你你想要的,但由于长期未实现的特性不能(至少,从 Chapel 的 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)。

于 2017-05-02T04:10:03.173 回答
2

数组、域和分布都有一个targetLocales()方法,该方法返回分布数组/域/分布的语言环境数组。请参阅:域和阵列操作文档。

以下调用:

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
于 2017-05-02T04:05:20.190 回答