UtilReplicatedVar¶
Usage
use UtilReplicatedVar;
Support for user-level replicated variables.
A "replicated" variable is a variable for which there is a copy on each locale. Referencing a replicated variable (in a stylized way, see below) accesses its copy on the current locale.
Features:
- The variable's copies are not synchronized automatically among the locales.
Limitations:
- It is "user-level", i.e. the user is required to handle the variable in specific ways to achieve the desired result.
- Tree-shape communication (like for reductions) is not provided.
- Using a replicated variable of an array type is not straightforward. Workaround: declare that array itself as replicated, then access it normally, e.g.:
var replArray: [MyDomain dmapped Replicated()] real;
How to use replicated variables¶
use UtilReplicatedVar;
// declare a replicated variable of the type 'MyType'
var myRepVar: [rcDomain] MyType;
// access its copy on the current locale (read or write) (either option)
... myRepVar(1) ... // must use 1
... rcLocal(myRepVar) ...
// "replicate": assign 'valToRep' to copies on all locales
rcReplicate(myRepVar, valToRep);
// "collect": assign from each copy of 'myRepVar' to
// corresponding element of an array 'collected'
var collected: [LocaleSpace] MyType;
rcCollect(myRepVar, collected);
// access directly a remote copy on the locale 'remoteLoc' (read or write)
... rcRemote(myRepVar, remoteLoc) ...
Replicating over a subset of locales¶
To replicate a variable over a subset of locales, say myLocales
,
modify the above variable declarations as follows:
var myRepVar: [rcDomainBase dmapped Replicated(myLocales,
"over which to replicate 'myRepVar'")] MyType;
var collected: [myLocales.domain] MyType;
Tip: if the domain of the desired array of locales cannot be described as a rectangular domain (which could be strided, multi-dimensional, and/or sparse), make that array's domain associative over int.
Declarations¶
-
const
rcDomainBase
= {rcDomainIx..rcDomainIx}¶ Use this domain when replicating over a subset of locales, as shown above.
-
const
rcDomain
= rcDomainBase dmapped new dmap(rcDomainMap)¶ Use this domain to declare a user-level replicated variable, as shown above .
-
proc
rcReplicate
(replicatedVar: [?D] ?MYTYPE, valToReplicate: MYTYPE): void¶ Assign a value valToReplicate to copies of the replicated variable replicatedVar on all locales.
-
proc
rcCollect
(replicatedVar: [?D] ?MYTYPE, collected: [?CD] MYTYPE): void¶ Copy the value of the replicated variable replicatedVar on each locale into the element of the array collected that corresponds to that locale.
-
proc
rcLocal
(replicatedVar: [?D] ?MYTYPE) ref: MYTYPE¶ Access the copy of replicatedVar on the current locale.
This is equivalent to
replicatedVar[1]
.
-
proc
rcRemote
(replicatedVar: [?D] ?MYTYPE, remoteLoc: locale) ref: MYTYPE¶ Access the copy of replicatedVar on the locale remoteLoc.