Распределение строк двухмерного массива по локалям в часовне
Я изучаю 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
Эта концепция распространяется и на другие дистрибутивы.