各ロケールでグローバル変数のコピーを作成して、後で各ロケールが元の変数にアクセスするのではなくローカルコピーに直接アクセスできるようにするのは簡単ですlocale0に保存されていますか?チャプールの複数のロケールで変数を複製する方法
おかげ
各ロケールでグローバル変数のコピーを作成して、後で各ロケールが元の変数にアクセスするのではなくローカルコピーに直接アクセスできるようにするのは簡単ですlocale0に保存されていますか?チャプールの複数のロケールで変数を複製する方法
おかげ
あなたは、ロケールごとに変数のコピーを取得するために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);
私は別の質問があります:グローバル変数(main関数の外で宣言されたもの)はすべてlocale0に割り当てられていて、他のロケールからそれらにアクセスするためのワイドポインタが必要ですか? paramとconstについてはどうですか? – BruceTerp
はい、モジュールレベルの変数は概念的にはLocale [0]であり、他のロケールからは、ワイドエリアを介してリモートからアクセスする必要があります(例:UtilReplicatedVarを使用しないとパフォーマンスが低下します)ポインタ。私たちが民営化と呼ぶ最適化を実装する分散配列のようないくつかの例外があります。プリミティブ型またはレコード型の定数は、最適化としてコンパイラによって複製されます。 Paramsコードはリテラル値として生成され、実行中にメモリ位置を表しません。任意のロケールは、通信なしでこれらのリテラルを参照できます。 –
あなたは何を試しましたか?これはどうしたいですか?私たちがヤクを剃ろうとしていないことを確認しましょう。(http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html) – dcsohl
私は頻繁にアクセスされるいくつかのグローバルをローカライズしようとしていますいくつかのパフォーマンス上の利点を得るための変数。 (私はグローバル変数がロケール0に割り当てられていると仮定し、他のロケールからそれらにアクセスして通信するのでしょうか?)しかし、それらをローカライズした後、私は期待どおりスピードアップしませんでした。他のロケールからのグローバル変数に多すぎるオーバーヘッドが発生することはありませんか? @dcsohl – BruceTerp
グローバル変数を変数ではなく定数として宣言することができれば、プログラムの起動時にロケール間でレプリケートされます(少なくとも単純な型の場合は - 現状ではこれをより複雑な型に拡張しようとしています)。 – Brad