2017-08-08 116 views
3

我在想,是否有一種簡單的方法可以在每個區域設置一個全局變量的副本,以便以後每個區域設置都可以直接訪問其本地副本而不是訪問原始變量存儲在locale0中?如何複製Chapel中的多個區域設置上的變量

感謝

+0

你有什麼試過,爲什麼你想這樣做?讓我們確保我們不試圖[剃去犛牛](http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html)... – dcsohl

+0

我試圖本地化一些經常訪問的全局變量來獲得一些性能優勢。 (我假設全局變量分配在locale0中,並從其他語言環境訪問它們導致通信,對吧?)但是,在本地化它們之後,它並沒有像我預期的那樣給我加速(可能爲1%),所以我想訪問來自其他地區的全局變量不會產生太多的開銷? @dcsohl – BruceTerp

+1

如果全局可以聲明爲常量,而不是變量,他們將在地區之間在程序的啓動時間複製(至少對於簡單類型,電流努力尋找這個延伸到更復雜的類型)。 – Brad

回答

3

可以使用ReplicatedDist分佈,讓每一個語言環境變量的副本。有一個模塊UtilReplicatedVar來簡化它的使用。

use UtilReplicatedVar; 

var regularInt = 42; 

// rcDomain is declared in UtilReplicatedVar. It maps 
// one int value to each locale 
var repInt: [rcDomain] int; 

// Other types can be replicated as well. Here a 
// heterogeneous tuple containing an integer, 
// real, and complex is replicated 
var repTuple: [rcDomain] (int, real, complex); 

// Assign 42 to the replicated int on all locales 
rcReplicate(repVar, regularInt); 

// Access the local copy of the replicated var. 
// The first form must use 1 as the index. 
repVar[1] = 0; 
writeln(rcLocal(repVar)); 

// Access the local complex component of the tuple 
writeln(repTuple[1](3)); 

// Access a remote copy. 
rcRemote(repVar, remoteLocale); 
+1

我還有一個問題:全局變量(在主函數之外聲明)是否全部在locale0上分配,並且需要寬指針從其他語言環境訪問它們?那param和const呢?我發現小的性能優勢通過定位那些...(不使用UtilReplicatedVar因爲它提供了性能更糟糕) – BruceTerp

+1

是,模塊級的變量在概念上的區域設置[0],並從其他區域設置需要通過廣泛的遠程訪問指針。有一些例外情況,如分佈式數組實現我們稱之爲私有化的優化。具有原始或記錄類型的常量由編譯器作爲優化進行復制。 Params代碼生成爲文字值,並且在執行期間不代表任何內存位置;任何語言環境都可以在不通信的情況下引用這些文字。 –

相關問題