rtsIDr (1158390), страница 6
Текст из файла (страница 6)
Все элементы заданного представления должны быть листьями дерева абстрактных машин (не должны иметь потомков).
При равном NULL значении PSRefPtr или при нулевом значении *PSRefPtr в качестве процессорной системы будет использована система, ссылка на которую содержится в карте отображения.
Все процессоры системы, заданной ссылкой *PSRefPtr или ссылкой, содержащейся в карте отображения, должны входить в состав элементного пересечения текущей процессорной системы с процессорной системой, в которую отображена родительская абстрактная машина.
Размерность представления абстрактной машины и размерность процессорной системы должны быть равны соответствующим размерностям, содержащимся в карте отображения.
Переотображаемое представление может быть задано косвенно, если в качестве параметра *AMViewRefPtr использовать заголовок распределённого массива, созданного функцией crtda_ с равным 1 или 3 значением параметра *ReDistrParPtr (см.п.6).
Представление абстрактной машины, заданное при обращении к функции, может быть ранее не отображено. В этом случае функция mredis_ выполняется как функция mdistr_ , а значение параметра *NewSignPtr несущественно.
Возвращается ненулевое значение, если переотображённое представление имеет локальную часть на текущем процессоре, и нулевое в противном случае.
5.6Уничтожение карты отображения
long delmvm_ (AMViewMapRef *AMViewMapRefPtr);
| *AMViewMapRefPtr | | ссылка на карту отображения представления абстрактной машины. |
Функция уничтожает созданную функцией amvmap_ карту отображения представления абстрактной машины. После уничтожения карты отображения ссылка на неё может использоваться по усмотрению пользовательской программы.
Карта отображения может быть уничтожена функцией delmvm_ только в том случае, если она была создана в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Карта отображения может быть уничтожена также с помощью функции delobj_ (см.п.17.5).
Возвращается нулевое значение.
Замечание. Одним из возможных применений функций отображения представления абстрактной машины по карте отображения сохранение и восстановление отображения абстрактной машины и, следовательно, расположения выравненных по нему массивов в процедурах, обрабатывающих внешние распределённые массивы с их перераспределением.
Отметим, что на момент использования карты отображения для отображения или переотображения представление абстрактной машины, являющееся источником этой карты, может и не существовать.
5.7Неравномерное блочное распределение
Все используемые в данном пункте обозначения, кроме вновь вводимых, будем предполагать совпадающими с обозначениями, принятыми в п.5.1.
Рассмотренное в п.5.1 отображение представления абстрактной машины на многопроцессорную систему представляет собой равномерное распределение ресурсов родительской абстрактной машины по элементам её представления. В этом случае для каждого измерения представления абстрактной машины k величина блока BLSIZEk считается не зависящей от значения j-й координаты элемента многопроцессорной системы. Такая однородность по каждому измерению многопроцессорной системы является следствием предполагаемой в п.5.1 равновесности всех её элементов: оптимальные веса всех координат процессоров одинаковы и равны единице (см.п.4.5).
Рассмотрим теперь случай неравновесных элементов многопроцессорной системы. Будем, как и в п.5.1, оперировать постоянной для k-го измерения представления абстрактной машины величиной блока BLSIZEk, но число блоков, приходящихся на элемент многопроцессорной системы с координатой по j-му измерению Pj, будем полагать равным оптимальному весу этой координаты. Тогда первое из рассмотренных в п.5.1 правил отображения (то есть функция Fj(I1, ... ,In)) определяется неравенствами
| Fj(I1,...,In)-1 | Fj(I1,...,In) |
где WEIGHTopt,j(Pj) оптимальный вес координаты Pj.
Значение BLSIZEk определяется следующим образом:
| BLSIZEk ={ | min( DistrParamArray[j-1], AMSIZEk ) при DistrParamArray[j-1] ≠ 0 , [AMSIZEk / PSWEIGHTopt,j] при DistrParamArray[j-1] = 0 , |
где
|
| PSSIZEj-1 | (оптимальный вес |
Поскольку максимально допустимое значение Ik есть
min( ([PSWEIGHTopt,j * BLSIZEk] - 1) , AMSIZEk - 1 ) ,
для полного охвата правилом отображения k-го измерения представления абстрактной машины требуется выполнение неравенства
AMSIZEk ≤ PSWEIGHTopt,j * BLSIZEk ,
| что достигается при | DistrParamArray[j-1] ≥ AMSIZEk / PSWEIGHTopt,j |
6Создание и уничтожение распределенного массива
6.1Создание распределенного массива
| long crtda_ ( | long | ArrayHeader[], |
| ArrayHeader | | заголовок создаваемого массива. |
| *ExtHdrSignPtr | | признак расширенного заголовка. |
| BasePtr | | базовый указатель для доступа к элементам распределённого массива. |
| *RankPtr | | размерность создаваемого массива. |
| *TypeSizePtr | | размер в байтах одного элемента массива. |
| SizeArray | | массив, i-й элемент которого содержит размер создаваемого массива по измерению i+1 (0 ≤ i ≤ *RankPtr 1). |
| *StaticSignPtr | | признак создания статического массива. |
| *ReDistrParPtr | | параметр, определяющий допустимость задания массива в качестве аргумента функций redis_ и realn_ (см. п.п.5.2 и 7.3). |
| LowShdWidthArray | | массив, i-й элемент которого содержит ширину нижней границы (i+1)-го измерения распределённого массива. |
| HiShdWidthArray | | массив, i-й элемент которого содержит ширину верхней границы (i+1)-го измерения распределённого массива. |
Создание распределённого массива с помощью функции crtda_ означает лишь инициализацию системных структур, описывающих массив. Выделение памяти для элементов распределённого массива производится только после задания его отображения на абстрактную машину с помощью функции align_ (вычисления для каждого процессора, на который отображена абстрактная машина, локальной части массива в соответствии с его распределением, см. п.7.1). Доступ к элементам массива производится через функции системы поддержки (см. п.13).
Заголовок создаваемого распределённого массива представляет собой массив из *RankPtr+1 (при *ExtHdrSignPtr = 0) или *RankPtr*2+2 (при *ExtHdrSignPtr = 1) элементов типа «long ». Его размещение в памяти (статическое или динамическое) должна произвести пользовательская программа. Инициализация заголовка распределённого массива осуществляется системой поддержки. Его основное назначение обеспечить эффективный доступ к элементам локальной части распределённого массива.
Базовый указатель BasePtr должен ссылаться на любую переменную, имеющую тот же тип, что и тип элементов распределённого массива. Содержимое этой переменной несущественно, т.к. базовый указатель используется только для доступа к элементам локальной части распределённого массива.
Структура заголовка распределённого массива и его использование (совместно с базовым указателем) для доступа к локальной части массива рассмотрены в п. 13.4.
Задаваемый ненулевым значением *StaticSignPtr признак статического массив а означает создание массива, не уничтожаемого при выходе из программного блока (см.п.8). Такой массив может быть уничтожен только явно, с помощью рассмотренной ниже функции delda_.
Параметр *ReDistrParPtr может принимать значения:
| 0 | | массив не может быть аргументом функции redis_ и не может перераспределяться функцией realn_; |
| 1 | | массив может быть аргументом функции redis_, но не может перераспределяться функцией realn_; |
| 2 | | расположение массива может быть изменено функцией realn_, но его использование для задания представления абстрактной машины в функции redis_ не допускается; |
| 3 | | массив может использоваться в качестве ссылки на представление абстрактной машины в функции redis_ и может быть перераспределён функцией realn_. |
Число параметров (ширины нижних и верхних границ), задаваемых в массивах LowShdWidthArray и HiShdWidthArray, должно быть равно размерности распределённого массива. Вопрос о границах локальных частей распределённых массивов рассмотрен в п.12. Здесь же отметим, что ширина границы может быть задана равной нулю.
Функция возвращает нулевое значение.
6.2 Уничтожение распределенного массива
long delda_(long ArrayHeader[]);
ArrayHeader – заголовок уничтожаемого массива.
Функция уничтожает созданный функцией crtda_ распределённый массив. После уничтожения распределённого массива его заголовок может использоваться по усмотрению пользовательской программы.
Распределённый массив может быть уничтожен функцией delda_ только в том случае, если он был создан в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10). Вместе с массивом будут уничтожены все группы границ, в которые он включён (см. п. 12).















