Lib-DVM - описание интерфейса (оглавление) | Часть1 (1-5) |
Часть 2 (6-7) |
Часть 3 (8-11) |
Часть 4 (12-13) |
Часть 5 (14-15) |
Часть 6 (16-18) |
Часть 7 (19) |
создан: февраль, 2001 | - последнее обновление 03.05.01 - |
6 Создание и уничтожение распределенного массива
6.1 Создание распределенного массива
long crtda_ ( | long long void long long long long long long long |
ArrayHeader[], *ExtHdrSignPtr, *BasePtr, *RankPtr, *TypeSizePtr, SizeArray[], *StaticSignPtr, *ReDistrParPtr, LowShdWidthArray[], HiShdWidthArray[] ); |
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).
Распределённый массив может быть уничтожен также с помощью функции delobj_ (см. п.17.5).
Возвращается нулевое значение.
6.3 Создание дополнительного заголовка распределенного массива
long addhdr_ ( | long long |
NewArrayHeader[], ArrayHeader[] ); |
NewArrayHeader | - | создаваемый заголовок. | ||
ArrayHeader | - | один из существующих заголовков. |
Функция создает заголовок распределённого массива, который в дальнейшем может использоваться равноправно с уже существующими заголовками. Его можно использовать, в частности, для создания других дополнительных заголовков.
При задании расположения распределённого массива (выравнивании) с помощью функций align_ и malign_ (см.п.7) инициализируются все его заголовки. Изменение расположения массива функциями realn_, mrealn_, redis_ и mredis_ (см. п.п. 5 и 7) также влечет изменение содержимого всех его заголовков.
Возвращается нулевое значение.
6.4 Уничтожение заголовка распределенного массива
long delhdr_(long ArrayHeader[]);
ArrayHeader – уничтожаемый заголовок распределённого массива.
Функция уничтожает заголовок, созданный функцией addhdr_ или заданный при обращении к функции crtda_. Нельзя уничтожить единственный заголовок распределённого массива.
Возвращается нулевое значение.
7 Отображение распределенного массива
7.1 Задание расположения (выравнивание) распределенного массива
long align_ ( | long PatternRef long long long |
ArrayHeader[], *PatternRefPtr, AxisArray[], CoeffArray[], ConstArray[] ); |
ArrayHeader | - | заголовок выравниваемого распределённого массива. | ||
*PatternRefPtr | - | ссылка на образец выравнивания. | ||
AxisArray | - | массив, j-й элемент которого содержит номер индексной переменной (номер измерения) распределённого массива для линейного правила выравнивания (j+1)-го измерения образца. | ||
CoeffArray | - | массив, j-й элемент которого содержит коэффициент для индексной переменной распределённого массива в линейном правиле выравнивания (j+1)-го измерения образца. | ||
ConstArray | - | массив, j-й элемент которого содержит константу линейного правила выравнивания для (j+1)-го измерения образца. |
Функция align_ задает расположение указанного распределённого массива в пространстве указанного представления родительской абстрактной машины (выравнивает распределённый массив). При этом элементы массива распределяются между дочерними абстрактными машинами, которые входят в состав этого представления. Представление абстрактной машины определяется образцом, который может быть как самим представлением, так и, при косвенном отображении, распределённым массивом. В последнем случае ссылкой на образец является первое слово заголовка распределённого массива.
Использование в качестве образца распределённого массива допустимо лишь в том случае, если он уже отображён на некоторое представление абстрактной машины, а представления абстрактной машины - если оно уже отображено на некоторую процессорную подсистему. Поэтому выполнение функции align_ сводится к распределению элементов выравниваемого массива между процессорами, входящими в состав этой процессорной системы.
Образец выравнивания может быть отображён (в конечном результате) только в текущую процессорную систему или её подсистему.
Нельзя отобразить уже отображённый распределённый массив.
Рассмотрим отображение распределённого массива детальнее. Пусть F - многозначная функция, определённая на индексном пространстве выравниваемого массива и принимающая значения в индексном пространстве образца:
F( (I1, ... , Ii, ... , In) ) = | F1(I1,
... , Ii, ... , In)
x . . . . . . . . . . . . .. . Fj(I1, ... , Ii, ... , In) x . . . . . . . . . . . . .. . Fm(I1, ... , Ii, ... , In) |
где:
x | - | символ декартова произведения множеств; |
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 <= Bj <= MAXj и 0
<= Aj*MAXk
+ Bj
<= MAXj,
где:
MAXj | - | максимальное значение индексной переменной j-го измерения образца; |
MAXk | - | максимальное значение индексной переменной k-го измерения выравниваемого массива. |
2. Fj(I1, ... , In) = {q О Mj: 0 <= q <= MAXj} , где:
Mj | - | множество значений индексной переменной j-го измерения образца; |
MAXj | - | максимальное значение индексной переменной j-го измерения образца. |
В этом случае образом любого элемента (i1, ... , in) индексного пространства выравниваемого массива является все множество значений индексной переменной j-го измерения образца (в подобных случаях принято использовать символ "*" , т. е. "любой из допустимых").
Примеры.
Определяя расположение массива в пространстве образца (т.е. задавая функции F1, ... , Fm), необходимо учитывать, что его элементы не должны выходить за пределы пространства образца. Соблюдение корректного отображения в каждом звене цепочки последовательных выравниваний обеспечит, в конечном результате, верное распределение элементов массива по процессорам.
Отметим, что если в качестве образца использован массив, то при его переотображении с помощью функции realn_ (см.п.7.3) массив, отображённый с помощью этого образца, сохранит прежнее расположение.
При обращении к функции align_ правило выравнивания Fj(I1, ... , In) = Aj*Ik + Bj для j-го измерения образца задается следующим образом:
AxisArray[j-1] CoeffArray[j-1] ConstArray[j-1] |
содержит значение k; содержит значение Aj; содержит значение Bj. |
Для задания правила Fj(I1, ... , In), значением которого для любых I1, ... , In является множество всех значений индексной переменной j-го измерения образца, значение AxisArray[j-1] (значение k) должно быть установлено равным -1. Значения CoeffArray[j-1] и ConstArray[j-1] (значения Aj и Bj) в этом случае несущественны.
Число правил выравнивания, заданных при обращении к функции align_, должно быть равно размерности образца.
Функция возвращает ненулевое значение, если отображённый массив имеет локальную часть на текущем процессоре, и нулевое - в противном случае.
Замечание 1. Заданное функции align_ отображение распределённого массива может быть выполнено лишь в том случае, если для любого процессора, на который отображён хотя бы один элемент массива, локальный размер каждого измерения массива, получаемый в результате отображения, не меньше ширин верхней и нижней границ этого измерения.
Замечание 2. При ненулевом значении параметра запуска системы поддержки DisArrayFill (файлы sysdebug.* базовых наборов параметров) отображённый распределённый массив будет расписан "нулевым" байтом, то есть байтом, каждый бит которого имеет нулевое значение). При нулевом значении параметра DisArrayFill содержимое отображённого массива считается неопределённым.
Пусть функция G задает расположение n-мерного массива в пространстве r-мерного образца, а функция P - r-мерного массива в пространстве m-мерного образца:
G((I1, ... , Ii, ... , In)) = | G1(I1,
... , Ii, ... , In)
x . . . . . . . . . . . . . . . Gk(I1, ... , Ii, ... , In) x . . . . . . . . . . . . . . . Gr(I1, ... , Ii, ... , In) |
P((J1, ... , Jj, ... , Jr)) = | P1(J1,
... , Jj,
... , Jr) x . . . . . . . . . . . . . . . Ps(J1, ... , Jj, ... , Jr) x . . . . . . . . . . . . . . . Pm(J1, ... , Jj, ... , Jr) |
Тогда осуществленное с помощью функции align_ выравнивание P r-мерного массива PatternDA в m-мерном пространстве образца Pattern с последующим выравниванием G n-мерного массива DA в r-мерном пространстве массива PatternDA является выравниванием F n-мерного массива DA в m-мерном пространстве образца Pattern, представляющим собой произведение (суперпозицию) отображений P и G:
Координатные правила выравнивания 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 и Gk((I1, ... , In)) = Qk*Il + Rk , |
где:
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 и Gk((I1, ... , In)) = { q О Mk: 0 <= q <= MAXk } , |
где:
Jk | - | индексная переменная k-го измерения массива PatternDA; |
Cs | - | целое число; |
Ds | - | целое неотрицательное число; |
MAXk | - | максимальное значение индексной переменной k-го измерения массива PatternDA; |
Mk | - | множество значений индексной переменной k-го измерения массива PatternDA. |
Тогда
т.е. частичное, разреженное линейной функцией Ps, размножение массива DA по s-му измерению образца Pattern.
Описанное отображение F эквивалентно заменяет выравнивания P и G в цепочке последовательных выравниваний. В частности, если образец Pattern не является представлением абстрактной машины и, следовательно, выравнен по другому образцу некоторой функцией Q, то отображения F и Q могут быть заменены их суперпозицией Q*F. Таким образом, заменой последовательных выравниваний их суперпозицией может быть построено результирующее выравнивание массива DA по представлению абстрактной машины (что и осуществляется системой поддержки при выполнении функции align_ выравнивания массива DA по массиву PatternDA).
7.3 Изменение расположения распределенного массива
long realn_( | long PatternRef long long long long |
ArrayHeader[], *PatternRefPtr, AxisArray[], CoeffArray[], ConstArray[], *NewSignPtr ); |
ArrayHeader | - | заголовок заново выравниваемого распределённого массива. | ||
*PatternRefPtr | - | ссылка на образец выравнивания. | ||
AxisArray | - | массив, j-й элемент которого содержит номер индексной переменной (номер измерения) распределённого массива для линейного правила выравнивания (j+1)-го измерения образца. | ||
CoeffArray | - | массив, j-й элемент которого содержит коэффициент для индексной переменной распределённого массива в линейном правиле выравнивания (j+1)-го измерения образца. | ||
ConstArray | - | массив, j-й элемент которого содержит константу линейного правила выравнивания для (j+1)-го измерения образца. | ||
*NewSignPtr | - | задаваемый единицей признак обновления содержимого распределённого массива. |
Функция realn_ отменяет расположение, установленное ранее с помощью функции align_ (или malign_ , см.п.7.5) для распределённого массива с заголовком *ArrayHeaderPtr, и задаёт для этого массива новое расположение в соответствии с указанными при обращении к функции параметрами. Все распределённые массивы, при выравнивании которых рассматриваемый массив использовался в качестве образца, свое расположение сохранят.
Как переотображаемый распределённый массив, так и образец выравнивания на момент обращения к функции должны быть отображены в текущую процессорную систему или её подсистему (возможно, каждый в свою).
Содержимое вновь выравненного массива, в зависимости от значения *NewSignPtr, будет:
При NewSignPtr = 1 перераспределённый массив будет, тем не менее, расписан "нулевым" байтом, если система поддержки была запущена с ненулевым значением параметра DisArrayFill (файлы sysdebug.* базовых наборов параметров).
При переотображении массива содержимое его границ (см. п. 12) не сохраняется.
Перераспределение массива с помощью функции realn_ возможно лишь в том случае, если при его создании функцией crtda_ значение её параметра *ReDistrParPtr было задано равным 2 или 3 (см.п.6).
Распределённый массив, заданный при обращении к функции, может быть ранее не отображён. В этом случае функция realn_ выполняется как функция align_ , но при *NewSignPtr = 2 впервые отображённый массив будет расписан "нулевым" байтом. Значение параметра *ReDistrParPtr, с которым был создан распределённый массив, несущественно.
Функция возвращает ненулевое значение, если переотображённый массив имеет локальную часть на текущем процессоре, и нулевое - в противном случае.
ArrayMapRef arrmap_( | long long |
ArrayHeader[], *StaticSignPtr ); |
ArrayHeader | - | заголовок распределённого массива. | ||
*StaticSignPtr | - | признак создания статической карты отображения. |
Функция arrmap_ создает объект (карту отображения), описывающий текущее отображение распределённого массива на представление абстрактной машины, и возвращает ссылку на созданный объект.
Карта отображения распределённого массива содержит, в частности, следующую информацию:
Задаваемый ненулевым значением *StaticSignPtr признак статической карты отображения означает создание карты, не уничтожаемой при выходе из программного блока (см.п.8). Такая карта может быть уничтожена только явно, с помощью рассмотренной в п.7.7 функции delarm_.
7.5 Задание расположения распределенного массива по карте отображения
long malign_( | long AMViewRef ArrayMapRef |
ArrayHeader[], *AMViewRefPtr, *ArrayMapRefPtr ); |
ArrayHeader | - | заголовок распределённого массива. | ||
*AMViewRefPtr | - | ссылка на представление абстрактной машины, являющееся образцом выравнивания. | ||
*ArrayMapRefPtr | - | ссылка на карту отображения распределённого массива. |
Функция malign_ задает отображение указанного распределённого массива на представление абстрактной машины по заданной карте отображения.
Размерность распределённого массива и размерность представления абстрактной машины должны быть равны соответствующим размерностям, содержащимся в карте отображения.
При равном NULL значении AMViewRefPtr или при нулевом значении *AMViewRefPtr образцом выравнивания будет представление абстрактной машины, ссылка на которое содержится в карте отображения.
Перед обращением к функции malign_ представление абстрактной машины (заданное ссылкой *AMViewRefPtr или в карте отображения) должно быть отображено в текущую процессорную систему или её подсистему.
Нельзя отобразить уже отображённый распределённый массив.
Возвращается ненулевое значение, если отображённый массив имеет локальную часть на текущем процессоре, и нулевое - в противном случае.
Замечание. При ненулевом значении параметра запуска системы поддержки DisArrayFill (файлы sysdebug.* базовых наборов параметров) отображённый распределённый массив будет расписан "нулевым" байтом, то есть байтом, каждый бит которого имеет нулевое значение). При нулевом значении параметра DisArrayFill содержимое отображённого массива считается неопределённым.
7.6 Изменение расположения распределенного массива по карте отображения
long mrealn_( | long AMViewRef ArrayMapRef long |
ArrayHeader[], *AMViewRefPtr, *ArrayMapRefPtr, *NewSignPtr ); |
ArrayHeader | - | заголовок заново выравниваемого распределённого массива. | ||
*AMViewRefPtr | - | ссылка на представление абстрактной машины, являющееся образцом выравнивания. | ||
*ArrayMapRefPtr | - | ссылка на карту отображения распределённого массива. | ||
*NewSignPtr | - | задаваемый единицей признак обновления содержимого распределённого массива. |
Функция mrealn_ отменяет расположение, установленное ранее с помощью функции malign_ (или align_ , см.п.7.1) для распределённого массива с заголовком *ArrayHeaderPtr, и задаёт для этого массива новое расположение в соответствии с указанной при обращении к функции картой отображения. Все распределённые массивы, при выравнивании которых рассматриваемый массив использовался в качестве образца, своё расположение сохранят.
Размерность распределённого массива и размерность представления абстрактной машины должны быть равны соответствующим размерностям, содержащимся в карте отображения.
При равном NULL значении AMViewRefPtr или при нулевом значении *AMViewRefPtr образцом выравнивания будет представление абстрактной машины, ссылка на которое содержится в карте отображения.
Как переотображаемый распределённый массив, так и представление абстрактной машины (заданное ссылкой *AMViewRefPtr или в карте отображения) на момент обращения к функции должны быть отображены в текущую процессорную систему или её подсистему (возможно, каждый в свою).
Содержимое вновь выравненного массива, в зависимости от значения *NewSignPtr, будет:
При NewSignPtr = 1 перераспределённый массив будет , тем не менее, расписан "нулевым" байтом, если система поддержки была запущена с ненулевым значением параметра DisArrayFill (файлы sysdebug.* базовых наборов параметров).
При переотображении массива содержимое его границ (см. п. 12) не сохраняется.
Перераспределение массива с помощью функции mrealn_ возможно лишь в том случае, если при его создании функцией crtda_ значение её параметра *ReDistrParPtr было задано равным 2 или 3 (см.п.6).
Распределённый массив, заданный при обращении к функции, может быть ранее не отображён. В этом случае функция mrealn_ выполняется как функция malign_, но при *NewSignPtr = 2 впервые отображённый массив будет расписан "нулевым" байтом. Значение параметра *ReDistrParPtr, с которым был создан распределённый массив, несущественно.
Функция возвращает ненулевое значение, если переотображённый массив имеет локальную часть на текущем процессоре, и нулевое - в противном случае.
7.7 Уничтожение карты отображения
long delarm_(ArrayMapRef *ArrayMapRefPtr);
*ArrayMapRefPtr - ссылка на карту отображения распределённого массива.
Функция уничтожает созданную функцией arrmap_ карту отображения распределённого массива. После уничтожения карты отображения ссылка на неё может использоваться по усмотрению пользовательской программы.
Карта отображения может быть уничтожена функцией delarm_ только в том случае, если она была создана в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Карта отображения может быть уничтожена также с помощью функции delobj_ (см.п.17.5).
Возвращается нулевое значение.
Замечание. Одним из возможных применений функций выравнивания распределённого массива по карте отображения - сохранение и восстановление расположения массивов в процедурах, обрабатывающих внешние распределённые массивы с их перераспределением.
Отметим, что на момент использования карты отображения для задания или изменения расположения массива массив, являвшийся источником этой карты, может и не существовать.
7.8 Опрос ссылки на представление абстрактной машины, в которое отображён заданный распределённый массив
AMViewRef getamv_ (long ArrayHeader[]);
ArrayHeader - заголовок распределённого массива.
Функция getamv_ возвращает ссылку на представление абстрактной машины, по которому выравнен распределённый массив, заданный заголовком ArrayHeader. Нулевое значение возвращённой ссылки означает, что заданный массив не отображён.