fdvmLDr (1158337), страница 10
Текст из файла (страница 10)
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
6.4. Удаленные ссылки типа REDUCTION
6.4.1. Синхронная спецификация удаленных ссылок типа REDUCTION
Если спецификация REDUCTION в параллельном цикле указана без имени группы, то она является синхронной спецификацией и выполняется следующим образом.
-
Вычисление локальной редукции. В процессе выполнения цикла на каждом процессоре вычисляется локальное значение редукции для той части данных, которые распределены на процессоре.
-
Вычисление глобальной редукции. После окончания выполнения цикла автоматически вычисляется межпроцессорная редукция локальных значений. Полученное значение присваивается редукционной переменной на каждом процессоре.
6.4.2. Асинхронная спецификация удаленных ссылок типа REDUCTION
Асинхронная спецификация позволяет:
-
объединять в одну группу редукционные переменные, вычисляемые в разных циклах;
-
совмещать выполнение глобальной групповой редукции с другими вычислениями.
Для асинхронной спецификации, кроме директивы REDUCTION (с именем группы), необходимы следующие дополнительные директивы.
| reduction-group-directive | is REDUCTION_GROUP reduction-group-name-list |
| reduction-start-directive | is REDUCTION_START reduction-group-name |
| reduction-wait-directive | is REDUCTION_WAIT reduction-group-name |
Типовая последовательность директив асинхронной спецификации типа REDUCTION выглядит следующим образом.
CDVM$ REDUCTION_GROUP RD
. . .
CDVM$ PARALLEL . . . , REDUCTION (RD : d1)
C локальная редукция d1
. . .
CDVM$ PARALLEL . . . , REDUCTION (RD : dn)
C локальная редукция dn
. . .
CDVM$ REDUCTION_START RD
C начало глобальной редукции di ... dn
. . .
CDVM$ REDUCTION_WAIT RD
C конец глобальной редукции di ... dn
Ограничения.
-
До выполнения директивы REDUCTION_START включенные в группу редукционные переменные могут использоваться только в редукционных операторах параллельных циклов.
-
Директива REDUCTION_START и REDUCTION_WAIT должны выполняться после окончания цикла (циклов), где вычислялись локальные значения редукционных переменных. Между этими операторами могут выполняться только те операторы, в которых не используются значения редукционных переменных.
-
Директива REDUCTION_WAIT уничтожает группу редукционных операций.
Пример 6.11. Асинхронная спецификация типа REDUCTION.
CDVM$ DISTRIBUTE A ( BLOCK )
CDVM$ ALIGN B( I ) WITH A( I )
CDVM$ REDUCTION_GROUP RD
. . .
S = 0.
CDVM$ PARALLEL ( I ) ON A( I ),
CDVM$* REDUCTION ( RD : SUM(S))
DO 10 I = 1, N
10 S = S + A(I)
X = 0.
CDVM$ PARALLEL ( I ) ON B( I ),
CDVM$* REDUCTION ( RD : MAX(X))
DO 20 I = 1, N
20 X = MAX(X, ABS( B(I) ) )
CDVM$ REDUCTION_START RD
C начало глобальной редукции SUM(S) и MAX(X)
CDVM$ PARALLEL ( I ) ON A( I )
DO 30 I = 1, N
30 A(I) = A(I) + B(I)
CDVM$ REDUCTION_WAIT RD
C конец глобальной редукции
PRINT *, S, X
На фоне выполнения групповой редукции будут вычисляться значения элементов массива А.
7. Параллелизм задач
Модель параллелизма DVM объединяет параллелизм по данным и параллелизм задач.
Параллелизм по данным реализуется распределением массивов и витков цикла на подсистему виртуальных процессоров. Подсистема виртуальных процессоров может включать весь массив или секцию массива виртуальных процессоров.
Параллелизм задач реализуется независимыми вычислениями на секциях массива процессоров.
Определим множество виртуальных процессоров, на которых выполняется процедура, как текущую систему виртуальных процессоров. Для главной процедуры текущая система состоит из полного множества виртуальных процессоров.
Отдельная группа задач определяется следующими директивами:
-
Описание массива задач (директива TASK).
-
Отображение массива задач на секции массива процессоров (директива MAP).
-
Распределение массивов по задачам (директива REDISTRIBUTE).
-
Распределение вычислений (блоков операторов или витков параллельного цикла) по задачам (конструкция TASK_REGION).
В процедуре может быть описано несколько массивов задач. Вложенность задач не разрешается.
7.1. Описание массива задач
Массив задач описывается следующей директивой:
| task-directive | is TASK task-list |
| task | is task-name ( max-task ) |
Описание задач определяет одномерный массив задач, которые затем будут отображены на секции массива процессоров.
7.2. Отображение задач на процессоры. Директива MAP
Отображение задачи на секцию массива процессоров выполняется директивой MAP.
| map-directive | is MAP task-name ( task-index ) |
| ONTO processors-name( processors-section-subscript-list) |
На одну секцию могут отображаться несколько задач.
7.3. Распределение массивов по задачам
Распределение массивов по задачам осуществляется директивой REDISTRIBUTE со следующим расширением:
| dist-target | is . . . |
| or task-name ( task-index ) |
Массив распределяется на секцию массива процессоров, на которую уже была отображена задача.
7.4. Распределение вычислений. Директива TASK_REGION
Распределение блоков операторов по задачам описывается конструкцией TASK_REGION:
| block-task-region | is task-region-directive |
| on-block | |
| [ on-block ]... | |
| end-task-region-directive | |
| task-region-directive | is TASK_REGION task-name [ , reduction-clause ] |
| end-task-region-directive | is END TASK_REGION |
| on-block | is on-directive |
| block | |
| end-on-directive | |
| on-directive | is ON task-name ( task-index ) [ , new-clause ] |
| end-on-directive | is END ON |
Область задач и каждый on-block являются последовательностями операторов с одним входом (первый оператор) и одним выходом (после последнего оператора). Для блоков операторов конструкция TASK_REGION по семантике эквивалентна конструкции параллельных секций для модели с общей памятью. Отличием является то, что блок операторов может выполняться на нескольких процессорах в модели параллелизма по данным.
Распределение витков параллельного цикла по задачам осуществляется следующей конструкцией:
| loop-task-region | is task-region-directive |
| parallel-task-loop | |
| end-task-region-directive | |
| parallel-task-loop | is parallel-task-loop-directive |
| do-loop | |
| parallel-task-loop-directive | is PARALLEL ( do-variable ) ON task-name ( do-variable ) [ , new-clause ] |
Единицей распределенных вычислений является виток одномерного параллельного цикла. Отличием от обычного параллельного цикла является распределение витка на секцию массива процессоров. При этом секция определяется ссылкой на элемент массива задач.
Спецификации reduction-clause и new-clause имеют ту же семантику, что и для параллельного цикла. Значение редукционной переменной должно быть вычислено в каждой задаче. После окончания задач (END TASK_REGION) в случае синхронной спецификации автоматически выполняется редукция над значениями редукционной переменной по всем задачам. В случае асинхронной спецификации запуск редукции осуществляется директивой REDUCTION_START.
Ограничение:
-
Если между задачами выполняется редукционная операция, то эти задачи должны быть распределены на непересекающиеся секции массива процессоров.
7.5. Локализация данных в задачах
Задачей является on-block или виток цикла. Задачи одной группы имеют следующие ограничения по данным
-
нет зависимостей по данным;
-
все используемые и вычисляемые данные размещены (локализованы) на секции массива процессоров данной задачи;
-
задача может изменять только значения массивов, распределенных на эту секцию, значения редукционных переменных и значения NEW-переменных.
После окончания задачи каждый массив должен иметь точно такое же распределение, какое существовало до запуска задачи. Если в задаче изменяется распределение массива, то оно должно быть восстановлено перед окончанием задачи.
7.6. Фрагмент статической многообластной задачи
Ниже приведен фрагмент программы, описывающей реализацию 3-х областной задачи (рис. 6.6.) в модели параллелизма по данным.
CDVM$ PROCESSORS P( NUMBER_OF_PROCESSORS( ) )
С массивы A1,А2,А3 - значения функции на предыдущей итерации
С массивы В1,В2,В3 - значения функции на текущей итерации
REAL A1( M, N1+1 ), B1( M, N1+1 )
REAL A2( M1+1, N2+1 ), B2(M1+1, N2+1 )
REAL A3( M2+1, N2+1 ), B3(M2+1, N2+1 )
С описание массива задач
CDVM$ TASK MB (3)
С выравнивание массивов в каждой области
CDVM$ ALIGN B1( I, J ) WITH A1( I, J )
CDVM$ ALIGN B2( I, J ) WITH A2( I, J )
CDVM$ ALIGN B3( I, J ) WITH A3( I, J )
С
CDVM$ DISTRIBUTE :: A1, A2, A3
CDVM$ REMOTE_GROUP RS
. . .
C распределение задач на секции массива процессоров и
С распределение массивов по задачам
С (каждая секция содержит треть всех процессоров)
NP = NUMBER_OF_PROCESSORS( ) / 3
CDVM$ MAP MB( 1 ) ONTO P( 1 : NP )
CDVM$ REDISTRIBUTE ( *, BLOCK ) ONTO MB( 1 ) :: A1
CDVM$ MAP MB( 2 ) ONTO P( NP+1 : 2*NP )
CDVM$ REDISTRIBUTE ( *, BLOCK ) ONTO MB( 2 ) :: A2
CDVM$ MAP MB( 3 ) ONTO P( 2*NP+1 : 3*NP )
CDVM$ REDISTRIBUTE ( *, BLOCK ) ONTO MB( 3 ) :: A3
. . .
DO 10 IT = 1, MAXIT
. . .
CDVM$ PREFETCH RS
C обмен границами смежных областей















