2017-08-08 5 views
3

Je me demande s'il existe un moyen facile de faire une copie d'une variable globale sur chaque locale afin que plus tard chaque locale accède directement à sa copie locale au lieu d'accéder à la variable d'origine stocké dans locale0?comment répliquer des variables sur plusieurs locales dans la Chapelle

grâce

+0

Qu'avez-vous essayé, et pourquoi voulez-vous faire cela? Assurons-nous que nous n'essayons pas de [raser un yak] (http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html) ici ... – dcsohl

+0

J'essaye de localiser certains globaux fréquemment utilisés variables pour gagner un avantage de performance. (Je suppose que les variables globales sont allouées dans locale0 et l'accès à partir d'autres locales entraîne une communication, n'est-ce pas?) Cependant, après les avoir localisées, cela ne m'a pas accéléré (peut-être 1%) les variables globales d'autres paramètres régionaux n'entraînent pas trop de frais généraux? @dcsohl – BruceTerp

+1

Si les variables globales peuvent être déclarées comme des constantes plutôt que des variables, elles seront répliquées entre les locales au moment du démarrage du programme (au moins pour les types simples). – Brad

Répondre

3

Vous pouvez utiliser la distribution ReplicatedDist pour obtenir une copie d'une variable locale par. Il y a un module UtilReplicatedVar pour simplifier son utilisation.

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

J'ai une autre question: les variables globales (déclarées en dehors de la fonction principale) sont-elles toutes allouées sur locale0 et nécessitent des pointeurs larges pour y accéder à partir d'autres locales? Qu'en est-il du param et du const? – BruceTerp

+1

Oui, les variables de niveau module sont conceptuellement sur Locale [0], et d'autres locales doivent être accessibles à distance via un large aiguille. Il existe quelques exceptions telles que les tableaux distribués qui implémentent une optimisation que nous appelons la privatisation. Les constantes avec des types primitifs ou d'enregistrement sont répliquées par le compilateur en tant qu'optimisation. Le code de Params génère des valeurs littérales et ne représente aucun emplacement de mémoire pendant l'exécution; n'importe quel lieu peut se référer à ces littéraux sans communication. –