как реплицировать переменные в нескольких локалях в Chapel

Мне интересно, есть ли простой способ сделать копию глобальной переменной для каждой локали, чтобы позже каждая локаль напрямую обращалась к своей локальной копии, а не к исходной переменной, хранящейся в locale0?

Благодарность


person BruceTerp    schedule 08.08.2017    source источник
comment
Что вы пробовали и почему вы хотите это сделать? Давайте удостоверимся, что мы не пытаемся здесь побрить яка. ..   -  person dcsohl    schedule 08.08.2017
comment
Я пытаюсь локализовать некоторые часто используемые глобальные переменные, чтобы повысить производительность. (Я предполагаю, что глобальные переменные размещены в локали0, и доступ к ним из других локалей приводит к обмену данными, верно?) Однако после их локализации это не дало мне ускорения (возможно, 1%), как я ожидал, поэтому я полагаю, что доступ к глобальные переменные из других локалей не несут слишком много накладных расходов? @dcsohl   -  person BruceTerp    schedule 09.08.2017
comment
Если глобальные переменные могут быть объявлены как константы, а не как переменные, они будут реплицироваться между локалями во время запуска программы (по крайней мере, для простых типов — в настоящее время предпринимаются усилия по распространению этого на более сложные типы).   -  person Brad    schedule 09.08.2017


Ответы (1)


Вы можете использовать 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);
person David Iten    schedule 08.08.2017
comment
У меня есть еще один вопрос: все ли глобальные переменные (объявленные вне основной функции) размещены в локали0 и нуждаются в широких указателях для доступа к ним из других локалей? А как насчет param и const? Я нашел небольшое преимущество в производительности, локализовав их... (не используя UtilReplicatedVar, так как это дает гораздо худшую производительность) - person BruceTerp; 09.08.2017
comment
Да, переменные уровня модуля концептуально относятся к Locale[0], и из других языковых стандартов к ним нужно обращаться удаленно через широкий указатель. Есть некоторые исключения, такие как распределенные массивы, которые реализуют оптимизацию, которую мы называем приватизацией. Константы с примитивными типами или типами записей реплицируются компилятором в качестве оптимизации. Код Params генерируется как литеральные значения и не представляет какую-либо ячейку памяти во время выполнения; любая локаль может ссылаться на эти литералы без связи. - person David Iten; 09.08.2017