我正在学习Chapel并与blockdist合作,但我不知道如何在地区之间以行方式分配二维数组。
答案 0 :(得分:4)
关键是传递经过重整的Locales
数组作为targetLocales
的{{1}}参数。这将在下面进一步解释。
这是一个以行方式分布2D数组的简单示例:
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);
默认情况下,发行版将使用内置的Locales
数组作为 ./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
参数,该参数指定如何在特定域映射(例如, Block
。
由于targetLocales
是一维数组,并且您要分配2D数组,因此Locales
分发将Block
包裹起来,如下所示:
Locales
因此,形状为1D targetLocales:
0 1 2 3 -> 0 1
2 3
的数组将被映射为4种语言环境:
(4,4)
通过提供2D 0 0 1 1
0 0 1 1
2 2 3 3
2 2 3 3
参数,我们可以明确地告诉targetLocales
,我们希望如何将元素映射到语言环境,而不是依靠包装。传递Block
形状的targetLocales
语言环境数组将导致所需的按行分布:
(4,1)
因此,形状为2D targetLocales:
0
1
2
3
的数组将被映射为4种语言环境:
(4,4)
此概念也适用于其他distributions。