2017-08-07 6 views
2

ドメインマップが多次元ドメインのインデックスを多次元ターゲットロケールにどのようにマッピングするのか分かりませんでした。マルチマップの場合、ドメインマップがインデックスをターゲットロケール配列にマップする方法

1.)ターゲットロケール(1つのディメンション)が、ディメンションをマップするディメンションディメンションと同じ多次元形式でどのように配置されているか

2.)ドキュメントでは、多次元の場合、すべての次元で計算を行う必要があることが記載されています。ドメインの場合{1..8, 1..8} ==> dom domは6つのターゲットロケールでブロック分散されていると仮定します。マッピングで

ステップ

1第一次元(1 8)のためのidxlow<=idx<=highであれば、計算
を行い、その後locid
floor (idx-low)*N/(high-low+1)である私にインデックスを与えるiを言います。

第2次元で同じことを繰り返すと、インデックスはjとなります。
今はタプルがあります(i, j) これは次元2のターゲットロケール配列にどのようにマップされていますか?

1Dターゲットロケールアレイをディストリビューションディメンションに変更するためのドメインマップとは何ですか?

改造機能のようなものですか?

十分な情報が不足している場合は教えてください。

+0

あなたは[http://chapel.cray.com/docs/latest/modules/dists/BlockDist.html?highlight=block#module-BlockDist]のどの部分にチャペルマッピングプロセスの説明を明確にしましたか?ありがとうございました。 – user3666197

+0

私はブロックdistモジュールを見ました – praveen

答えて

2

ドメインのインデックスがプログラムのロケールにどのようにマッピングされるかに関する具体的な詳細は、チャペル言語自体ではなく、ドメインを宣言するために使用されるドメインマップの実装によって定義されます。あなたの質問にあるコメントでは、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宣言と一致していることを示します。

関連する問題