rtsIDr (1158449), страница 10
Текст из файла (страница 10)
В результате осуществлённого функцией mappl_ отображения заданного параллельного цикла в заданное (непосредственно или косвенно) представление абстрактной машины каждому витку цикла будет поставлена в соответствие совкупность абстрактных машин, являющаяся образом витка при рассмотренном выше отображении F. При входе в виток параллельного цикла все соответствующие ему абстрактные машины становятся текущими (каждая на своём процессоре). Поэтому в общем случае (в силу многозначности функции F) выполнение параллельной ветви, представленной витком цикла, осуществляется несколькими параллельными подзадачами (см. п. 10). Поскольку процессорные системы этих подзадач могут быть разными, дальнейшее ветвление (в витке параллельного цикла) может быть неоднозначным. Чтобы избежать такого рода дублирования витков параллельного цикла по разным подзадачам, рекомендуется избегать, без особой на то необходимости, размножения витков цикла по измерениям представления родительской абстрактной машины, т. е. не применять второе из рассмотренных выше выше координатных правил отображения. Для этого, например, можно создавать вспомогательное представление родительской абстрактной машины меньшей размерности, в которое параллельный цикл отображается без размножения витков.
Отметим, что хотя, концептуально, при входе в параллельную ветвь должна происходить смена текущей абстрактной машины на соответствующую дочернюю абстрактную машину, фактически (для снижения накладных расходов), смена текущей абстрактной машины производится не на входе в виток цикла, а только при необходимости (т. е. при обращении к тем функциям системы поддержки, выполнение которых требует существования текущей абстраткной машины как программного объекта, например, при опросе ссылки на текущую абстрактную машину, при вводе/выводе в витке параллельного цикла и т. д.).
Примеры.
-
Отображение F((I1,I2)) = {I1} {I2} означает, что виток двухмерного цикла должен быть выполнен на тех же процессорах, на которые отображён элемент двухмерного образца, если их индексы совпадают.
-
Отображение F((I1,I2)) = {*} {I1 + 5} {*} означает, что виток двухмерного цикла будет выполнен на тех же процессорах, на которые отображён элемент трёхмерного образца, если индекс по 2-му измерению образца на 5 больше индекса по 1-му измерению параллельного цикла (вне зависимости от значения индекса параллельного цикла по 2-му измерению и от значений индексов образца по 1-му и 3-му измерениям).
-
Отображение F((I1,I2,I3)) = {*} {*} означает, что каждый виток трёхмерного цикла будет выполнен на каждом процессоре, на который отображён хотя бы один элемент двухмерного образца (вне зависимости от значений индексов отображаемого цикла и образца).
-
Отображение F((I1,I2)) = {0} {1} {2} означает, что каждый виток двухмерного цикла (вне зависимости от значений его индексов) будет выполнен на тех процессорах, на которые отображён элемент трёхмерного образца с индексами (0,1,2).
Определяя отображение параллельного цикла в пространство образца (т.е. задавая функции F1, ... ,Fm), необходимо учитывать, что его витки не должны выходить за пределы пространства образца. Сочетание корректного отображения цикла и корректного отображения образца обеспечит, в конечном результате, верное распределение витков цикла по процессорам. Отметим, что если образец не является представлением абстрактной машины, то отображение параллельного цикла на представление абстрактной машины является суперпозицией отображения параллельного цикла в пространство образца и выравнивания образца по абстрактной машине (см.п.7.2).
При обращении к функции mappl_ правило отображения Fj(I1,...,In) = Aj*Ik + Bj для j-го измерения образца задается следующим образом:
AxisArray[j-1] содержит значение k;
CoeffArray[j-1] содержит значение Aj;
ConstArray[j-1] содержит значение Bj.
Для задания правила Fj(I1, ... ,In), значением которого для любых I1, ... ,In является множество всех значений индексной переменной j-го измерения образца, значение AxisArray[j-1] (значение k) должно быть установлено равным -1. Значения CoeffArray[j-1] и ConstArray[j-1] (значения Aj и Bj) в этом случае несущественны.
Число правил отображения, заданных при обращении к функции mappl_ , должно быть равно размерности образца.
Функция возвращает ненулевое значение, если отображённый параллельный цикл имеет локальную часть на текущем процессоре, и нулевое в противном случае.
9.3Изменение порядка выполнения витков цикла
| long exfrst_ ( | LoopRef | *LoopRefPtr, |
| *LoopRefPtr | | ссылка на параллельный цикл. |
| *ShadowGroupRefPtr | | ссылка на группу границ, обмен которыми будет запущен после вычисления экспортируемых элементов локальных частей распределённых массивов. |
Функция exfrst_ устанавливает такой порядок выполнения витков параллельного цикла, что сначала вычисляются экспортируемые элементы (элементы-оригиналы, являющиеся образами элементов границ локальных частей распределённых массивов), затем запускается обмен границами (обновление теневых элементов) указанной группы, после чего происходит переход к вычислению внутренних точек локальных частей распределённых массивов (внутренние точки это локальная часть распределённого массива без экспортируемых элементов). После вычисления внутренних точек автоматического ожидания завершения обмена границами не производится.
Указанный выше порядок выполнения витков достигается разбиением их на каждом процессоре на 2*n+1 частей (порций) (n – размерность цикла). Информация о каждой порции витков опрашивается с помощью функции dopl_ (см. п. 9.4) и помещается при её выполнении в массивы OutInitIndexArray, OutLastIndexArray и OutStepArray, являющиеся параметрами функции mappl_ . Обращение к функции exfrst_ влечёт следующий порядок опроса порций витков функцией dopl_ : первые 2*n опросов помещают в массивы OutInitIndexArray, OutLastIndexArray и OutStepArray инфомацию о витках цикла, соответствующих экспортируемым элементам распределённых массивов; последний положительный опрос соответствует внутренним элементам распределённых массивов.
Обращение к функции exfrst_ должно предшествовать отображению параллельного цикла функцией mappl_ .
Группа границ, заданная ссылкой *ShadowGroupRefPtr, должна быть создана в текущей подзадаче.
При разбиении выполнения параллельного цикла на части с помощью функции exfrst_ результирующие ширины границ распределённых массивов, необходимые для создания порций витков, вычисляются следующим образом (вычисление осуществляет функция отображения параллельного цикла mappl_). Пусть ShadowArrayGroup – совокупность распределённых массивов, границы которых включены в группу, заданную ссылкой *ShadowGroupRefPtr. Пусть также AMView – представление абстрактной машины, в которое отображён (непосредственно или косвенно) параллельный цикл, а PLAxis – измерение цикла, которое отображено в измерение AMVAxis этого представления. Тогда результирующая нижняя (верхняя) ширина границы для измерения цикла PLAxis равна максимальному значению ширин нижних (верхних) границ тех измерений массивов из совокупности ShadowArrayGroup, которые выравнены по измерению AMVAxis представлений, эквивалентных представлению AMView.
Если системе поддержки не удалось найти ни одного распределённого массива из совокупности ShadowArrayGroup, измерение которого выравнено по измерению AMVAxis представления, эквивалентного представлению AMView, то результирующие ширины нижних и верхних границ для измерения PLAxis полагаются нулевыми. Для измерений параллельного цикла, не отображённых ни в какое измерение представления AMView, ширины нижних и верхних границ также полагаются равными нулю.
Подробно вопрос о границах локальных частей распределённых массивов рассмотрен в п.12.
Функция возвращает нулевое значение.
Замечание. Представления одной и той же абстрактной машины считаются эквивалентными, если они:
-
имеют одни и те же размерности и размеры по каждому измерению;
-
одинаково отображены в эквивалентные процессорные подсистемы.
Процессорные подсистемы системы одной и той же процессорной системы эквивалентны, если они:
-
имеют одинаковые размерности и размеры по каждому измерению;
-
состоят из одних и тех же процессоров.
| long imlast_ ( | LoopRef | *LoopRefPtr, |
| *LoopRefPtr | | ссылка на параллельный цикл. |
| *ShadowGroupRefPtr | | ссылка на группу границ, завершение обмена которыми будет ожидаться после вычисления внутренних точек локальных частей распределённых массивов. |
Функция imlast_ устанавливает порядок выполнения витков параллельного цикла таким, что сначала вычисляются внутренние точки локальных частей распределённых массивов, затем производится ожидание завершения обмена границами указанной группы, после чего происходит переход к вычислению экспортируемых элементов локальных частей распределённых массивов (элементов-оригиналов). После вычисления экспортируемых элементов автоматического запуска обмена границами не производится.
Как и для функции exfrst_ , требуемый порядок выполнения витков достигается разбиением их на каждом процессоре на 2*n+1 частей (порций) (n – размерность цикла). Информация о каждой порции витков опрашивается с помощью функции dopl_ (см. п. 9.4) и помещается при её выполнении в массивы OutInitIndexArray, OutLastIndexArray и OutStepArray, являющиеся параметрами функции mappl_ . Обращение к функции imlast_ влечёт следующий порядок опроса порций витков функцией dopl_ : первый опрос помещает в массивы OutInitIndexArray, OutLastIndexArray и OutStepArray инфомацию о витках цикла, соответствующих внутренним элементам распределённых массивов; следующие 2*n опросов соответствуют экспортируемым элементам распределённых массивов.
Обращение к функции imlast_ должно предшествовать отображению параллельного цикла функцией mappl_ .
Группа границ, заданная ссылкой *ShadowGroupRefPtr, должна быть создана в текущей подзадаче.
Вычисление результирующих ширин границ распределённых массивов, необходимых для создания порций витков, совпадает с их вычислением, рассмотренным выше при описании функции exfrst_ .
Возвращается нулевое значение.
9.4Опрос необходимости продолжения выполнения параллельного цикла
long dopl_ (LoopRef *LoopRefPtr);
*LoopRefPtr ссылка на параллельный цикл.
Функция dopl_ позволяет установить, выполнены ли все части параллельного цикла, на которые разбито его выполнение посредством функций exfrst_ или imlast_. При каждом очередном обращении к функции dopl_ производится корректировка параметров цикла, содержащихся в массивах OutInitIndexArray, OutLastIndexArray и OutStepArray (выходные параметры функции mappl_).
Функция возвращает значение:
| 0 | | выполнение всех частей параллельного цикла завершено; |
| 1 | | выполнение цикла требуется продолжить (в массивы OutInitIndexArray, OutLastIndexArray и OutStepArray помещена информация об очередной порции витков). |
При изменённом порядке выполнения витков функция dopl_ последовательно возвращает 2*n+1 положительных значений (см. п. 9.3). Если выполнение цикла не разбивалось на части функциями exfrst_ и imlast_ , то функция dopl_ возвращает ненулевое значение только один раз. При этом информация, помещённая в массивы OutInitIndexArray, OutLastIndexArray и OutStepArray функцией mappl_ и соответствующая локальной части цикла, не меняется.
Отметим, что разбиение цикла на части может быть связано и с нерегулярным отображением пространства образца на многопроцессорную систему. В этом случае корректировка текущих параметров цикла при завершении очередного регулярного участка и опрос завершения выполнения всех участков также осуществляется функцией dopl_.
Обращение к функции dopl_ допустимо только для отображённого параллельного цикла.
9.5Завершение параллельного цикла
long endpl_ (LoopRef *LoopRefPtr);
*LoopRefPtr ссылка на параллельный цикл.















