fdvmLDr (1158337), страница 6
Текст из файла (страница 6)
DO 10 I = 1, N
DO 10 J = 1, N
X = B(I,J) + C(I,J)
A(I,J) = X
10 CONTINUE
5.1.4. Редукционные операции и переменные. Спецификация REDUCTION
Очень часто в программе встречаются циклы, в которых выполняются редукционные операции - в некоторой переменной суммируются элементы массива или вычисляется максимальное (минимальное) значение. Витки таких циклов можно распределять, если указать спецификацию REDUCTION.
| reduction-clause | is REDUCTION ( [ reduction-group-name : ] reduction-op-list ) |
| reduction-op | is reduction-op-name ( reduction-variable ) |
| or reduction-loc-name ( reduction-variable , location-variable, int-expr) |
| reduction-variable | is array-name |
| or scalar-variable-name | |
| location-variable | is array-name |
| reduction-op-name | is SUM |
| or PRODUCT | |
| or MAX | |
| or MIN | |
| or AND | |
| or OR | |
| or EQV | |
| or NEQV |
| reduction-loc-name | is MAXLOC |
| or MINLOC |
Редукционными переменными не могут быть распределенные массивы. Редукционные переменные вычисляются и используются только в операторах определенного вида - редукционных операторах.
Введем следующие обозначения
| rv | - редукционная переменная |
| L | - одномерный массив целого типа |
| n | - число координат минимума или максимума |
| er | - выражение, не содержащее rv |
| Ik | - целая переменная |
| op | - одна из следующих операций языка Фортран: +, -, .OR., .AND., .EQV., .NEQV. |
| ol | - одна из следующих операций языка Фортран: .GE., .GT., .LE., .LT. |
| f | - функция max или min |
В теле цикла редукционный оператор имеет один из следующих видов:
1) rv = rv op er
rv = er op rv
2) rv = f( rv, er )
rv = f( er, rv )
3) if( rv ol er ) rv = er
if( er ol rv ) rv = er
4) if( rv ol er ) then
rv = er
L( 1 ) = e1
. . .
L( n ) = en
endif
if( er ol rv ) then
rv = er
L( 1 ) = e1
. . .
L( n ) = en
endif
Соответствие вида оператора, операции языка Фортран и имени редукции FDVM приведено в следующей таблице.
| Вид оператора | операция Фортран | имя редукции FDVM |
| 1 | + | SUM(rv) |
| 1 | * | PRODUCT(rv) |
| 1 | .AND. | AND(rv) |
| 1 | .OR. | OR(rv) |
| 1 | .EQV. | EQV(rv) |
| 1 | .NEQV. | NEQV(rv) |
| 2,3 | MAX(rv) | |
| MIN(rv) | ||
| 4 | MINLOC(rv, L, n) | |
| MAXLOC(rv, L, n) |
Операция MAXLOC (MINLOC) предполагает вычисление максимального (минимального) значения и определение его координат.
Пример 5.4. Спецификация редукции.
S = 0
Y =1.E10
X = -1.
IMIN(1) = 0
CDVM$ PARALLEL ( I ) ON A( I ) ,
CDVM$* REDUCTION(SUM(S), MAX(X), MINLOC(Y,IMIN,1))
DO 10 I = 1, N
S = S + A(I)
X = MAX(X, A(I))
IF(A(I) .LT. Y) THEN
Y = A(I)
IMIN(1) = I
ENDIF
10 CONTINUE
5.2. Вычисления вне параллельного цикла
Вычисления вне параллельного цикла выполняются по правилу собственных вычислений. Пусть оператор
IF p THEN lh = rh
где p – логическое выражение,
lh – левая часть оператора присваивания (ссылка на скаляр или элемент массива),
rh – правая часть оператора присваивания (выражение),
находится вне параллельного цикла.
Тогда этот оператор будет выполняться на процессоре, где распределены данные со ссылкой lh (процессор own( lh )). Все данные в выражениях p и rh должны быть размещены на процессоре own( lh ). Если какие-либо данные из выражений p и rh отсутствуют на процессоре own( lh ), то их необходимо указать в директиве удаленного доступа (см. 6.1.2) перед этим оператором.
Если lh является ссылкой на распределенный массив А и существует зависимость по данным между rh и lh, то распределенный массив необходимо размножить с помощью директивы
REDISTRIBUTE А( *,...,* ) или REALIGN А( *,...,* )
перед выполнением оператора.
Пример 5.5. Оператор собственных вычислений.
PARAMETER (N = 100)
REAL A(N, N+1), X(N)
CDVM$ ALIGN X( I ) WITH A( I, N+1)
CDVM$ DISTRIBUTE ( BLOCK, * ) :: A
. . .
C обратная подстановка алгоритма Гаусса
C собственные вычисления вне циклов
С
С оператор собственных вычислений
С левая и правая части – на одном процессоре
X(N) = A(N,N+1) / A(N,N)
DO 10 J = N-1, 1, -1
CDVM$ PARALLEL ( I ) ON A ( I, *)
DO 20 I = 1, J
A(I,N+1) = A(I,N+1) - A(I,J+1) * X(J+1)
20 CONTINUE
C собственные вычисления в последовательном цикле,
С охватывающем параллельный цикл
X(J) = A(J,N+1) / A(J,J)
10 CONTINUE
Отметим, что A(J,N+1) и A(J,J) локализованы на том процессоре, где размещается X(J).
6. Cпецификация удаленных данных
6.1. Определение удаленных ссылок
Удаленными данными будем называть данные, размещенные на одном процессоре и используемые на другом процессоре. Фактически эти данные являются общими (разделяемыми) данными для этих процессоров. Ссылки на такие данные будем называть удаленными ссылками. Рассмотрим обобщенный оператор
IF (…A(inda)…) B(indb) = …C(indc)…
где A, B, C - распределенные массивы,
inda, indb, indc - индексные выражения.
В модели DVM этот оператор будет выполняться на процессоре own(B(indb)), т.е. на том процессоре, где размещен элемент B(indb). Ссылка A(inda) и C(indc) не являются удаленными ссылками, если соответствующие им элементы массивов A и C размещены на процессоре own(B(indb)). Единственной гарантией этого является выравнивание A(inda), B(indb) и C(indc) в одну точку шаблона выравнивания. Если выравнивание невозможно или невыполнено, то ссылки A(inda) и/или C(indc) необходимо специфицировать как удаленные ссылки. В случае многомерных массивов данное правило применяется к каждому распределенному измерению.
По степени эффективности обработки удаленные ссылки разделены на два типа: SHADOW и REMOTE.
Если массивы B и C выровнены и
inda = indc d ( d – положительная целочисленная константа),
то удаленная ссылка C(indc) принадлежит типу SHADOW. Удаленная ссылка на многомерный массив принадлежит типу SHADOW, если распределяемые измерения удовлетворяют определению типа SHADOW.
Удаленные ссылки, не принадлежащие типу SHADOW, составляют множество ссылок типа REMOTE.
Особым множеством удаленных ссылок являются ссылки на редукционные переменные (см. 5.2.4), которые принадлежат типу REDUCTION. Эти ссылки могут использоваться только в параллельном цикле.
Для всех типов удаленных ссылок возможны два вида спецификаций: синхронная и асинхронная.
Синхронная спецификация задает групповую обработку всех удаленных ссылок для данного оператора или цикла. На время этой обработки, требующей межпроцессорных обменов, выполнение данного оператора или цикла приостанавливается. Асинхронная спецификация позволяет совместить вычисления с межпроцессорными обменами. Она объединяет удаленные ссылки нескольких операторов и циклов. Для запуска операции обработки ссылок и ожидания ее завершения служат специальные директивы. Между этими директивами могут выполняться другие вычисления, в которых отсутствуют ссылки на специфицированные переменные.
6.2. Удаленные ссылки типа SHADOW
6.2.1. Спецификация массива с теневыми гранями
Удаленная ссылка типа SHADOW означает, что обработка удаленных данных будет происходить через “теневые” грани. Теневая грань представляет собой буфер, который является непрерывным продолжением локальной секции массива в памяти процессора (см. рис.6.1.).Рассмотрим оператор
A( i ) = B( i + d2) + B( i – d1)
где d1, d2 – целые положительные константы. Если обе ссылки на массив B являются удаленными ссылками типа SHADOW, то массив B необходимо специфицировать в директиве SHADOW как B( d1 : d2 ), где d1 – ширина левой грани, а d2 – ширина правой грани. Для многомерных массивов необходимо специфицировать грани по каждому измерению. При спецификации теневых граней указывается максимальная ширина по всем удаленным ссылкам типа SHADOW.
Синтаксис директивы SHADOW.
| shadow-directive | is SHADOW dist-array ( shadow-edge-list ) |
| or SHADOW ( shadow-edge-list ) :: dist-array-list |
| dist-array | is array-name |
| or pointer-name |
| shadow-edge | is width |
| or low-width : high-width |
| width | is int-expr |
| low-width | is int-expr |
| high-width | is int-expr |















