我正在学习Chapel并且使用过blockdist,但我无法弄清楚如何在locales中以行方式分发二维数组.
关键是将一个重新整形的Locales
数组作为targetLocales
参数传递给Block
。这将在下面进一步解释。
这是一个以行方式分布二维数组的简单示例:
use BlockDist;
// Using a 2D targetLocales rather than the default 1D Locales argument
var targetLocales = reshape(Locales, {0..#numLocales, 0..0});
const Space = {1..4, 1..4};
const D: domain(2) dmapped Block(boundingBox=Space, targetLocales=targetLocales) = Space;
var A: [D] int;
forall a in A do
a = a.locale.id;
writeln(A);
Run Code Online (Sandbox Code Playgroud)
示例输出:
./row-wise -nl 4
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
./row-wise -nl 2
0 0 0 0
0 0 0 0
1 1 1 1
1 1 1 1
Run Code Online (Sandbox Code Playgroud)
默认情况下,发行版将使用内置Locales
数组作为targetLocales
参数,它指定如何在特定域映射中的语言环境中对数组的元素进行分区,例如Block
.
由于Locales
是一维数组,并且您正在分发二维数组,因此Block
分布Locales
如下所示:
1D targetLocales:
0 1 2 3 -> 0 1
2 3
Run Code Online (Sandbox Code Playgroud)
因此,形状数组(4,4)
将映射到 4 个语言环境,如下所示:
0 0 1 1
0 0 1 1
2 2 3 3
2 2 3 3
Run Code Online (Sandbox Code Playgroud)
通过提供 2DtargetLocales
参数,我们可以Block
明确地告诉我们希望元素如何映射到语言环境,而不是依赖于包装。传递targetLocales
形状为(4,1)
,的区域设置数组将导致所需的行分布:
2D targetLocales:
0
1
2
3
Run Code Online (Sandbox Code Playgroud)
因此,形状数组(4,4)
将映射到 4 个语言环境,如下所示:
0 0 0 0
1 1 1 1
2 2 2 2
3 3 3 3
Run Code Online (Sandbox Code Playgroud)
这个概念也适用于其他发行版。