rtsIDr (1158449), страница 19
Текст из файла (страница 19)
При выполнении функции crtrbp_ буфер удалённых элементов отображается таким образом, чтобы все требуемые и, следовательно, размещённые в нём элементы присутствовали на всех процессорах системы, заданной параметром PSRefPtr. Для этого система поддержки создаёт вспомогательное одномерное представление текущей абстрактной машины, состоящее из одного элемента, и отображает его в заданную при обращении к функции процессорную систему с размножением по всем её измерениям. Буфер удалённых элементов отображается, в свою очередь, во вспомогательное представление с размножением по его единственному измерению.
Функция возвращает ненулевое значение, если созданный буфер имеет локальную часть на текущем процессоре, и нулевое – в противном случае.
14.2Запуск загрузки буфера удаленных элементов распределенного массива
| long loadrb_ ( | long | BufferHeader[], |
| BufferHeader | | заголовок буфера удалённых элементов. |
| *RenewSignPtr | | признак повторной перезагрузки уже загруженного буфера. |
Функция loadrb_ инициирует загрузку заданного буфера элементами распределённого массива, для которых этот буфер был создан с помощью функций crtrbl_, crtrba_ или crtrbp_.
Допускается использование функции для уже загруженного буфера. В этом случае фактическая перезагрузка осуществляется при ненулевом значении параметра *RenewSignPtr и не осуществляется, если его значение равно нулю. Запрещается перезагрузка буфера (вне зависимости от значения параметра *RenewSignPtr), если его предыдущая загрузка (фактическая или фиктивная) не завершена с помощью функции waitrb_ (см. п. 14.3).
Как загружаемый буфер, так и его удалённый распределённый массив должны быть отображены в процессорные системы, каждый элемент которых обязан принадлежать текущей процессорной системе.
Не допускается запуск загрузки буфера функцией loadrb_, если он включён в какую-либо группу буферов (см. п.п. 14.6-14.10).
Возвращается нулевое значение.
14.3Ожидание завершения загрузки буфера удаленных элементов распределенного массива
long waitrb_ (long BufferHeader[]);
BufferHeader заголовок буфера удалённых элементов.
Загрузка заданного при обращении к функции буфера должна быть инициирована текущей подзадачей. Не допускается ожидание завершения не инициированной ранее загрузки буфера.
Возвращается нулевое значение.
14.4Уничтожение буфера удаленных элементов распределенного массива
long delrb_ (long BufferHeader[]);
BufferHeader заголовок уничтожаемого буфера удалённых элементов.
Буфер удалённых элементов может быть уничтожен функцией delrb_ только в том случае, если он был создан в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Буфер удалённых элементов может быть уничтожен также с помощью функции delobj_ (см.п.17.5).
Не доспускается уничтожение буфера, загрузка которого не завершена с помощью функции waitrb_.
Если уничтожаемый буфер включён в какую-либо группу буферов, то он из состава этой группы исключается (см. п.п. 14.6-14.10). Группа буферов в этом случае не должна находиться в состоянии загрузки.
Возвращается нулевое значение.
14.5Доступ к размещенным в локальной части буфера удаленным элементам
Пусть r – размерность буфера (число измерений удалённого распределённого массива, имеющих неконстантные линейные правила выборки или являющихся свободными). Тогда заголовок буфера удалённых элементов, задаваемый при обращении к функции crtrbl_ (crtrba_, crtrbp_), может быть объявлен, например, как
long BufferHeader[2*r+2];
Пусть также базовый указатель, соответствующий типу элементов удалённого распределённого массива, есть BasePtr. Тогда обращение к размещённому в локальной части буфера удалённому элементу, определённому индексным вектором (I1, ... ,Im, ... ,Ir), осуществляется по линейному индексу следующим образом:
| BasePtr[ | r-1 |
Для языка C при обращении к функциям crtrbl_, crtrba_ и crtrbp_ значение базового указателя можно задать равным NULL. Тогда доступ к размещённому в локальной части буфера удалённому элементу можно произвести разименованно:
| | r-1 |
где Type тип элементов удалённого распределённого массива.
Для буфера удалённых элементов, созданного функцией crtrbl_.
Пусть измерение буфера m соответствует линейному правилу выборки удалённых элементов (связанное измерение) и, следовательно, некоторому измерению параллельного цикла k. Тогда при доступе к элементу буфера значение координаты Im может быть заменено значением индексной переменой цикла Vk: Im = Vk – min(Vk,нач , Vk,кон) (Vk,нач и Vk,кон – начальное и конечное значения индексной переменной цикла Vk). Это означает, что переход из индексного пространства буфера в индексное пространство параллельного цикла влечёт переход к распределёному массиву-буферу с ненулевыми нижними границами индексов. Поэтому в целях поддержки доступа к элементам буфера по индексным переменным цикла система поддержки при выполнении функции crtrbl_ для всех связанных измерений сохраняет в заголовке буфера величины min(Vk,нач , Vk,кон) в качестве нижних границ измерений массива (см. описание расширенного заголовка распределённых массивов в п. 13.4). Нижние границы свободных измерений буфера устанавливаются в его заголовке нулевыми.
В языке C для доступа к элементам буфера по индексным переменным параллельного цикла могут быть использованы макрокоманды вида
| <DAElmType> RBElm<Rank> ( | long | BufferHeader[], |
| BufferHeader | | заголовок буфера удалённых элементов. |
| Rank | | размерность буфера (1-7). |
| RBElmType | | тип элементов, размещённых в буфере. |
| Indexi | | значение индекса требуемого элемента для i-го измерения буфера. |
Семь вышеописанных макрокоманд являются L-выражениями языка C.
Предполагается, что при создании буфера с помощью функции crtrbl_ базовый указатель был задан равным NULL.
14.6Создание группы буферов удаленных элементов
| RegularAccessGroupRef crtbg_( | long | *StaticSignPtr, |
| *StaticSignPtr | | признак создания статической группы буферов. |
| *DelBufSignPtr | | признак уничтожения всех буферов, входящих в группу, при её уничтожении. |
Функция crtbg_ создает пустую группу буферов (не содержащую ни одного буфера) и возвращает ссылку на неё.
Задаваемый ненулевым значением *StaticSignPtr признак статической группы означает создание группы, не уничтожаемой при выходе из программного блока (см.п.8). Такая группа может быть уничтожена только явно, с помощью рассмотреной ниже функции delbg_ .
Ненулевое значение *DelBufSignPtr задает такой режим уничтожения группы буферов, при котором все входящие в неё буфера будут также уничтожены. При явном уничтожении группы уничтожение входящих в неё буферов будет также считаться явным, при неявном неявным.
14.7Включение в группу буфера удаленных элементов
| long insrb_ ( | RegularAccessGroupRef | *RegularAccessGroupRefPtr, |
| *RegularAccessGroupRefPtr | | ссылка на группу буферов. |
| BufferHeader | | заголовок включаемого буфера. |
Как группа буферов, так и включаемый в неё буфер должны быть созданы в текущей подзадаче и не могут находиться в состоянии загрузки. Допускается повторное включение буфера в группу, но нельзя включить буфер в группу буферов, если он уже включён в другую группу.
Возвращается нулевое значение.
14.8Запуск загрузки буферов удаленных элементов заданной группы
| long loadbg_( | RegularAccessGroupRef | *RegularAccessGroupRefPtr, |
| *RegularAccessGroupRefPtr | | ссылка на группу буферов. |
| *RenewSignPtr | | признак повторной перезагрузки уже загруженной группы буферов. |
Все буфера заданной при обращении к функции группы и их удалённые распределённые массивы должны быть отображены в процессорные системы, каждый элемент которых принадлежит текущей процессорной системе.
Допускается использование функции loadbg_ для уже загруженной группы буферов. В этом случае фактическая перезагрузка осуществляется при ненулевом значении параметра *RenewSignPtr и не осуществляется, если его значение равно нулю. Запрещается перезагрузка группы буферов (вне зависимости от значения параметра *RenewSignPtr), если её предыдущая загрузка (фактическая или фиктивная) не завершена с помощью функции waitbg_ (см. п. 14.9).
Возвращается нулевое значение.
14.9Ожидание завершения загрузки буферов удаленных элементов заданной группы
long waitbg_ (RegularAccessGroupRef *RegularAccessGroupRefPtr);
*RegularAccessGroupRefPtr ссылка на группу буферов.
Загрузка заданной при обращении к функции группы буферов должна быть запущена текущей подзадачей. Не допускается ожидание завершения не инициированной ранее загрузки группы буферов.
Возвращается нулевое значение.
14.10Уничтожение группы буферов удаленных элементов
long delbg_ (RegularAccessGroupRef *RegularAccessGroupRefPtr);
*RegularAccessGroupRefPtr ссылка на уничтожаемую группу буферов.
Группа буферов удалённых элементов может быть уничтожена функцией delbg_ только в том случае, если она была создана в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Группа буферов может быть уничтожена также с помощью функции delobj_ (см.п.17.5).
Не допускается уничтожение группы буферов, загрузка которой не завершена с помощью функции waitbg_.
Если группа буферов была создана функцией crtbg_ с ненулевым значением параметра *DelBufSignPtr, то при её уничтожении будут уничтожены и все включённые в неё буфера удалённых элементов.
Возвращается нулевое значение.
14.11Опрос типа доступа к элементам распределенного массива
| long rmkind_ ( | long | ArrayHeader[], |
| ArrayHeader | | заголовок распределённого массива. |
| BufferHeader | | заголовок создаваемого буфера удалённых элементов (для доступа типа "REMOTE"). |
| BasePtr | | базовый указатель для доступа к буферу удалённых элементов (для доступа типа "REMOTE"). |
| *StaticSignPtr | | признак создания статического буфера (для доступа типа "REMOTE"). |
| *LoopRefPtr | | ссылка на параллельный цикл, при выполнении которого необходимы элементы распределённого массива. |
| AxisArray | | массив i-й элемент которого содержит номер измерения параллельного цикла, соответствующего (i+1)-му измерению распределённого массива. |
| CoeffArray | | массив, i-й элемент которого содержит коэффициент индексной переменной линейного правила выборки для (i+1)-го измерения распределённого массива. |
| ConstArray | | массив, i-й элемент которого содержит константу линейного правила выборки для (i+1)-го измерения распределённого массива. |
| LowShdWidthArray | | выходной массив, в i-й элемент которого будет записана ширина нижней границы (i+1)-го измерения распределённого массива (для доступа типа "SHADOW" или "FULL SHADOW"). |
| HiShdWidthArray | | выходной массив, в i-й элемент которого будет записана ширина верхней границы (i+1)-го измерения распределённого массива (для доступа типа "SHADOW" или "FULL SHADOW"). |
Функция rmkind_ определяет тип доступа к элементам распределённого массива с заголовком ArrayHeader, необходимым для выполнения параллельного цикла, заданного ссылкой *LoopRefPtr.
Требуемые для выполнения цикла элементы массива задаются аналогично заданию элементов удалённого массива, необходимых для выполнения параллельного цикла (см. п. 14.1). Параметры BufferHeader, BasePtr, StaticSignPtr, AxisArray, CoeffArray и ConstArray аналогичны одноимённым параметрам функции crtrbl_.
Распределённый массив должен быть отображён в процессорную систему, каждый элемент которой принадлежит текущей процессорной системе. Параллельный цикл на момент обращения к функции должен быть текущим и отображённым.















