Распределение строк двухмерного массива по локалям в часовне

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

1 ответ

Решение

Ключ должен передать измененный 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);

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

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

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

поскольку Locales массив 1D, и вы распределяете массив 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

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

Другие вопросы по тегам