Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://sp.cs.msu.ru/dvm/dvmhtm1107/rus/sys/libdvm/rtsIDr5.html
Дата изменения: Mon Feb 13 12:59:40 2006 Дата индексирования: Mon Oct 1 23:24:23 2012 Кодировка: Windows-1251 |
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 - |
14 Регулярный доступ к удаленным данным
Если элементы распределенного массива размещены не на всех процессорах, выполняющих текущую ветвь параллельной программы, где они требуются, то такой массив будем называть удаленным, а его элементы - удаленными. Доступ к элементам удаленного распределенного массива осуществляется путем создания на каждом процессоре, где требуется и отсутствует хотя бы один из них, специального буфера (локального буфера удаленных элементов) и загрузки в него нужных удаленных данных.
14.1 Создание буфера удаленных элементов распределенного массива
Если ветвью параллельной программы, востребовавшей элементы удаленного массива, является виток параллельного цикла, то будем рассматривать удаленные данные, необходимые для всех его витков, как единое целое.
В этом случае требуемые элементы удаленного распределенного массива определяются с помощью линейных правил выборки (регулярный доступ), задаваемых для каждого его измерения в виде
Ai*Vk(i) + Bi , где:
i | - | номер измерения удаленного распределенного массива; |
Vk(i) | - | индексная переменная k-го измерения параллельного цикла, меняющаяся в пределах своих начального и конечного значений; |
Ai, Bi | - | целые числа. |
Локальные буфера удаленных элементов каждого процессора, выполняющего витки параллельного цикла, рассматриваются как локальные части распределеного массива, который в дальнейшем будем называть глобальным буфером удаленных элементов (или просто буфером удаленных элементов). Буфер удаленных элементов отображен так же, как и параллельный цикл, но его i-му измерению соответствует k(i)-е измерение параллельного цикла (в том случае, когда для i-го измерения удаленного массива задано линейное правило выборки с ненулевым Ai).
В силу приведенных выше правил выборки требуемые удаленные элементы представляются в виде разреженного блока, но помещаются в буфер в уплотненном (неразреженном) виде.
Работа с буфером удаленных элементов осуществляется аналогично работе с распределенным массивом (см.п.13).
В целях оптимизации буфера удаленных элементов могут объединяться в группы, а загрузка всех буферов группы осуществляться одной операцией (см. п.п. 14.6-14.10).
long crtrbl_ ( | long long void long LoopRef long long long |
RemArrayHeader[], BufferHeader[], *BasePtr, *StaticSignPtr, *LoopRefPtr, AxisArray[], CoeffArray[], ConstArray[] ); |
RemArrayHeader | - | заголовок удаленного распределенного массива. | ||
BufferHeader | - | заголовок создаваемого буфера удаленных элементов. | ||
BasePtr | - | базовый указатель для доступа к буферу удаленных элементов. | ||
*StaticSignPtr | - | признак создания статического буфера. | ||
*LoopRefPtr | - | ссылка на параллельный цикл, при выполнении которого необходимы размещенные в буфере элементы удаленного массива. | ||
AxisArray | - | массив, i-й элемент которого содержит номер измерения параллельного цикла (k(i+1)), соответствующего (i+1)-му измерению удаленного массива. | ||
CoeffArray | - | массив, i-й элемент которого содержит коэффициент индексной переменной линейного правила выборки для (i+1)-го измерения удаленного массива (Ai+1). | ||
ConstArray | - | массив, i-й элемент которого содержит константу линейного правила выборки для (i+1)-го измерения удаленного массива (Bi+1). |
Функция crtrbl_ создает буфер для размещения в нем элементов удаленного распределенного массива с заголовком RemArrayHeader, необходимых для выполнения параллельного цикла, заданного ссылкой *LoopRefPtr. Удаленный массив должен быть отображен в процессорную систему, каждый элемент которой принадлежит текущей процессорной системе. Цикл на момент обращения к функции должен быть текущим и отображенным.
Созданный буфер является распределенным массивом, размерность которого меньше размерности удаленного массива на число константных линейных правил выборки удаленных элементов. Его заголовок BufferHeader представляет собой массив из 2*r+2 элементов типа "long", где r - размерность буфера (расширенный заголовок распределенного массива, см. п. 13.4). Размещение заголовка в памяти (статическое или динамическое) осуществляется пользовательской программой, а инициализация - системой поддержки при выполнении функции crtrbl_ .
В любом i-м элементе массива AxisArray может быть задан либо номер измерения параллельного цикла, либо 0, либо -1. В первом случае CoeffArray[i] должен быть ненулевым (неконстантное правило выборки). Во втором случае CoeffArray[i] обязан быть нулевым (константное правило выборки). Наконец, третий случай определяет свободное (i+1)-е измерение удаленного массива, т. е. не связанное ни с каким измерением параллельного цикла ("присутствующее везде").
Таким образом, размерность буфера удаленных элементов равна числу ненулевых элементов массива AxisArray. Размер каждого j-го измерения буфера определяется значением j-го по счету ненулевого элемента массива AxisArray (пусть индекс этого элемента будет i). Если AxisArray[i] > 0 (линейное правило выборки), то размер j-го измерения буфера равен размеру (AxisArray[i])-го измерения заданного параллельного цикла (размер измерения цикла в данном случае - увеличенное на единицу абсолютное значение разности между начальным и конечным значениями индексной переменной измерения). Если же AxisArray[i] = -1 (свободное измерение удаленного массива), то размер j-го измерения буфера совпадает с размером (i+1)-го измерения удаленного массива.
В массиве AxisArray не может быть задано два одинаковых номера измерения параллельного цикла.
Число элементов в каждом из массивов AxisArray, CoeffArray и ConstArray должно быть равно размерности удаленного распределенного массива.
Корректно заданные правила выборки не должны выводить за пределы удаленного распределенного массива.
Базовый указатель BasePtr должен ссылаться на любую переменную, имеющую тот же тип, что и элементы удаленного распределенного массива. Содержимое этой переменной несущественно, т.к. базовый указатель используется только для доступа к удаленным элементам распределенного массива, размещенным в создаваемом буфере.
Подробнее работа с заголовком буфера удаленных элементов и базовым указателем рассмотрена в п.14.5.
Задаваемый ненулевым значением *StaticSignPtr признак статического буфера означает создание буфера, не уничтожаемого при выходе из программного блока (см.п.8). Такой буфер может быть уничтожен только явно, с помощью рассмотренной ниже функции delrb_ .
Функция возвращает ненулевое значение, если созданный буфер имеет локальную часть на текущем процессоре, и нулевое - в противном случае.
Замечание 1. Если все правила выборки являются константами, то размерность создаваемого буфера, в силу изложенного выше, должна быть равной нулю. В этом случае система поддержки создает одномерный распределенный массив-буфер, состоящий из одного элемента.
Замечание 2. Пусть при отображении параллельного цикла функцией mappl_ по какому-либо его измерению начальное значение индексной переменной, при положительном шаге, больше ее конечного значения или, при отрицательном шаге, конечное значение индексной переменной больше ее начального значения (пустой цикл). Тогда использование этого цикла в качестве параметра функции crtrbl_ приведет к созданию фиктивного буфера удаленных элементов. 0-му слову заголовка такого буфера (ссылке на распределенный массив) будет присвоено нулевое значение. Фиктивный буфер удаленных элементов может использоваться во всех функциях организации удаленного доступа, но использование его заголовка в качестве параметра функций работы с распределенными массивами запрещено. Не допускается также доступ к локальной части распределенного массива по заголовку фиктивного буфера.
Буфер удаленных элементов, необходимых для выполнения параллельного цикла, а также для ветвей программы, не являющихся его витками, может быть создан также с помощью рассмотренных ниже функций crtrba_ и crtrbp_.
long crtrba_ ( | long long void long long long long long |
RemArrayHeader[], BufferHeader[], *BasePtr, *StaticSignPtr, LocArrayHeader[], AxisArray[], CoeffArray[], ConstArray[] ); |
RemArrayHeader | - | заголовок удаленного распределенного массива. | ||
BufferHeader | - | заголовок создаваемого буфера удаленных элементов. | ||
BasePtr | - | базовый указатель для доступа к буферу удаленных элементов. | ||
*StaticSignPtr | - | признак создания статического буфера. | ||
LocArrayHeader | - | заголовок распределенного массива (локального), при обработке которого необходимы размещенные в буфере элементы удаленного массива. | ||
AxisArray | - | массив i-й элемент которого содержит номер измерения локального распределенного массива, соответствующего (i+1)-му измерению удаленного массива (k(i+1), см. ниже). | ||
CoeffArray | - | массив, i-й элемент которого содержит коэффициент индексной переменной линейного правила выборки для (i+1)-го измерения удаленного массива (Ai+1, см. ниже). | ||
ConstArray | - | массив, i-й элемент которого содержит константу линейного правила выборки для (i+1)-го измерения удаленного массива (Bi+1. см. ниже). |
Функция crtrba_ создает буфер для размещения в нем элементов удаленного распределенного массива с заголовком RemArrayHeader, необходимых для работы с распределенным массивом (локальным), заданным заголовком LocArrayHeader. Удаленный и локальный распределенные массивы должны быть отображены в процессорные системы (возможно, каждый в свою), все элементы которых принадлежат текущей процессорной системе.
Требуемые элементы удаленного распределенного массива задаются для каждого его измерения, не являющегося свободным, с помощью линейных правил выборки:
Ai*Vk(i) + Bi , где:
i | - | номер измерения удаленного распределенного массива; |
Vk(i) | - | индексная переменная k-го измерения локального распределенного массива, меняющаяся в пределах своих начального и конечного значений; |
Ai | - | целое число; |
Bi | - | целое неотрицательное число. |
Буфер удаленных элементов, создаваемый функцией crtrba_, отображен так же, как и локальный распределенный массив, но его i-му измерению соответствует k(i)-е измерение локального массива (в том случае, когда для i-го измерения удаленного массива задано линейное правило выборки с ненулевым Ai).
Все параметры функции crtrba_ (кроме LocArrayHeader) аналогичны одноименным параметрам рассмотренной ранее функции crtrbl_.
Функция возвращает ненулевое значение, если созданный буфер имеет локальную часть на текущем процессоре, и нулевое - в противном случае.
long crtrbp_ ( | long long void long PSRef long |
RemArrayHeader[], BufferHeader[], *BasePtr, *StaticSignPtr, *PSRefPtr, CoordArray[] ); |
RemArrayHeader | - | заголовок удаленного распределенного массива. | ||
BufferHeader | - | заголовок создаваемого буфера удаленных элементов. | ||
BasePtr | - | базовый указатель для доступа к буферу удаленных элементов. | ||
*StaticSignPtr | - | признак создания статического буфера. | ||
*PSRefPtr | - | ссылка на процессорную систему, на каждом процессоре которой необходимо присутствие элементов удаленного распределенного массива. | ||
CoordArray | - | массив, i-й элемент которого содержит значение координаты требуемого элемента по (i+1)-му измерению удаленного массива. |
Функция crtrbp_ создает буфер для размещения в нем элементов удаленного распределенного массива с заголовком RemArrayHeader, присутствие которых необходимо на каждом процессоре системы, заданной ссылкой *PSRefPtr.
Удаленный распределенный массив должен быть отображен в процессорную систему, все элементы которой обязаны принадлежать текущей процессорной системе. Ссылкой *PSRefPtr может быть определена текущая процессорная система или ее непосредственная или косвенная подсистема. Равное NULL значение указателя PSRefPtr или нулевое значение ссылки *PSRefPtr задают текущую процессорную систему.
Требуемые элементы удаленного распределенного массива задаются для каждого его (i+1)-го измерения значением i-го слова массива CoordArray: неотрицательное значение определяет координату элемента удаленного массива; отрицательное значение задает все измерение удаленного массива (аналог свободного измерения удаленного массива в описании функций crtrbl_ и crtrba_). Число элементов в массиве CoordArray должно быть равно размерности удаленного распределенного массива.
Размерность буфера удаленных элементов, создаваемого функцией crtrbp_, равна числу отрицательных элементов массива CoordArray. Размер каждого j-го измерения буфера равен размеру измерения удаленного массива, соответствующего j-му по счету отрицательному элементу массива CoordArray. Если все элементы массива CoordArray неотрицательны (задан ровно один удаленный элемент), то система поддержки создает одномерный распределенный массив-буфер, состоящий из одного элемента.
При выполнении функции crtrbp_ буфер удаленных элементов отображается таким образом, чтобы все требуемые и, следовательно, размещенные в нем элементы присутствовали на всех процессорах системы, заданной параметром PSRefPtr. Для этого система поддержки создает вспомогательное одномерное представление текущей абстрактной машины, состоящее из одного элемента, и отображает его в заданную при обращении к функции процессорную систему с размножением по всем ее измерениям. Буфер удаленных элементов отображается, в свою очередь, во вспомогательное представление с размножением по его единственному измерению.
Функция возвращает ненулевое значение, если созданный буфер имеет локальную часть на текущем процессоре, и нулевое - в противном случае.
14.2 Запуск загрузки буфера удаленных элементов распределенного массива
long loadrb_ ( | long long |
BufferHeader[], *RenewSignPtr ); |
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), осуществляется по линейному индексу следующим образом:
Для языка C при обращении к функциям crtrbl_, crtrba_ и crtrbp_ значение базового указателя можно задать равным NULL. Тогда доступ к размещенному в локальной части буфера удаленному элементу можно произвести разименованно:
где Type - тип элементов удаленного распределенного массива.
Для буфера удаленных элементов, созданного функцией crtrbl_.
Пусть измерение буфера m соответствует линейному правилу выборки удаленных элементов (связанное измерение) и, следовательно, некоторому измерению параллельного цикла k. Тогда при доступе к элементу буфера значение координаты Im может быть заменено значением индексной переменой цикла Vk: Im = Vk - min(Vk,нач , Vk,кон) (Vk,нач и Vk,кон - начальное и конечное значения индексной переменной цикла Vk). Это означает, что переход из индексного пространства буфера в индексное пространство параллельного цикла влечет переход к распределеному массиву-буферу с ненулевыми нижними границами индексов. Поэтому в целях поддержки доступа к элементам буфера по индексным переменным цикла система поддержки при выполнении функции crtrbl_ для всех связанных измерений сохраняет в заголовке буфера величины min(Vk,нач , Vk,кон) в качестве нижних границ измерений массива (см. описание расширенного заголовка распределенных массивов в п. 13.4). Нижние границы свободных измерений буфера устанавливаются в его заголовке нулевыми.
В языке C для доступа к элементам буфера по индексным переменным параллельного цикла могут быть использованы макрокоманды вида
<RBElmType> RBElm<Rank> ( | long long . . . . long |
BufferHeader[], <RBElmType>, Index1, . . . . . . . . . . Index<Rank> ); |
BufferHeader | - | заголовок буфера удаленных элементов. | ||
Rank | - | размерность буфера (1-7). | ||
RBElmType | - | тип элементов, размещенных в буфере. | ||
Indexi | - | значение индекса требуемого элемента для i-го измерения буфера. |
Семь вышеописанных макрокоманд являются L-выражениями языка C.
Предполагается, что при создании буфера с помощью функции crtrbl_ базовый указатель был задан равным NULL.
14.6 Создание группы буферов удаленных элементов
RegularAccessGroupRef crtbg_( | long long |
*StaticSignPtr, *DelBufSignPtr ); |
*StaticSignPtr | - | признак создания статической группы буферов. | ||
*DelBufSignPtr | - | признак уничтожения всех буферов, входящих в группу, при ее уничтожении. |
Функция crtbg_ создает пустую группу буферов (не содержащую ни одного буфера) и возвращает ссылку на нее.
Задаваемый ненулевым значением *StaticSignPtr признак статической группы означает создание группы, не уничтожаемой при выходе из программного блока (см.п.8). Такая группа может быть уничтожена только явно, с помощью рассмотреной ниже функции delbg_ .
Ненулевое значение *DelBufSignPtr задает такой режим уничтожения группы буферов, при котором все входящие в нее буфера будут также уничтожены. При явном уничтожении группы уничтожение входящих в нее буферов будет также считаться явным, при неявном - неявным.
14.7 Включение в группу буфера удаленных элементов
long insrb_ ( | RegularAccessGroupRef long |
*RegularAccessGroupRefPtr, BufferHeader[] ); |
*RegularAccessGroupRefPtr | - | ссылка на группу буферов. | ||
BufferHeader | - | заголовок включаемого буфера. |
Как группа буферов, так и включаемый в нее буфер должны быть созданы в текущей подзадаче и не могут находиться в состоянии загрузки. Допускается повторное включение буфера в группу, но нельзя включить буфер в группу буферов, если он уже включен в другую группу.
Возвращается нулевое значение.
14.8 Запуск загрузки буферов удаленных элементов заданной группы
long loadbg_( | RegularAccessGroupRef long |
*RegularAccessGroupRefPtr, *RenewSignPtr ); |
*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 long void long LoopRef long long long long long |
ArrayHeader[], BufferHeader[], *BasePtr, *StaticSignPtr, *LoopRefPtr, AxisArray[], CoeffArray[], ConstArray[], LowShdWidthArray[], HiShdWidthArray[] ); |
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_.
Распределенный массив должен быть отображен в процессорную систему, каждый элемент которой принадлежит текущей процессорной системе. Параллельный цикл на момент обращения к функции должен быть текущим и отображенным.
Тип доступа кодируется следующими возвращаемыми функцией значениями:
1 - локальный
доступ;
2 - доступ
типа "SHADOW";
3 - доступ
типа "FULL SHADOW";
4 - доступ
типа "REMOTE" (удаленный доступ).
Тип доступа утанавливается следующим образом. Пусть PS - процессорная система, в которую отображен заданный параллельный цикл. Тогда:
Если доступ имеет тип "SHADOW" или "FULL SHADOW", то в массивы LowShdWidthArray и HiShdWidthArray записываются ширины границ распределенного массива, заданные при его создании.
В случае удаленного доступа функция rmkind_, обращаясь к функции crtrbl_, создает буфер удаленных элементов с заголовком BufferHeader.
15 Нерегулярный доступ к удаленным данным
Схема нерегулярного доступа к элементам удаленного распределенного массива аналогична рассмотренной в п.14 схеме регулярного доступа, но область ее применения ограничена массивами, имеющими только одно распределенное измерение (остальные измерения размножены). Необходимые для выполнения параллельного цикла и размещаемые в буфере элементы удаленного массива задаются множеством индексных векторов вида
где:
n | - | размерность удаленного массива; |
k | - | номер его распределенного измерения; |
C1, ... , Ck-1, Ck+1, : , Cn | - | координаты размноженных измерений удаленного массива (целые неотрицательные числа); |
ME | - | матрица глобальных индексов (или индексная матрица); |
Vk , J | - | индексные переменные правила выборки координат распределенного (k-го) измерения удаленного массива; |
Vk,нач , Vk,кон | - | начальное и конечное значения индексной переменной Vk. |
Индексная матрица ME представляет собой двухмерный распределенный массив типа "integer", первое измерение которого распределено, а второе размножено. Здесь и далее будем считать распределенный массив размноженным по измерению i, если значение многозначной функции отображения этого массива F( (I1, :, Ii, :, In) ) не зависит от значения Ii (см. п.7.1). Размер первого измерения индексной матрицы MESize1 обычно (но не обязательно) равен размеру распределенного (k-го) измерения удаленного массива. Размер MESize2 второго измерения матрицы ME равен
MAX(ME[Vk,0])
+ 1 .
0 <= Vk < MESize1
Смысл элементов индексной матрицы:
ME[Vk,0] | - | число соответствующих переменной Vk координат распределенного измерения удаленного массива; |
ME[Vk,J+1] | - | для каждых Vk и J: значение координаты распределенного измерения удаленного массива (0 <= J < ME[Vk,0]). |
15.1 Создание буфера удаленных элементов нерегулярного доступа
long crtibl_ ( | long long void long LoopRef long long |
RemArrayHeader[], BufferHeader[], *BasePtr, *StaticSignPtr, *LoopRefPtr, MEHeader[], ConstArray[] ); |
RemArrayHeader | - | заголовок удаленного распределенного массива. | ||
BufferHeader | - | заголовок создаваемого буфера удаленных элементов. | ||
BasePtr | - | базовый указатель для доступа к буферу удаленных элементов. | ||
*StaticSignPtr | - | признак создания статического буфера. | ||
*LoopRefPtr | - | ссылка на одномерный параллельный цикл, при выполнении которого необходимы размещенные в буфере элементы удаленного массива. | ||
MEHeader | - | заголовок индексной матрицы. | ||
ConstArray | - | массив, i-й элемент которого содержит значение константы выборки элементов для (i+1)-го измерения удаленного распределенного массива (Ci+1). |
Функция crtibl_ создает буфер для размещения в нем элементов удаленного распределенного массива с заголовком RemArrayHeader, необходимых для выполнения одномерного параллельного цикла, заданного ссылкой *LoopRefPtr.
Удаленный массив должен быть отображен в процессорную систему, каждый элемент которой принадлежит текущей процессорной системе. Он должен иметь единственное распределенное измерение (остальные размножены).
Заданный параллельный цикл на момент обращения к функции должен быть текущим и отображенным. Его индексной переменной является рассмотренная ранее переменная Vk правила выборки координат распределенного измерения удаленного массива. Начальное и конечное значения переменной Vk (Vk,нач и Vk,кон) не могут быть отрицательными или превосходить уменьшенный на единицу размер первого измерения индексной матрицы.
Созданный буфер является двухмерным распределенным массивом, первое измерение которого распределено так же, как измерение (единственное) заданного параллельного цикла, а второе - размножено. Длина первого измерения буфера равна увеличенному на единицу абсолютному значению разности между конечным и начальным значениями индексной переменной Vk заданного параллельного цикла, а длина второго совпадает с уменьшенной на единицу длиной второго измерения индексной матрицы.
Заголовок буфера BufferHeader представляет собой массив из 6-и элементов типа "long" (расширенный заголовок распределенного массива, см. п. 13.4). Размещение заголовка в памяти (статическое или динамическое) осуществляется пользовательской программой, а инициализация - системой поддержки при выполнении функции crtibl_ .
Работа с буфером удаленных элементов осуществляется аналогично работе с распределенным массивом (см.п.13).
В целях оптимизации буфера удаленных элементов могут объединяться в группы, а загрузка всех буферов группы осуществляться одной операцией (см. п.п. 15.6 - 15.10).
Базовый указатель BasePtr должен ссылаться на любую переменную, имеющую тот же тип, что и элементы удаленного распределенного массива. Содержимое этой переменной несущественно, т.к. базовый указатель используется только для доступа к удаленным элементам распределенного массива, размещенным в созданном буфере.
Подробнее работа с заголовком буфера удаленных элементов и базовым указателем рассмотрена в п.15.5.
Заголовок индексной матрицы MEHeader представляет собой массив из 3-х или 6-и элементов типа "long" (стандартный или расширенный заголовок распределенного массива, см. п. 13.4). На момент обращения к функции crtibl_ индексная матрица должна быть отображена в процессорную систему, каждый элемент которой обязан принадлежать текущей процессорной системе. Первое измерение индексной матрицы должно быть распределено так же, как измерение заданного параллельного цикла (с точностью до коэффициента линейного правила отображения), а второе - размножено. Ширины нижних и верхних границ, заданные при создании индексной матрицы, должны быть нулевыми.
Число элементов в массиве ConstArray должно быть равно размерности удаленного распределенного массива. Значение ConstArray[k-1] несущественно (k - номер распределенного измерения удаленного массива).
Задаваемый ненулевым значением *StaticSignPtr признак статического буфера означает создание буфера, не уничтожаемого при выходе из программного блока (см.п.8). Такой буфер может быть уничтожен только явно, с помощью рассмотренной ниже функции delib_ (см. п. 15.4).
Функция возвращает ненулевое значение, если созданный буфер имеет локальную часть на текущем процессоре, и нулевое - в противном случае.
Замечание. Пусть при отображении заданного параллельного цикла функцией mappl_ начальное значение индексной переменной Vk, при положительном шаге, больше ее конечного значения или, при отрицательном шаге, конечное значение индексной переменной Vk больше ее начального значения (пустой цикл). Тогда использование этого цикла в качестве параметра функции crtibl_ приведет к созданию фиктивного буфера удаленных элементов. 0-му слову заголовка такого буфера (ссылке на распределенный массив) будет присвоено нулевое значение. Фиктивный буфер удаленных элементов может использоваться во всех функциях организации удаленного доступа, но использование его заголовка в качестве параметра функций работы с распределенными массивами запрещено. Не допускается также доступ к локальной части распределенного массива по заголовку фиктивного буфера.
Буфер удаленных элементов нерегулярного доступа может быть также создан с помощью функции
long crtib_ ( | long long void long long long |
RemArrayHeader[], BufferHeader[], *BasePtr, *StaticSignPtr, MEHeader[], ConstArray[] ); |
Функция crtib_ отличается от рассмотренной ранее функции crtibl_ отсутствием параметра LoopRefPtr, задающего ссылку на параллельный цикл. Созданный буфер будет распределен по обоим измерениям так же, как заданная индексная матрица. Размер его первого измерения будет совпадать с размером первого измерения индексной матрицы, а размер второго на единицу меньше размера второго измерения индексной матрицы.
Функция crtib_ позволяет создать буфер и запустить его загрузку (см. п. 15.2) до создания и отображения параллельного цикла, при выполнении которого будут использоваться помещенные в буфер элементы удаленного распределенного массива.
15.2 Запуск загрузки буфера удаленных элементов нерегулярного доступа
long loadib_ ( | long long |
BufferHeader[], *RenewSignPtr ); |
BufferHeader | - | заголовок буфера удаленных элементов. | ||
*RenewSignPtr | - | признак повторной перезагрузки уже загруженного буфера. |
Функция loadib_ инициирует загрузку заданного буфера элементами распределенного массива, для которых этот буфер был создан функцией crtibl_ (или crtib_).
Допускается использование функции для уже загруженного буфера. В этом случае фактическая перезагрузка осуществляется при ненулевом значении параметра *RenewSignPtr и не осуществляется, если его значение равно нулю. Запрещается перезагрузка буфера (вне зависимости от значения параметра *RenewSignPtr), если его предыдущая загрузка (фактическая или фиктивная) не завершена с помощью функции waitib_ (см. п. 15.3).
Как загружаемый буфер, так и его удаленный распределенный массив должны быть отображены в процессорные системы, каждый элемент которых обязан принадлежать текущей процессорной системе.
Не допускается запуск загрузки буфера функцией loadib_, если он включен в какую-либо группу буферов (см. п.п. 15.6 - 15.10).
Возвращается нулевое значение.
15.3 Ожидание завершения загрузки буфера удаленных элементов нерегулярного доступа
long waitib_ (long BufferHeader[]);
BufferHeader - заголовок буфера удаленных элементов нерегулярного доступа.
Загрузка заданного при обращении к функции буфера должна быть инициирована текущей подзадачей. Не допускается ожидание завершения не инициированной ранее загрузки буфера.
Возвращается нулевое значение.
15.4 Уничтожение буфера удаленных элементов нерегулярного доступа
long delib_ (long BufferHeader[]);
BufferHeader - заголовок уничтожаемого буфера удаленных элементов.
Буфер удаленных элементов может быть уничтожен функцией delib_ только в том случае, если он был создан в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Буфер удаленных элементов нерегулярного доступа может быть уничтожен также с помощью функции delobj_ (см.п.17.5).
Не доспускается уничтожение буфера, загрузка которого не завершена с помощью функции waitib_.
Если уничтожаемый буфер включен в какую-либо группу буферов, то он из состава этой группы исключается (см. п.п. 15.6 - 15.10). Группа буферов в этом случае не должна находиться в состоянии загрузки.
Возвращается нулевое значение.
15.5 Доступ к размещенным в буфере удаленным элементам
Буфер удаленных элементов нерегулярного доступа является двухмерным распределенным массивом с расширенным заголовком. Поэтому его заголовок может быть объявлен, например, как
long BufferHeader[6];
Пусть базовый указатель, соответствующий типу элементов удаленного распределенного массива, есть BasePtr. Тогда обращение к размещенному в локальной части буфера удаленному элементу, определенному индексным вектором (I1, I2), осуществляется следующим образом:
BasePtr[ BufferHeader[1]*I1 + I2 + BufferHeader[2] ] .
Для языка C при обращении к функции crtibl_ (или crtib_) значение базового указателя можно задать равным NULL. Тогда доступ к размещенному в буфере удаленному элементу можно осуществить разименованно:
( (Type *)BufferHeader[2] )[ BufferHeader[1]*I1 + I2 ] ,
где Type - тип элементов удаленного распределенного массива.
Доступ к элементам буфера по индексной переменной параллельного цикла.
1-е измерение буфера удаленных элементов соответствует 1-му (и единственному) измерению параллельного цикла, при выполнении которого требуются размещенные в буфере элементы (см. п. 15.1). Поэтому значение координаты I1 может быть заменено на значение индексной переменой цикла Vk (k - номер распределенного измерения удаленного массива): I1 = Vk - min(Vk,нач , Vk,кон) (Vk,нач и Vk,кон - начальное и конечное значения индексной переменной цикла Vk). Это означает, что переход из индексного пространства буфера в индексное пространство параллельного цикла влечет переход к распределеному массиву-буферу с ненулевой нижней границей индекса по 1-му измерению. Поэтому в целях поддержки доступа к элементам буфера по индексной переменной цикла система поддержки при выполнении функции crtibl_ сохраняет в BufferHeader[4] величину min(Vk,нач , Vk,кон) в качестве нижней границы 1-го измерения массива (см. описание расширенного заголовка распределенных массивов в п. 13.4).
Если буфер создается функцией crtib_, то элементу заголовка BufferHeader[4] присваивается нулевое значение.
Нижняя граница 2-го (размноженного) измерения буфера устанавливается в его заголовке (в BufferHeader[5]) равной единице. Это означает, что координате J второго измерения индексной матрицы будет соответствовать координата J-1 второго измерения буфера.
В языке C для доступа к элементам буфера по индексной переменной параллельного цикла может быть использована макрокоманда RBElm2 (см. п. 14.5). При обращении к макрокоманде RBElm2 в качестве Index2 задается значение индексной переменной второго измерения индексной матрицы.
15.6 Создание группы буферов удаленных элементов нерегулярного доступа
IndirectAccessGroupRef crtig_ ( | long long |
*StaticSignPtr, *DelBufSignPtr ); |
*StaticSignPtr | - | признак создания статической группы буферов. | ||
*DelBufSignPtr | - | признак уничтожения всех буферов, входящих в группу, при ее уничтожении. |
Функция crtig_ создает пустую группу буферов (не содержащую ни одного буфера) и возвращает ссылку на нее.
Задаваемый ненулевым значением *StaticSignPtr признак статической группы означает создание группы, не уничтожаемой при выходе из программного блока (см.п.8). Такая группа может быть уничтожена только явно, с помощью рассмотреной ниже функции delig_ .
Ненулевое значение *DelBufSignPtr задает такой режим уничтожения группы буферов, при котором все входящие в нее буфера будут также уничтожены. При явном уничтожении группы уничтожение входящих в нее буферов будет также считаться явным, при неявном - неявным.
15.7 Включение в группу буфера удаленных элементов нерегулярного доступа
long insib_ ( | IndirectAccessGroupRef long |
*IndirectAccessGroupRefPtr, BufferHeader[] ); |
*IndirectAccessGroupRefPtr | - | ссылка на группу буферов. | ||
BufferHeader | - | заголовок включаемого буфера. |
Как группа буферов, так и включаемый в нее буфер должны быть созданы в текущей подзадаче и не могут находиться в состоянии загрузки. Допускается повторное включение буфера в группу, но нельзя включить буфер в группу буферов, если он уже включен в другую группу.
Возвращается нулевое значение.
15.8 Запуск загрузки буферов удаленных элементов заданной группы
long loadig_( | IndirectAccessGroupRef long |
*IndirectAccessGroupRefPtr, *RenewSignPtr ); |
*IndirectAccessGroupRefPtr | - | ссылка на группу буферов. | ||
*RenewSignPtr | - | признак повторной перезагрузки уже загруженной группы буферов. |
Все буфера заданной при обращении к функции группы и их удаленные распределенные массивы должны быть отображены в процессорные системы, каждый элемент которых принадлежит текущей процессорной системе.
Допускается использование функции loadig_ для уже загруженной группы буферов. В этом случае фактическая перезагрузка осуществляется при ненулевом значении параметра *RenewSignPtr и не осуществляется, если его значение равно нулю. Запрещается перезагрузка группы буферов (вне зависимости от значения параметра *RenewSignPtr), если ее предыдущая загрузка (фактическая или фиктивная) не завершена с помощью функции waitig_ (см. п. 15.9).
Возвращается нулевое значение.
15.9 Ожидание завершения загрузки буферов удаленных элементов заданной группы
long waitig_ (IndirectAccessGroupRef *IndirectAccessGroupRefPtr);
*IndirectAccessGroupRefPtr - ссылка на группу буферов.
Загрузка заданной при обращении к функции группы буферов должна быть запущена текущей подзадачей. Не допускается ожидание завершения не инициированной ранее загрузки группы буферов.
Возвращается нулевое значение.
15.10 Уничтожение группы буферов удаленных элементов нерегулярного доступа
long delig_ (IndirectAccessGroupRef *IndirectAccessGroupRefPtr);
*IndirectAccessGroupRefPtr - ссылка на уничтожаемую группу буферов.
Группа буферов удаленных элементов может быть уничтожена функцией delig_ только в том случае, если она была создана в текущей подзадаче и в текущем программном блоке (или его подблоке) (см. п. 8 и п. 10).
Группа буферов может быть уничтожена также с помощью функции delobj_ (см.п.17.5).
Не допускается уничтожение группы буферов, загрузка которой не завершена с помощью функции waitig_.
Если группа буферов была создана функцией crtig_ с ненулевым значением параметра *DelBufSignPtr, то при ее уничтожении будут уничтожены и все включенные в нее буфера удаленных элементов.
Возвращается нулевое значение.