rtsIDr (1158449), страница 12
Текст из файла (страница 12)
| *RedRefPtr | | ссылка на редукционную переменную. |
| *LocIndTypePtr | | код типа индексных переменных. |
Функция сообщает системе поддержки тип индексных переменных, значения которых определяют координаты локальных максимумов или минимумов редукционных переменных, составляющих массив, заданный при обращении к функции crtred_ (crtrdf_) параметром RedArrayPtr (RedArrayAddrPtr) (см. п. 11.1). Значения этих индексных переменных содержатся в каждом элементе массива с информацией локализации, задаваемого при обращении к функциям crtred_ и crtrdf_ указателем LocArrayPtr.
Параметр *LocIndTypePtr может принимать значения:
0 – индексные переменные типа long,
1 – integer,
2 – short,
3 – char.
Редукционная переменная, заданная ссылкой *RedRefPtr, должна быть создана в текущей подзадаче и не может быть уже включена в какую-либо редукционную группу.
Возвращается нулевое значение.
Сразу после создания редукционной переменной функцией crtred_ (crtrdf_) тип индексных переменных, значения которых задают координаты локального максимума или минимума, считается равным integer (значение типа по умолчанию).
11.3Создание редукционной группы
| RedGroupRef crtrg_ ( | long | *StaticSignPtr, |
| *StaticSignPtr | | признак создания статической редукционной группы. |
| *DelRedSignPtr | | признак уничтожения всех редукционных переменных, входящих в группу, при её уничтожении. |
Функция crtrg_ создает пустую редукционную группу (не содержащую ни одной редукционной переменной) и возвращает ссылку на неё.
Задаваемый ненулевым значением *StaticSignPtr признак статической редукционной группы означает создание группы, не уничтожаемой при выходе из программного блока (см.п.8). Такая редукционная группа может быть уничтожена только явно, с помощью рассмотренной ниже функции delrg_ .
Ненулевое значение *DelRedSignPtr задает такой режим уничтожения редукционной группы, при котором все входящие в неё (на момент уничтожения) редукционные переменные будут также уничтожены. При явном уничтожении группы уничтожение входящих в неё переменных будет также явным, при неявном неявным.
11.4Включение редукционной переменной в редукционную группу
| long insred_ ( | RedGroupRef | *RedGroupRefPtr, |
| *RedGroupRefPtr | | ссылка на редукционную группу. |
| *RedRefPtr | | ссылка на редукционную переменную. |
| *PSSpaceRefPtr | | ссылка на спецификатор процессорной системы и процессорного пространства редукционной переменной. |
| *RenewSignPtr | | признак обновления сохранённого значения редукционной переменной при повторном включении её в группу. |
Включение редукционной переменной в группу означает регистрацию её как участника групповой редукционной операции и запоминание её значения для выполнения редукции.
Как заданная при обращении к функции редукционная группа, так и включаемая в неё редукционная переменная должны быть созданы в текущей подзадаче. Кроме того, редукционная группа не должна быть уже запущена с помощью функции strtrd_ (см. п. 11.6), а редукционная переменная – уже включена в другую редукционную группу.
Параметр, заданный ссылкой *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.5Запоминание значений редукционных переменных
Рассмотренные ниже функции позволяют обновить значения редукционых переменных, сохранённые при их включении в редукционную группу, без указания (и, следовательно, без изменения) спецификации процессорных пространств.
long saverv_ (RedRef *RedRefPtr);
*RedRefPtr ссылка на редукционную переменную.
Функция saverv_ обновляет сохранённое значение заданной редукционной переменной для последующего использования его при выполнения групповой редукционной операции.
Редукционная переменная, заданная ссылкой *RedRefPtr, должна быть создана в текущей подзадаче, а её редукционная группа не должна быть запущена функцией strtrd_ (см. п. 11.6).
Возвращается нулевое значение.
long saverg_ (RedGroupRef *RedGroupRefPtr);
*RedGroupRefPtr ссылка на редукционную группу.
Функция saverg_ запоминает значения всех переменных заданной редукционной группы. Редукционная группа, заданная ссылкой *RedGroupRefPtr, должна быть создана в текущей подзадаче, а также не может быть пустой или запущенной с помощью функции strtrd_ (см. п. 11.6).
Возвращается нулевое значение.
11.6Запуск редукционной группы
long strtrd_ (RedGroupRef *RedGroupRefPtr);
*RedGroupRefPtr ссылка на редукционную группу.
Функция strtrd_ осуществляет инициацию (старт) всех редукционных операций над всеми редукционными переменными, входящими в группу. После обращения к функции strtrd_ все редукционные переменные группы считаются недоступными (до завершения редукции).
Запускаемая редукционная группа должна быть создана в текущей подзадаче и не может быть уже запущенной с помощью функции strtrd_. Повторный запуск редукционной группы возможен лишь после завершения предыдущего запуска функцией waitrd_ (см. п. 11.7). Нельзя запустить пустую редукционную группу.
Используемые для выполнения редукционных операций значения переменных, входящих в запускаемую группу, определяются системой поддержки следующим образом. Для центрального процессора значением редукционной переменной является всегда её текущее значение. На процессоре, не являющимся центральным, текущее значение редукционной переменной подвергается следующей коррекции:
-
Операция сложения (rf_SUM).
Из текущего значения редукционной переменной вычитается её значение, сохранённое при включении переменной в группу или обновлённое с помощью функций saverv_ или saverg_.
-
Операция умножения (rf_MULT).
Текущее значение редукционной переменной делится на её значение, сохранённое при включении переменной в группу или обновлённое с помощью функций saverv_ или saverg_ (нулевой делитель заменяется на единичный).
-
Операции поразрядного сложения по модулю 2 и поразрядного сложения по модулю 2 с последующим инвертированием всех разрядов (rf_XOR и rf_EQU).
Текущее значение редукционной переменной поразрядно слкадывается по модулю 2 (или поразрядно складывается по модулю 2 с последующим инвертированием разрядов) с её значением, сохранённым при включении переменной в группу или обновлённым с помощью функций saverv_ или saverg_.
Функция возращает нулевое значение.
11.7Ожидание завершения редукции
long waitrd_ (RedGroupRef *RedGroupRefPtr);
*RedGroupRefPtr ссылка на редукционную группу.
Функция waitrd_ выполняет ожидание завершения всех редукционных операций заданной группы и открывает доступ к входящим в неё редукционным переменным.
Редукционная группа, заданная ссылкой *RedGroupRefPtr, должна быть создана в текущей подзадаче. Ожидание завершения редукционных операций группы, не запущенной ранее с помошью функции strtrd_, не допускается.
После завершения редукционных операций группа становится открытой для включения в неё новых редукционных переменных и обновления значений переменных, уже включённых в её состав. Группа, редукционные операции которой завершены, может быть повторно запущена функцией strtrd_.
Возвращается нулевое значение.
11.8Уничтожение редукционной группы
long delrg_ (RedGroupRef *RedGroupRefPtr);















