2017-08-08 13 views
3

各ロケールでグローバル変数のコピーを作成して、後で各ロケールが元の変数にアクセスするのではなくローカルコピーに直接アクセスできるようにするのは簡単ですlocale0に保存されていますか?チャプールの複数のロケールで変数を複製する方法

おかげ

+0

あなたは何を試しましたか?これはどうしたいですか?私たちがヤクを剃ろうとしていないことを確認しましょう。(http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html) – dcsohl

+0

私は頻繁にアクセスされるいくつかのグローバルをローカライズしようとしていますいくつかのパフォーマンス上の利点を得るための変数。 (私はグローバル変数がロケール0に割り当てられていると仮定し、他のロケールからそれらにアクセスして通信するのでしょうか?)しかし、それらをローカライズした後、私は期待どおりスピードアップしませんでした。他のロケールからのグローバル変数に多すぎるオーバーヘッドが発生することはありませんか? @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

私は別の質問があります:グローバル変数(main関数の外で宣言されたもの)はすべてlocale0に割り当てられていて、他のロケールからそれらにアクセスするためのワイドポインタが必要ですか? paramとconstについてはどうですか? – BruceTerp

+1

はい、モジュールレベルの変数は概念的にはLocale [0]であり、他のロケールからは、ワイドエリアを介してリモートからアクセスする必要があります(例:UtilReplicatedVarを使用しないとパフォーマンスが低下します)ポインタ。私たちが民営化と呼ぶ最適化を実装する分散配列のようないくつかの例外があります。プリミティブ型またはレコード型の定数は、最適化としてコンパイラによって複製されます。 Paramsコードはリテラル値として生成され、実行中にメモリ位置を表しません。任意のロケールは、通信なしでこれらのリテラルを参照できます。 –

関連する問題