2017-08-07 45 views
2

我沒有找到域映射如何將多維域中的索引映射到多維目標語言環境。如何在多維情況下將映射索引映射到目標語言環境陣列

1.)目標區域設置(一個維度)如何以多維方式排列,它等於分佈維度以映射索引?

2.)在文檔中指出,對於多維情況,應該在每個維度上進行計算。對於域{1..8, 1..8} ==> dom 假設dom是塊分佈在6個目標區域設置上。

步驟映射

1 1維(1..8)做計算
如果idxlow<=idx<=high然後locid
floor (idx-low)*N/(high-low+1)給我的指標說i

重複相同的第二維,它給了我一個索引j
現在我有一個元組(i, j) 這是如何映射到維度2的目標locales數組?

域映射爲將1D目標語言環境數組更改爲分佈維度做了什麼?

有點像重塑功能?

請讓我知道,如果這缺乏足夠的信息。

+0

您是否介意指出[http://chapel.cray.com/docs/latest/modules/dists/BlockDist.html?highlight=block#module-BlockDist]這部分,您試圖獲得澄清教堂映射過程的解釋?謝謝。 – user3666197

+0

我看了一下block dist模塊 – praveen

回答

2

有關域索引如何映射到程序語言環境的具體細節不是由Chapel語言本身定義的,而是由用於聲明域的域映射的實現定義的。在你的問題的評論中,你提到你指的是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]; 
    } 
} 

然後我可以通過他們的targetLocales參數傳遞給Block - 分佈式域的幾個實例:

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網格的第一維和其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"); 

當六個或更多的語言環境中運行(./a.out -nl 6 ),則輸出是如下,露出底層的網格結構:

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陣列,所述文檔說:

如果targetLocales的排名爲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)。由於這兩個事情說明,如果下面的代碼是在六個語言環境中運行:

var D0 = D dmapped Block(D); 

writeln(D0.targetLocales()); 

我們得到:

LOCALE0 LOCALE1 
LOCALE2 LOCALE3 
LOCALE4 LOCALE5 

說明,目前的啓發式我們明確grid1聲明匹配以上。