Вторая версия (1158279), страница 4
Текст из файла (страница 4)
Рассмотрим следующий цикл
DO 10 I1 = L1,H1,S1
. . .
DO 10 In = Ln,Hn,Sn
10 A(f1,…,fk) = B (g1,…,gm)
где A, B - идентификаторы разных распределенных массивов.
Li,Hi,Si – инварианты цикла
fi = ai *Ii + bi
gj = cj *Ij + dj
ai, bi , cj, dj – целые выражения, инварианты цикла (выражения, значения которых не изменяются в процессе выполнения цикла).
Каждая переменная цикла Il может быть использована не более чем в одном выражении fi и не более чем в одном выражении gj.
Цикл может содержать несколько операторов, удовлетворяющих вышеуказанным ограничениям. Каждая переменная цикла Il может быть использована не более чем в одном выражении. Такой цикл будем называть циклом копирования (copy-loop).
Оператор копирования
Оператор копирования является аналогом оператора присваивания секций массивов Фортран 90.
Цикл копирования может быть описан одним или несколькими операторами копирования (copy-statement) следующего вида
A(1,…,k) = B(1,…,m)
где
i = li : hi : si
j = lj : hj : sj
i, j - являются триплетами языка Фортран 90 (<начало>:<конец>:<шаг> по каждой размерности массива).
Для присваивания секции должны иметь одинаковые ранги, т.е. одинаковое число невырожденных размерностей (массивы при этом могут иметь разные ранги), одинаковое число элементов в соответствующих невырожденных размерностях секции источника и получателя.
Для триплетов существуют правила сокращенной записи. Определим эти правила на примере триплета i.
Если в копировании участвует все измерение массива, то
i = :
Если si = 1, то
i = li : hi
Если Li = hi , то
i = li
Рассмотрим следующий цикл копирования
REAL A(N1,N2,N3), B(N1,N3)
DO 10 I1 = 1, N1
DO 10 I2 = 2, N3-1
10 A(I1, 5, I2+1) = B(I1, I2-1)
Этому циклу соответствует следующий оператор копирования
A( :, 5, 3:N3 ) = B( :, 1:N3-2 )
Асинхронное копирование
Асинхронное копирование позволяет совместить передачу данных между узлами с выполнением других операторов.
Асинхронное копирование определяется комбинацией директивы начала копирования (ASYNCHRONOUS ID) и директивой ожидания окончания копирования (ASYNCWAIT ID). Соответствие директив определяется одним идентификатором ID.
Для асинхронного копирования нужно:
-
объявить директивой CDVM$ ASYNCID < идентификатор> отдельный идентификатор для каждой пары директив асинхронного копирования;
-
перед циклом записать директивы F90 - операторы копирования с префиксом F90
CDVM$ F90 <оператор копирования>;
-
перед циклом и перед директивами F90 указать директиву начала копирования
CDVM$ (ASYNCHRONOUS ) < идентификатор> c идентификатором из директивы ASYNCID ;
-
После цикла указать директиву
CDVM$ END ASYNCHRONOUS
-
перед использованием присвоенных значений убедиться в завершении (дождаться завершения) операции копирования директивой
CDVM$ ASYNCWAIT < идентификатор> c идентификатором из директивы ASYNCID.
Пример
REAL A(N1,N2,N3), B(N1,N3)
DO 10 I1 = 1, N1
DO 10 I2 = 2, N3-1
10 A(I1, 5, I2+1) = B(I1, I2-1)
можно специфицировать как асинхронное копирование следующим образом.
CDVM$ ASYNCID TR
REAL A(N1,N2,N3), B(N1,N3)
. . .
CDVM$ ASYNCHRONOUS TR
CDVM$ F90 A( :, 5, 3:N3 ) = B( :, 1:N3-2 )
DO 10 I1 = 1, N1
DO 10 I2 = 2, N3-1
10 A(I1, 5, I2+1) = B(I1, I2-1)
CDVM$ END ASYNCHRONOUS
. . .
последовательность операторов,
которая выполняется на фоне передачи данных
. . .
CDVM$ ASYNCWAIT TR
3.8 Многомерные массивы
При локализации данных с помощью директивы ALIGN для многомерных массивов необходимо указывать индексы выравниваемых элементов массивов по всем измерениям.
На предмет наличия удаленных данных достаточно анализировать только распределенные измерения массивов. Локальные измерения полностью распределены на каждом узле и по этим измерениям не существует удаленных данных. Каждое распределенное измерение, по которому существуют удаленные данные, должно быть учтено при спецификации удаленных данных в соответствии с разделами 3.5.2 - 3.5.4.
3.9 COMMON и EQUIVALENCE
Массивы, распределяемые по умолчанию, могут без ограничений использоваться в COMMON блоках и операторах EQUIVALENCE.
Массивы, распределяемые директивами DISTRIBUTE и ALIGN, не могут использоваться в операторах EQUIVALENCE. Кроме того, эти массивы не могут ассоциироваться с другими объектами данных. Явно распределяемые массивы могут быть компонентами COMMON блока при следующих условиях:
-
COMMON блок должен быть описан в главной программной единице.
-
Каждое описание COMMON блока должно иметь одно и то же количество компонент, а соответствующие компоненты - последовательности памяти одинакового размера.
-
Если компонентой COMMON блока является явно распределяемый массив, то объявления массива в разных программных единицах должны специфицировать один и тот же тип данных и одинаковую конфигурацию. Директивы DISTRIBUTE и ALIGN для этого массива должны иметь идентичные параметры.
3.10 Процедуры
Вызов процедуры из параллельного цикла
Процедура, вызываемая из параллельного цикла, не должна иметь побочных эффектов и содержать обменов между узлами (прозрачная процедура). Как следствие этого, прозрачная процедура не содержит:
-
операторов ввода-вывода;
-
директив Fortran DVM;
-
присваивание значений переменным COMMON блоков.
Вызов процедуры вне параллельного цикла
Если фактическим аргументом является явно распределенный массив (DISTRIBUTE или ALIGN), то он должен передаваться без изменения формы. Это означает, что фактический аргумент является ссылкой на начало массива, а соответствующий формальный аргумент имеет конфигурацию, полностью совпадающую с конфигурацией фактического аргумента.
Формальные аргументы
Если фактический аргумент является распределенным массивом, то соответствующий формальный аргумент должен иметь явное или наследуемое распределение.
Явное распределение описывается директивами DISTRIBUTE и ALIGN со следующим ограничением: формальный аргумент может быть выровнен только на другой формальный аргумент. Явное распределение формального аргумента означает, что пользователь должен перед вызовом процедуры обеспечить распределение фактического аргумента в точном соответствии с распределением формального аргумента.
Наследуемое распределение массива С (формального аргумента) описывается директивой:
CDVM$ INHERIT C
Наследуемое распределение означает, что формальный аргумент наследует распределение фактического аргумента при каждом вызове процедуры. Наследуемое распределение не требует от пользователя распределять фактический аргумент в соответствии с формальным аргументом.
Локальные массивы
Локальные массивы могут распределяться в процедуре директивами DISTRIBUTE и ALIGN. Локальный массив может быть выровнен на формальный аргумент. Директива DISTRIBUTE распределяет локальный массив на ту подсистему узлов, на которой была вызвана процедура (текущая подсистема).
Для распределенного локального массива с атрибутом SAVE директивы DISTRIBUTE или ALIGN имеют идентичные параметры при каждом вызове процедуры.
Пример Распределение локальных массивов и формальных аргументов.
SUBROUTINE DIST( A, B, C, N )
DIMENSION A(N,N), B(N,N), C(N,N), X(N,N), Y(N,N)
C явное распределение формального аргумента
CDVM$ DISTRIBUTE A ( *, BLOCK )
C выравниваемый формальный аргумент
CDVM$ ALIGN B( I, J ) WITH A( I, J )
C наследуемое распределение формального аргумента
CDVM$ INHERIT C
C выравнивание локального массива на формальный аргумент
CDVM$ ALIGN X( I, J ) WITH C( I, J )
C распределение локального массива
CDVM$ DISTRIBUTE Y ( *, BLOCK )
. . .
END
3.11Ввод-вывод
Для организации ввода-вывода данных в программе на языке Fortran OpenMP/DVM используются операторы стандарта Фортран 77.
Fortran DVM допускает только ограниченную форму операторов ввода-вывода для распределенных массивов:
-
Список ввода-вывода должен состоять только из одного имени распределенного массива и не может содержать других объектов ввода-вывода.
-
В операторах ввода-вывода по формату допускается только формат, задаваемый *.
-
Список управляющей информации не должен содержать параметры ERR, ЕND и IOSTAT.
-
В списке управляющей информации допускается использование только размноженных переменных.
Не разрешается использовать операторы ввода-вывода распределенных массивов в параллельном цикле.
На операторы ввода-вывода размноженных данных распространяются следующие ограничения:
-
Список управляющей информации не должен содержать параметры ERR и ЕND.
-
Допускается лишь следующая упрощенная форма списка с неявным циклом:
(A(i1,i2,...,I), I = n1,n2)
при вводе размноженного массива неопределенного размера.
Оператор ввода, оператор INQUIRE, а также любой другой оператор ввода-вывода с управляющим параметром IOSTAT не должны использоваться в параллельном цикле.
Программа на языке Fortran DVM, выполняющая бесформатный ввод-вывод распределенных массивов, в общем случае не совместима с последовательной программой на Фортране 77. Данные, записанные одной программой, не могут быть прочитаны другой, вследствие разницы длин записей.
4Компиляция, выполнение и отладка DVM-программ
4.1 Что такое DVM-программа?
Параллельная программа представляет собой обычную последовательную программу, в которую вставлены OpenMP и DVM-директивы, определяющие ее параллельное выполнение.
DVM-директивы записываются виде специального комментария
CDVM$ <директива-DVM>,
OpenMP-директивы записываются виде специального комментария
C$OMP <директива-OpenMP>,
которые в последовательной программе воспринимаются как комментарий.
DVM-программа – это один или несколько файлов с исходными текстами на языке Fortran DVM, имеющих расширение .fdv.
4.2 Настройка DVM-системы
В рабочую директорию, в которой находится DVM-программа, необходимо переписать файл запуска dvm-команд ( dvm или dvm.bat) и файл usr.par из директории dvm_sys/user DVM-системы.