rtsIDr (1158390), страница 14
Текст из файла (страница 14)
Задаваемый ненулевым значением *StaticSignPtr признак статической группы границ означает создание группы, не уничтожаемой при выходе из программного блока (см.п.8). Такая группа границ может быть уничтожена только явно, с помощью рассмотренной ниже функции delshg_ .
12.2Включение границы распределенного массива в группу границ
| long inssh_ ( | ShadowGroupRef | *ShadowGroupRefPtr, |
| *ShadowGroupRefPtr | | ссылка на группу границ. |
| ArrayHeader | | заголовок распределённого массива. |
| LowShdWidthArray | | массив, i-й элемент которого содержит ширину нижней границы для (i+1)-го измерения массива. |
| HiShdWidthArray | | массив, i-й элемент которого содержит ширину верхней границы для (i+1)-го измерения массива. |
| *FullShdSignPtr | | задаваемый единицей признак обмена полной границей. |
Включение границы распределённого массива в группу означает лишь регистрацию его границы как участника группового обмена границами. Размещения границы массива в системном буфере обмена не производится.
Заданная при обращении к функции группа границ должна быть создана в текущей подзадаче. Распределённый массив перед включением его в группу границ должен быть отображён в процессорную систему (функциями align_, realn_, malign_ или mrealn_), каждый элемент которой обязан входить в состав текущей процессорной системы.
Допускается включение распределённого массива в несколько групп границ, а также повторное включение его в одну и ту же группу. В последнем случае ширины границ, заданные при обращении к функции inssh_, должны совпадать с ширинами границ, заданными при предыдущем включении его в эту группу. Запрещается включение массива в группу, находящуюся в состоянии обмена границами или приёма (передачи) импортируемых (экспортируемых) элементов. Включение новых массивов в такую группу становится возможным только после завершения этих операций (см. описание функций strtsh_, recvsh_, sendsh_ и waitsh_ в п.п. 12.3-12.6).
Ширины границ массивов, задаваемые параметрами LowShdWidthArray и HiShdWidthArray, не должны превосходить ширин границ, заданных при создании рассматриваемого массива с помощью функции crtda_. Ширина границы, равная –1, означает, что будет использована ширина границы, заданная при создании массива.
При нулевом значении *FullShdSignPtr в операции обмена границами будут участвовать только нижние и верхние теневые грани всех измерений распределённого массива, при единичном полная граница распределённого массива.
Функция возвращает нулевое значение.
Обмен границами, являющимися объединением теневых граней, требует взаимодействия текущего процессора с 2*n «соседями» (n – размерность распределённого массива, 2*n число теневых граней), а обмен полными границами с 3n - 1 «соседями». Поэтому для случая, когда граница как объединение теневых граней не покрывает потребностей задачи, а обмен полной границей неприемлем по накладным расходам, система поддержки предусматривает возможность выбора достаточной и оптимальной схемы обмена границами, основанной на представлении границы в виде объединения элементарных теневых n-мерных параллелепипедов.
Пусть Q = (q1, ... ,qk, ... ,qn) n-размещение с повторениями из элементов множества {0,1,2} (размещение (0, ... ,0) не рассматривается). Поставим ему в соответствие n-мерный параллелепипед PQ = M1 ... Mk ... Mn , где:
| Mk = | { | M0,k = { Ik Mk: Ik,нач | ≤ Ik ≤ Ik,кон | } при qk = 0, |
| M1,k = { Ik Mk: Ik,нач – LWk | ≤ Ik ≤ Ik,нач – 1 | } при qk = 1, | ||
| M2,k = { Ik Mk: Ik,кон + 1 | ≤ Ik ≤ Ik,кон + HWk | } при qk = 2. |
Здесь:
| Ik | | индексная переменная k-го измерения распределённого массива (1 ≤ k ≤ n); |
| Ik,нач | | начальное значение индексной переменной по k-му измерению; |
| Ik,кон | | конечное значение индексной переменной по k-му измерению; |
| Mk | | множество значений индексной переменной k-го измерения; |
| LWk | | ширина нижней части границы по измерению k; |
| HWk | | ширина верхней части границы по измерению k. |
Параллелепипед PQ называется элементарным теневым n-мерным параллелепипедом.
Полная граница распределённого массива это объединение всех элементарных теневых параллелепипедов (кроме параллелепипеда, соответствующего размещению (0, ... ,0) и являющегося локальной частью распределённого массива). Число элементарных параллелепипедов, составляющих полную границу, есть A3n - 1 = 3n - 1.
Нижняя (верхняя) теневая грань по измерению k это элементарный теневой параллелепипед, соответствующий n-размещению, в котором qk = 1(2), а остальные qi равны нулю.
Система поддержки позволяет задавать для обмена границами любую совокупность элементарных теневых параллелепипедов с помощью рассмотренной ниже функции insshd_ включения границы распределённого массива в группу границ.
| long insshd_ ( | ShadowGroupRef | *ShadowGroupRefPtr, |
| *ShadowGroupRefPtr | | ссылка на группу границ. |
| ArrayHeader | | заголовок распределённого массива. |
| LowShdWidthArray | | массив, i-й элемент которого содержит ширину нижней границы для (i+1)-го измерения массива. |
| HiShdWidthArray | | массив, i-й элемент которого содержит ширину верхней границы для (i+1)-го измерения массива. |
| *MaxShdCountPtr | | максимально допустимое для любого входящего в границу элементарного параллелепипеда число измерений, код участия которых в формировании границы больше единицы. |
| ShdSignArray | | массив, i-й элемент которого содержит код участия (i+1)-го измерения массива в формировании границы. |
Ширины границ массивов, задаваемые параметрами LowShdWidthArray и HiShdWidthArray, не должны превосходить ширин границ, заданных при создании рассматриваемого массива с помощью функции crtda_. Ширина границы, равная –1, означает, что будет использована ширина границы, заданная при создании массива.
Код участия (i+1)-го измерения массива в формировании границы, задаваемый в i-м элементе массива ShdSignArray, может принимать значения:
| 1 | | граница массива включает те и только те элементарные теневые параллелепипеды, для которых Mi = M0,i; |
| 2 | | граница включает те и только те элементарные параллелепипеды, для которых Mi = M1,i; |
| 3 | | граница включает те и только те элементарные параллелепипды, для которых Mi = M0,i или Mi = M1,i; |
| 4 | | граница включает те и только те элементарные параллелепипеды, для которых Mi = M2,i; |
| 5 | | граница включает те и только те элементарные параллелепипеды, для которых Mi = M0,i или Mi = M2,i; |
| 6 | | граница включает те и только те элементарные параллелепипеды, для которых Mi = M1,i или Mi = M2,i; |
| 7 | | граница должна включать элементарные параллелепипеды с любым множеством Mi (M0,i, M1,i или M2,i). |
Параметр *MaxShdCountPtr (положительное число) ограничивает теневую оболочку локальной части распределённого массива, принимающую участие в обмене границами, допуская в её состав только те элементарные параллелепипеды, для которых
| n |
|
То есть, в принимающую в обмене границу не могут входить элементарные теневые параллелепипеды, число измерений которых, выводящих за пределы локальной части массива, превосходит *MaxShdCountPtr.
Массив ShdSignArray должен содержать хотя бы один превосходящий единицу элемент (граница распределённого массива не должна совпадать с его локальной частью).
Функция возвращает нулевое значение.
Замечание. Включение в группу границ теневых граней распределённого массива с помощью функции inssh_ эквивалентно выполнению функции insshd_ с равным единице значением параметра *MaxShdCountPtr и с массивом ShdSignArray, каждый элемент которого равен 7. Для включения в группу границ полной границы распределённого массива с помощью функции insshd_ параметр *MaxShdCountPtr должен быть равен размерности распределённого массива, а каждый элемент массива ShdSignArray также должен быть равен 7.
12.3Запуск обмена границами заданной группы
long strtsh_ (ShadowGroupRef *ShadowGroupRefPtr);
*ShadowGroupRefPtr ссылка на группу границ.
Функция strtsh_ инициализирует системный буфер обмена границами (если обмен границами данной группы запускается в первый раз), размещает в нём все зарегистрированные с помощью функции inssh_ (inshsd_) границы и запускает операцию обмена границами.
Все элементы всех процессорных систем, в которые отображены массивы, зарегистрированные в запускаемой группе, должны принадлежать текущей процессорной системе. Обмен границами заданной группы может быть запущен только в том случае, если предыдущие операции обмена границами этой группы, приема импортируемых или передачи экспортируемых элементов завершены с помощью функции waitsh_ (см. п.п. 12.4, 12.5 и 12.6).
Возвращается нулевое значение.
12.4Инициализация приема импортируемых элементов заданной группы границ
long recvsh_(ShadowGroupRefPtr *ShadowGroupRefPtr);
*ShadowGroupRefPtr ссылка на группу границ.















