rtsIDr (1158390), страница 12
Текст из файла (страница 12)
Результат операции с номером 10 (rf_EQ) имеет ненулевое значение («ИСТИНА»), если в момент её запуска значения редукционной переменной одинаковы на всех процессорах, и нулевое («ЛОЖЬ») в противном случае.
Дополнительная информация (или информация локализации), сопровождающая редукционную операцию, зависит от алгоритма задачи и формируется программой пользователя. Из перечисленных редукционных операций её задание имеет смысл только для операций rf_MAX и rf_MIN и превращает их в позиционные редукционные операции MAXLOC и MINLOC. Предположительно, дополнительной информацией в этих случаях являются в том или ином виде заданные координаты максимума или минимума. Система поддержки лишь обеспечит пересылку её от процессора, в котором был найден максимум или минимум, всем остальным процессорам. Отсутствие информации локализации указывается равным NULL значением указателя LocArrayPtr или нулевым значением длины элемента массива с информацией локализации.
Тип элементов редукционной переменной-массива может иметь значения (в скобках указаны именованные константы языка C):
-
int (rt_INT);
-
long (rt_LONG);
-
float (rt_FLOAT);
-
double (rt_DOUBLE).
Задаваемый ненулевым значением *StaticSignPtr признак статической редукционной переменной означает создание переменной (точнее, описывающего её объекта), не уничтожаемой при выходе из программного блока (см.п.8). Такая редукционная переменная может быть уничтожена только явно, с помощью рассмотренной ниже функции delred_ .
Замечание. Чтобы избежать предупреждений, выдаваемых Фортран-компилятором при обращении к функции crtred_ с различными типами редукционных переменных, в системе поддержки предусмотрена функция
| RedRef crtrdf_ ( | long | *RedFuncNumbPtr, |
отличающаяся от функции crtred_ вторым параметром:
| *RedArrayAddrPtr | | указатель на редукционную переменную-массив, приведенный к типу AddrType с помощью одной из функций, рассмотренных в п.17.7. |
Остальные параметры функции crtrdf_ аналогичны соответствующим параметрам функции crtred_ .
11.2Создание редукционной группы
| RedGroupRef crtrg_ ( | long | *StaticSignPtr, |
| *StaticSignPtr | | признак создания статической редукционной группы. |
| *DelRedSignPtr | | признак уничтожения всех редукционных переменных, входящих в группу, при её уничтожении. |
Функция crtrg_ создает пустую редукционную группу (не содержащую ни одной редукционной переменной) и возвращает ссылку на неё.
Задаваемый ненулевым значением *StaticSignPtr признак статической редукционной группы означает создание группы, не уничтожаемой при выходе из программного блока (см.п.8). Такая редукционная группа может быть уничтожена только явно, с помощью рассмотренной ниже функции delrg_ .
Ненулевое значение *DelRedSignPtr задает такой режим уничтожения редукционной группы, при котором все входящие в неё (на момент уничтожения) редукционные переменные будут также уничтожены. При явном уничтожении группы уничтожение входящих в неё переменных будет также явным, при неявном неявным.
11.3Включение редукционной переменной в редукционную группу
| long insred_ ( | RedGroupRef | *RedGroupRefPtr, |
| *RedGroupRefPtr | | ссылка на редукционную группу. |
| *RedRefPtr | | ссылка на редукционную переменную. |
| *PSSpaceRefPtr | | ссылка на спецификатор процессорной системы и процессорного пространства редукционной переменной. |
| *RenewSignPtr | | признак обновления сохранённого значения редукционной переменной при повторном включении её в группу. |
Включение редукционной переменной в группу означает регистрацию её как участника групповой редукционной операции и запоминание её значения для выполнения редукции.
Как заданная при обращении к функции редукционная группа, так и включаемая в неё редукционная переменная должны быть созданы в текущей подзадаче. Кроме того, редукционная группа не должна быть уже запущена с помощью функции strtrd_ (см. п. 11.5), а редукционная переменная – уже включена в другую редукционную группу.
Параметр, заданный ссылкой *PSSpaceRefPtr, специфицирует процессорное пространство редукционной переменной – совокупность процессоров, на которых выполняется связанная с переменной редукционная операция. Этот параметр также связывает с редукционной переменной процессорную систему, которая становится процессорной системой редукционной группы при включении в неё первой редукционной переменной. Процессорное пространство редукционной переменной является нестрогим подмножеством совокупности элементов её процессорной системы. Процессорные системы всех включаемых в редукционную группу переменных должны быть эквивалентны, т. е. должны иметь одинаковые размерности и размеры по каждому измерению, а также совпадать по составу процессоров.
В качестве спецификаторов процессорного пространства могут быть заданы следующие объекты:
-
Процессорная система.
Заданная параметром PSSpaceRefPtr процессорная система становится процессорной системой и процессорным пространством редукционной переменной. Все её элементы должны входить в состав текущей процессорной системы.
-
Распределённый массив.
Распределённый массив, определённый ссылкой *PSSpaceRefPtr, должен быть отображён в процессорную систему, которая рассматривается системой поддержки в качестве процессорной системы и процессорного пространства редукционной переменной. Каждый элемент этой процессорной системы обязан принадлежать текущей процессорной системе.
-
Параллельный цикл.
Параллельный цикл, заданный указателем PSSpaceRefPtr, должен быть текущим и отображён (т. е. использование параллельного цикла для спецификации процессорного пространства редукционной переменной допустимо только после его отображения с помощью функции mappl_, см. п. 9.2). Процессорная система, в которую отображён параллельный цикл, полагается процессорной системой редукционной переменной. За процессорное пространство редукционной переменной принимается подмножество элементов её процессорной системы, в которое не входят процессоры, дублирующие выполнение размноженных витков цикла.
-
Представление абстрактной машины.
Если представление абстрактной машины отображено функцией distr_ (redis_, mdistr_, mredis_) , то процессорная система, в которую осуществлено это отображение, принимается за процессорную систему и процессорное пространство редукционной переменной. В случае, когда представление не отображено функцией distr_ (redis_, mdistr_, mredis_), но хотя бы одна его абстрактная машина отображена функцией mappl_, процессорной системой редукционной переменной считается текущая процессорная система, а процессорным пространством – совокупность центральных процессоров подзадач, созданных при отображении элементов представления (редукция по завершившей выполнение группе параллельных подзадач, см. п. 10).
Представление абстрактной машины или его элементы могут быть отображены в текущую процесорную систему или в её непосредственные или косвенные подсистемы.
При нулевом значении ссылки *PSSpaceRefPtr или при равном NULL значении указателя PSSpaceRefPtr процессорной системой редукционной переменной и её процессорным пространством полагается текущая процессорная система.
Допускается повторное включение редукционной переменной в редукционную группу. Спецификация процессорного пространства переменной при этом может быть другой, но её процессорная система должна быть эквивалентна процессорной системе редукционной группы. При повторном включении в группу редукционной переменной её сохранённое значение обновляется, если параметр *RenewSignPtr имеет ненулевое значение, и не меняется при нулевом значении *RenewSignPtr или при равном NULL значении указателя RenewSignPtr.
Функция возвращает нулевое значение.
11.4Запоминание значений редукционных переменных
Рассмотренные ниже функции позволяют обновить значения редукционых переменных, сохранённые при их включении в редукционную группу, без указания (и, следовательно, без изменения) спецификации процессорных пространств.
long saverv_ (RedRef *RedRefPtr);
*RedRefPtr ссылка на редукционную переменную.
Функция saverv_ обновляет сохранённое значение заданной редукционной переменной для последующего использования его при выполнения групповой редукционной операции.
Редукционная переменная, заданная ссылкой *RedRefPtr, должна быть создана в текущей подзадаче, а её редукционная группа не должна быть запущена функцией strtrd_ (см. п. 11.5).
Возвращается нулевое значение.
long saverg_ (RedGroupRef *RedGroupRefPtr);
*RedGroupRefPtr ссылка на редукционную группу.
Функция saverg_ запоминает значения всех переменных заданной редукционной группы. Редукционная группа, заданная ссылкой *RedGroupRefPtr, должна быть создана в текущей подзадаче, а также не может быть пустой или запущенной с помощью функции strtrd_ (см. п. 11.5).
Возвращается нулевое значение.
11.5Запуск редукционной группы
long strtrd_ (RedGroupRef *RedGroupRefPtr);
*RedGroupRefPtr ссылка на редукционную группу.
Функция strtrd_ осуществляет инициацию (старт) всех редукционных операций над всеми редукционными переменными, входящими в группу. После обращения к функции strtrd_ все редукционные переменные группы считаются недоступными (до завершения редукции).
Запускаемая редукционная группа должна быть создана в текущей подзадаче и не может быть уже запущенной с помощью функции strtrd_. Повторный запуск редукционной группы возможен лишь после завершения предыдущего запуска функцией waitrd_ (см. п. 11.6). Нельзя запустить пустую редукционную группу.
Используемые для выполнения редукционных операций значения переменных, входящих в запускаемую группу, определяются системой поддержки следующим образом. Для центрального процессора значением редукционной переменной является всегда её текущее значение. На процессоре, не являющимся центральным, текущее значение редукционной переменной подвергается следующей коррекции:
-
Операция сложения (rf_SUM).
Из текущего значения редукционной переменной вычитается её значение, сохранённое при включении переменной в группу или обновлённое с помощью функций saverv_ или saverg_.
-
Операция умножения (rf_MULT).
Текущее значение редукционной переменной делится на её значение, сохранённое при включении переменной в группу или обновлённое с помощью функций saverv_ или saverg_ (нулевой делитель заменяется на единичный).
-
Операции поразрядного сложения по модулю 2 и поразрядного сложения по модулю 2 с последующим инвертированием всех разрядов (rf_XOR и rf_EQU).
Текущее значение редукционной переменной поразрядно слкадывается по модулю 2 (или поразрядно складывается по модулю 2 с последующим инвертированием разрядов) с её значением, сохранённым при включении переменной в группу или обновлённым с помощью функций saverv_ или saverg_.
Функция возращает нулевое значение.
11.6Ожидание завершения редукции
long waitrd_ (RedGroupRef *RedGroupRefPtr);
*RedGroupRefPtr ссылка на редукционную группу.
Функция waitrd_ выполняет ожидание завершения всех редукционных операций заданной группы и открывает доступ к входящим в неё редукционным переменным.
Редукционная группа, заданная ссылкой *RedGroupRefPtr, должна быть создана в текущей подзадаче. Ожидание завершения редукционных операций группы, не запущенной ранее с помошью функции strtrd_, не допускается.
После завершения редукционных операций группа становится открытой для включения в неё новых редукционных переменных и обновления значений переменных, уже включённых в её состав. Группа, редукционные операции которой завершены, может быть повторно запущена функцией strtrd_.















