rtsIDr (1158449), страница 9
Текст из файла (страница 9)
| ArrayHeader | | заголовок заново выравниваемого распределённого массива. |
| *AMViewRefPtr | | ссылка на представление абстрактной машины, являющееся образцом выравнивания. |
| *ArrayMapRefPtr | | ссылка на карту отображения распределённого массива. |
| *NewSignPtr | | задаваемый единицей признак обновления содержимого распределённого массива. |
Функция mrealn_ отменяет расположение, установленное ранее с помощью функции malign_ (или align_ , см.п.7.1) для распределённого массива с заголовком *ArrayHeaderPtr, и задаёт для этого массива новое расположение в соответствии с указанной при обращении к функции картой отображения. Все распределённые массивы, при выравнивании которых рассматриваемый массив использовался в качестве образца, своё расположение сохранят.
Размерность распределённого массива и размерность представления абстрактной машины должны быть равны соответствующим размерностям, содержащимся в карте отображения.
При равном NULL значении AMViewRefPtr или при нулевом значении *AMViewRefPtr образцом выравнивания будет представление абстрактной машины, ссылка на которое содержится в карте отображения.
Как переотображаемый распределённый массив, так и представление абстрактной машины (заданное ссылкой *AMViewRefPtr или в карте отображения) на момент обращения к функции должны быть отображены в текущую процессорную систему или её подсистему (возможно, каждый в свою).
При ненулевом значении *NewSignPtr содержимое вновь выравненного массива будет обновлено (расписано нулевым кодом), а при нулевом сохранено. При переотображении массива содержимое его границ (см. п. 12) не сохраняется.
Перераспределение массива с помощью функции mrealn_ возможно лишь в том случае, если при его создании функцией crtda_ значение её параметра *ReDistrParPtr было задано равным 2 или 3 (см.п.6).
Распределённый массив, заданный при обращении к функции, может быть ранее не отображён. В этом случае функция mrealn_ выполняется как функция malign_ , а значение параметра *NewSignPtr несущественно. Значение параметра *ReDistrParPtr, с которым был создан распределённый массив, также не имеет значения.
Функция возвращает ненулевое значение, если переотображённый массив имеет локальную часть на текущем процессоре, и нулевое в противном случае.
7.7Уничтожение карты отображения
long delarm_(ArrayMapRef *ArrayMapRefPtr);
*ArrayMapRefPtr ссылка на карту отображения распределённого массива.
Функция уничтожает созданную функцией arrmap_ карту отображения распределённого массива. После уничтожения карты отображения ссылка на неё может использоваться по усмотрению пользовательской программы.
Карта отображения может быть уничтожена функцией delarm_ только в том случае, если она была создана в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Карта отображения может быть уничтожена также с помощью функции delobj_ (см.п.17.5).
Возвращается нулевое значение.
Замечание. Одним из возможных применений функций выравнивания распределённого массива по карте отображения сохранение и восстановление расположения массивов в процедурах, обрабатывающих внешние распределённые массивы с их перераспределением.
Отметим, что на момент использования карты отображения для задания или изменения расположения массива массив, являвшийся источником этой карты, может и не существовать.
7.8Опрос ссылки на представление абстрактной машины, в которое отображён заданный распределённый массив
AMViewRef getamv_ (long ArrayHeader[]);
ArrayHeader заголовок распределённого массива.
Функция getamv_ возвращает ссылку на представление абстрактной машины, по которому выравнен распределённый массив, заданный заголовком ArrayHeader. Нулевое значение возвращённой ссылки означает, что заданный массив не отображён.
8Определение программного блока
long begbl_ (void);
Функция begbl_ определяет начало блока локализации следующих системных объектов:
-
распределённого массива;
-
представления абстрактной машины;
-
многопроцессорной системы;
-
карты отображения представления абстрактной машины;
-
карты отображения распределённого массива;
-
редукционной переменной;
-
редукционной группы;
-
группы границ распределённых массивов;
-
буфера удалённых элементов регулярного доступа;
-
группы буферов удалённых элементов регулярного доступа;
-
буфера удалённых элементов нерегулярного доступа;
-
группы буферов удалённых элементов нерегулярного доступа.
Вышеперечисленные объекты, созданные в блоке локализации, являются локальными и автоматически уничтожаются при выходе из этого блока (кроме объектов, созданных как статические и уничтожаемых только явно). Блоки локализации могут быть вложенными.
Отметим, что при уничтожении представления абстрактной машины уничтожаются все отображённые по нему распределённые массивы, а при уничтожении процессорной подсистемы – все отображённые в неё представления абстрактных машин.
Возвращается нулевое значение.
long endbl_ (void);
Функция endbl_ определяет завершение блока локализации. Возвращается нулевое значение.
9Описание параллельного цикла
9.1Создание параллельного цикла
LoopRef crtpl_ (long *RankPtr);
*RankPtr размерность параллельного цикла.
Функция crtpl_ создает параллельный цикл (определяет его начало) и возвращает ссылку на него. Завершение параллельного цикла осуществляется с помощью функции endpl_ (см. п. 9.5).
Внутри любого параллельного цикла может быть создан и завершен другой параллельный цикл, т. е. параллельные циклы могут быть вложенными.
9.2Отображение параллельного цикла
| long mappl_ ( | LoopRef | *LoopRefPtr, |
| *LoopRefPtr | | ссылка на параллельный цикл. |
| *PatternRefPtr | | ссылка на образец отображения параллельного цикла. |
| AxisArray | | массив, j-й элемент которого содержит номер индексной переменной (номер измерения) параллельного цикла для линейного правила выравнивания (j+1)-го измерения образца. |
| CoeffArray | | массив, j-й элемент которого содержит коэффициент для индексной переменной параллельного цикла в линейном правиле выравнивания (j+1)-го измерения образца. |
| ConstArray | | массив, j-й элемент которого содержит константу линейного правила выравнивания для (j+1)-го измерения образца. |
| LoopVarAddrArray | | массив, i-й элемент которого содержит адрес индексной переменой (i+1)-го измерения параллельного цикла, приведённый к типу AddrType. |
| LoopVarTypeArray | | массив, i-й элемент которого содержит тип индексной переменной (i+1)-го измерения параллельного цикла. |
| InInitIndexArray | | входной массив, i-й элемент которого содержит начальное значение индексной переменной (i+1)-го измерения параллельного цикла. |
| InLastIndexArray | | входной массив, i-й элемент которого содержит конечное значение индексной переменной (i+1)-го измерения параллельного цикла. |
| InStepArray | | входной массив, i-й элемент которого содержит значение шага для индексной переменной (i+1)-го измерения параллельного цикла. |
| OutInitIndexArray | | выходной массив, в i-й элемент которого будет записано скорректированное начальное значение индексной переменной (i+1)-го измерения параллельного цикла. |
| OutLastIndexArray | | выходной массив, в i-й элемент которого будет записано скорректированное конечное значение индексной переменной (i+1)-го измерения параллельного цикла. |
| OutStepArray | | выходной массив, в i-й элемент которого будет записано скорректированное значение шага для индексной переменной (i+1)-го измерения параллельного цикла. |
Функция mappl_ создает регулярное отображение указанного параллельного цикла на указанное представление абстрактной машины в соответствии с заданными правилами отображения и описаниями измерений цикла. При этом витки цикла распределяются между дочерними абстрактными машинами, которые входят в состав этого представления. Представление абстрактной машины определяется образцом, который может быть как самим представлением, так и, при косвенном отображении, распределённым массивом. В последнем случае ссылка на образец это первое слово заголовка распределённого массива.
Использование в качестве образца распределённого массива допустимо лишь в том случае, если он уже отображён на некоторое представление абстрактной машины, а использование представления абстрактной машины если оно уже отображено на некоторую многопроцессорную систему. Поэтому выполнение функции mappl_ сводится к распределению витков отображаемого цикла между процессорами, входящими в состав этой многопроцессорной систем.
Повторное отображение параллельного цикла не допускается.
Каждое описание измерения параллельного цикла содержит начальное и конечное значения индекса, а также шаг его изменения. Функция mappl_ перевычисляет эти характеристики для текущего процессора (выделяет соответствующее подмножество итераций цикла) и записывает их новые значения в массивы OutInitIndex, OutLastIndexArray и OutStepArray. Число описаний измерений параллельного цикла должно быть равно его размерности.
Начальное значение индекса для любого измерения может быть как меньше его конечного значения, так и больше его. В первом случае предполагается задание положительного значения шага, во втором отрицательного.
В Фортране массив LoopVarAddrArray может быть сформирован с помощью функции dvmadr_ , рассмотренной в п.17.7.
Типы индексных переменных параллельного цикла, задаваемые в массиве LoopVarTypeArray, могут принимать значения:
0 – переменная типа long;
1 – переменная типа int;
2 – переменная типа short;
3 – переменная типа char.
Если LoopVarTypeArray = NULL, то типы индексных переменных всех измерений цикла полагаются равными единице (int).
Рассмотрим отображение параллельного цикла подробнее. Пусть F многозначная функция, определённая на индексном пространстве отображаемого цикла и принимающая значения в индексном пространстве образца:
| F( (I1, ... ,Ii, ... ,In) ) = | F1(I1, ... ,Ii, ... ,In) |
где:
| | | символ операции прямого произведения множеств; |
| n | | размерность параллельного цикла; |
| m | | размерность образца; |
| Ii | | индексная переменная i-го измерения параллельного цикла; |
| Fj | | многозначная функция, принимающая значения во множестве значений индексной переменной j-го измерения образца. |
Отображение параллельного цикла по заданному образцу это указание системе поддержки (посредством задания функции F) о том, что виток параллельного цикла, определённый индексным вектором (i1, ... ,in), должен быть выполнен на тех и только тех процессорах, на которых размещён (или на которые отображён) хотя бы один из элементов образца, определённых множеством F((i1, ... ,in)) (т.е. множеством-образом, элементами которого являются векторы индексного пространства образца).
Функции F1, ... ,Fm называются координатными правилами отображения параллельного цикла. Система поддержки обеспечивает следующие правила отображения.
| 1. | Fj(I1, ... ,In) = { Aj*Ik + Bj } , где: | ||
| k=f(j) | | номер измерения параллельного цикла (1 ≤ k ≤ n, f(j1) ≠ f(j2) при j1 ≠ j2); | |
| Aj, Bj | | целые числа. | |
В этом случае образом элемента (i1, ... ,in) индексного пространства параллельного цикла является множество, содержащее один элемент Aj*Ik + Bj, принадлежащий множеству значений индексной переменной j-го измерения образца.
Aj и Bj должны удовлетворять условиям:
0 ≤ Aj*MAXk + Bj ≤ MAXj и 0 ≤ Aj*MINk + Bj ≤ MAXj , где:
| MAXj | | максимальное значение индексной переменной j-го измерения образца; |
| MAXk | | максимальное значение индексной переменной k-го измерения параллельного цикла; |
| MINk | | минимальное значение индексной переменной k-го измерения параллельного цикла. |
2. Fj(I1, ... ,In) = { q Mj: 0 ≤ q ≤ MAXj } , где:
| Mj | | множество значений индексной переменной j-го измерения образца; |
| MAXj | | максимальное значение индексной переменной j-го измерения образца. |
В этом случае образом любого элемента (i1, ... ,in) индексного пространства отображаемого цикла является все множество значений индексной переменной j-го измерения образца (в подобных случаях принято использовать символ "*" , т. е. "любой из допустимых").














