在Chapel中的Locales之间按行排列2D数组

Rob*_*rma 5 chapel

我正在学习Chapel并且使用过blockdist,但我无法弄清楚如何在locales中以行方式分发二维数组.

ben*_*cht 6

关键是将一个重新整形的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)

这个概念也适用于其他发行版