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