ドメインのインデックスがプログラムのロケールにどのようにマッピングされるかに関する具体的な詳細は、チャペル言語自体ではなく、ドメインを宣言するために使用されるドメインマップの実装によって定義されます。あなたの質問にあるコメントでは、Block
ディストリビューションを参照していると言われていますので、私の答え(documented here)に焦点を当てますが、他のドメインマップでは別の方法があります。
Block
ディストリビューションでは、オプションでtargetLocales
引数を使用して、対象となるロケールのセットとその仮想トポロジを指定できます。例えば、私は宣言した場合のロケールのいくつかの配列移入:
var grid1: [1..3, 1..2] locale, // a 3 x 2 array of locales
grid2: [1..2, 1..3] locale; // a 2 x 3 array of locales
for i in 1..3 {
for j in 1..2 {
grid1[i,j] = Locales[(2*(i-1) + j-1)%numLocales];
grid2[j,i] = Locales[(3*(j-1) + i-1)%numLocales];
}
}
を私はその後Block
-distributedドメインの数のインスタンスにtargetLocales
引数としてそれらを渡すことができます。
use BlockDist;
config const n = 8;
const D = {1..n, 1..n},
D1 = D dmapped Block(D, targetLocales=grid1),
D2 = D dmapped Block(D, targetLocales=grid2);
それぞれをドメインは、そのn
行を、targetLocales
グリッドの最初のディメンションに、2番目のディメンションへのn
の列に配信します。次のように我々は、これらのドメイン上の整数の配列を宣言し、各要素は、そのロケールのIDを所有して格納するために並列にそれらを割り当てることによって、この分布の結果を見ることができます:
var A1: [D1] int,
A2: [D2] int;
forall a in A1 do
a = here.id;
forall a in A2 do
a = here.id;
writeln(A1, "\n");
writeln(A2, "\n");
6個以上のロケールで実行されている(./a.out -nl 6
基礎となるグリッド構造明らかに、次のように)、出力される1次元targetLocales
アレイについて
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
4 4 4 4 5 5 5 5
4 4 4 4 5 5 5 5
0 0 0 1 1 1 2 2
0 0 0 1 1 1 2 2
0 0 0 1 1 1 2 2
0 0 0 1 1 1 2 2
3 3 3 4 4 4 5 5
3 3 3 4 4 4 5 5
3 3 3 4 4 4 5 5
3 3 3 4 4 4 5 5
を、ドキュメントは言う:
targetLocales
のランクが1
の場合、グリーディーヒューリスティックを使用してターゲットロケールの配列を変更し、分布のランクと一致し、各次元にほぼ等しい数のインデックスが含まれるようにします。例えば
、我々は、ロケールの1次元の4素子アレイに配布する場合:
var grid3: [1..4] locale;
for i in 1..4 do
grid3[i] = Locales[(i-1)%numLocales];
var D3 = D dmapped Block(D, targetLocales=grid3);
var A3: [D3] int;
forall a in A3 do
a = here.id;
writeln(A3);
我々は、予想されるように、ターゲットロケールは、正方形を形成することを見ることができます:
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
2 2 2 2 3 3 3 3
1D targetLocales
引数が完全な正方形ではない場合、引数が再構成される方法については意図的に曖昧ですが、ドメイン上でtargetLocales()
queryを使用することで、実際に何が行われたのかがわかります。また、targetLocales
配列が指定されていない場合、デフォルトではLocales
配列(1D)全体が使用されます。次のコードは、6つのロケールで実行された場合、これらのものの両方の実例としては、:
var D0 = D dmapped Block(D);
writeln(D0.targetLocales());
我々が得る:
LOCALE0 LOCALE1
LOCALE2 LOCALE3
LOCALE4 LOCALE5
は、現在のヒューリスティックは、上記の私たちの明示的なgrid1
宣言と一致していることを示します。
あなたは[http://chapel.cray.com/docs/latest/modules/dists/BlockDist.html?highlight=block#module-BlockDist]のどの部分にチャペルマッピングプロセスの説明を明確にしましたか?ありがとうございました。 – user3666197
私はブロックdistモジュールを見ました – praveen