rtsIDr (1158449), страница 8
Текст из файла (страница 8)
Функция возвращает ненулевое значение, если отображённый массив имеет локальную часть на текущем процессоре, и нулевое в противном случае.
Замечание. Заданное функции align_ отображение распределённого массива может быть выполнено лишь в том случае, если для любого процессора, на который отображён хотя бы один элемент массива, локальный размер каждого измерения массива, получаемый в результате отображения, не меньше ширин верхней и нижней границ этого измерения.
7.2Суперпозиция выравниваний
Пусть функция G задает расположение n-мерного массива в пространстве r-мерного образца, а функция P r-мерного массива в пространстве m-мерного образца:
| G((I1, ... ,Ii, ... ,In)) = | G1(I1, ... ,Ii, ... ,In) |
| P((J1, ... ,Jj, ... ,Jr)) = | P1(J1, ... ,Jj, ... ,Jr) |
Тогда осуществленное с помощью функции align_ выравнивание P r-мерного массива PatternDA в m-мерном пространстве образца Pattern с последующим выравниванием G n-мерного массива DA в r-мерном пространстве массива PatternDA является выравниванием F n-мерного массива DA в m-мерном пространстве образца Pattern, представляющим собой произведение (суперпозицию) отображений P и G:
| F((I1, ... ,Ii, ... ,In)) = P * G = | U{P(v)} = V G((I1, ... ,In)) | F1(I1, ... ,Ii, ... ,In) |
Координатные правила выравнивания Fs (0 ≤ s ≤ m ) отображения F являются суперпозицией координатных правил выравнивания отображений P и G и могут быть записаны следующим образом.
1. Пусть Ps((J1, ... ,Jr)) = { q Ms: 0 ≤ q ≤ MAXs } , где:
| MAXs | | максимальное значение индексной переменной s-го измерения образца Pattern; |
| Ms | | множество значений индексной переменной s-го измерения образца Pattern. |
Тогда Fs((I1, ... ,In)) = Ms, т.е. полное размножение массива DA по s-му измерению образца Pattern.
| 2. | Пусть | Ps((J1, ... ,Jr)) = Cs*Jk + Ds и |
где:
| Jk | | индексная переменная k-го измерения массива PatternDA; |
| Il | | индексная переменная l-го измерения массива DA; |
| Cs, Qs | | целые числа; |
| Dk, Rk | | целые неотрицательные числа. |
Тогда Fs((I1, ... ,In)) = As*Il + Bs , где As = Cs*Qk и Bs = Cs*Rk + Ds.
| 3. | Пусть | Ps((J1, ... ,Jr)) = Cs*Jk + Ds и |
где:
| Jk | | индексная переменная k-го измерения массива PatternDA; |
| Cs | | целое число; |
| Ds | | целое неотрицательное число; |
| MAXk | | максимальное значение индексной переменной k-го измерения массива PatternDA; |
| Mk | | множество значений индексной переменной k-го измерения массива PatternDA. |
Тогда
| Fs((I1, ... ,In)) = | U {Cs*Jk + Ds} , |
т.е. частичное, разреженное линейной функцией Ps, размножение массива DA по s-му измерению образца Pattern.
Описанное отображение F эквивалентно заменяет выравнивания P и G в цепочке последовательных выравниваний. В частности, если образец Pattern не является представлением абстрактной машины и, следовательно, выравнен по другому образцу некоторой функцией Q, то отображения F и Q могут быть заменены их суперпозицией Q*F. Таким образом, заменой последовательных выравниваний их суперпозицией может быть построено результирующее выравнивание массива DA по представлению абстрактной машины (что и осуществляется системой поддержки при выполнении функции align_ выравнивания массива DA по массиву PatternDA).
7.3Изменение расположения распределенного массива
| long realn_( | long | ArrayHeader[], |
| ArrayHeader | | заголовок заново выравниваемого распределённого массива. |
| *PatternRefPtr | | ссылка на образец выравнивания. |
| AxisArray | | массив, j-й элемент которого содержит номер индексной переменной (номер измерения) распределённого массива для линейного правила выравнивания (j+1)-го измерения образца. |
| CoeffArray | | массив, j-й элемент которого содержит коэффициент для индексной переменной распределённого массива в линейном правиле выравнивания (j+1)-го измерения образца. |
| ConstArray | | массив, j-й элемент которого содержит константу линейного правила выравнивания для (j+1)-го измерения образца. |
| *NewSignPtr | | задаваемый единицей признак обновления содержимого распределённого массива. |
Функция realn_ отменяет расположение, установленное ранее с помощью функции align_ (или malign_ , см.п.7.5) для распределённого массива с заголовком *ArrayHeaderPtr, и задаёт для этого массива новое расположение в соответствии с указанными при обращении к функции параметрами. Все распределённые массивы, при выравнивании которых рассматриваемый массив использовался в качестве образца, свое расположение сохранят.
Как переотображаемый распределённый массив, так и образец выравнивания на момент обращения к функции должны быть отображены в текущую процессорную систему или её подсистему (возможно, каждый в свою).
При ненулевом значении *NewSignPtr содержимое вновь выравненного массива будет обновлено (расписано нулевым кодом), а при нулевом сохранено. При переотображении массива содержимое его границ (см. п. 12) не сохраняется.
Перераспределение массива с помощью функции realn_ возможно лишь в том случае, если при его создании функцией crtda_ значение её параметра *ReDistrParPtr было задано равным 2 или 3 (см.п.6).
Распределённый массив, заданный при обращении к функции, может быть ранее не отображён. В этом случае функция realn_ выполняется как функция align_ , а значение параметра *NewSignPtr несущественно. Значение параметра *ReDistrParPtr, с которым был создан распределённый массив, также не имеет значения.
Функция возвращает ненулевое значение, если переотображённый массив имеет локальную часть на текущем процессоре, и нулевое в противном случае.
7.4Опрос карты отображения
| ArrayMapRef arrmap_( | long | ArrayHeader[], |
| ArrayHeader | | заголовок распределённого массива. |
| *StaticSignPtr | | признак создания статической карты отображения. |
Функция arrmap_ создает объект (карту отображения), описывающий текущее отображение распределённого массива на представление абстрактной машины, и возвращает ссылку на созданный объект.
Карта отображения распределённого массива содержит, в частности, следующую информацию:
-
ссылку на представление абстрактной машины, в которое отображён распределённый массив;
-
правила выравнивания для всех измерений этого представления;
-
размерности распределённого массива и представления абстрактной машины (для контроля).
Задаваемый ненулевым значением *StaticSignPtr признак статической карты отображения означает создание карты, не уничтожаемой при выходе из программного блока (см.п.8). Такая карта может быть уничтожена только явно, с помощью рассмотренной в п.7.7 функции delarm_.
7.5Задание расположения распределенного массива по карте отображения
| long malign_( | long | ArrayHeader[], |
| ArrayHeader | | заголовок распределённого массива. |
| *AMViewRefPtr | | ссылка на представление абстрактной машины, являющееся образцом выравнивания. |
| *ArrayMapRefPtr | | ссылка на карту отображения распределённого массива. |
Функция malign_ задает отображение указанного распределённого массива на представление абстрактной машины по заданной карте отображения.
Размерность распределённого массива и размерность представления абстрактной машины должны быть равны соответствующим размерностям, содержащимся в карте отображения.
При равном NULL значении AMViewRefPtr или при нулевом значении *AMViewRefPtr образцом выравнивания будет представление абстрактной машины, ссылка на которое содержится в карте отображения.
Перед обращением к функции malign_ представление абстрактной машины (заданное ссылкой *AMViewRefPtr или в карте отображения) должно быть отображено в текущую процессорную систему или её подсистему.
Нельзя отобразить уже отображённый распределённый массив.
Возвращается ненулевое значение, если отображённый массив имеет локальную часть на текущем процессоре, и нулевое в противном случае.
7.6Изменение расположения распределенного массива по карте отображения
| long mrealn_( | long | ArrayHeader[], |














