在教堂的语言环境中按行分配2D数组

时间:2018-11-19 06:17:02

标签: chapel

我正在学习Chapel并与blockdist合作,但我不知道如何在地区之间以行方式分配二维数组。

1 个答案:

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