Распределение строк двухмерного массива по локалям в часовне - PullRequest
0 голосов
/ 19 ноября 2018

Я изучаю Chapel и работал с blockdist, но я не могу понять, как я могу распределить двумерный массив по рядам среди локалей.

1 Ответ

0 голосов
/ 19 ноября 2018

Ключ должен передать измененный массив Locales в качестве аргумента targetLocales в Block.Это объяснено ниже.

Вот простой пример распределения 2D-массива по строкам:

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);

Пример выходных данных:

 ./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

Byпо умолчанию в дистрибутивах используется встроенный массив Locales в качестве аргумента targetLocales, который указывает, как разделять элементы массива по локалям в конкретной карте домена, например, Block.

Поскольку Locales является одномерным массивом, а вы распространяете 2D-массив, распределение Block охватывает Locales следующим образом:

1D targetLocales:

0 1 2 3 -> 0 1
           2 3

Таким образом, массив формы (4,4) будет отображаться на 4 локали как:

  0 0 1 1
  0 0 1 1
  2 2 3 3
  2 2 3 3

Предоставляя аргумент 2D targetLocales, мы можем Block явно указать, как мы хотим, чтобы элементыбыть сопоставленным с локалями, а не полагаться на упаковку.Передача массива targetLocales локалей с формой (4,1) приведет к желаемому распределению по строкам:

2D targetLocales:

   0
   1
   2
   3

Таким образом, массив формы (4,4) будет отображен на 4 локали как:

 0 0 0 0
 1 1 1 1
 2 2 2 2
 3 3 3 3

Эта концепция применима и к другим дистрибутивам .

...