fdvmLDr (1158337), страница 7
Текст из файла (страница 7)
Ограничение:
-
Размер левой теневой грани (low-width) и размер правой теневой грани (high-width) должны быть целыми константными выражениями, значения которых больше или равны 0.
Задание размера теневых граней как width эквивалентно заданию width : width.
По умолчанию, распределенный массив имеет теневые грани шириной 1 с обеих сторон каждого распределенного измерения.
6.2.2. Синхронная спецификация независимых ссылок типа SHADOW для одного цикла
Синхронная спецификация является частью директивы PARALLEL:
| shadow-renew-clause | is SHADOW_RENEW ( renewee‑list ) |
| renewee | is dist-array-name [ ( shadow-edge-list ) ] [ (CORNER) ] |
Ограничения:
-
Размер теневых граней, заполняемых значениями, не должен превышать максимального размера, описанного в директиве SHADOW.
-
Если размеры теневых граней не указаны, то используются максимальные размеры.
Выполнение синхронной спецификации заключается в обновлении теневых граней значениями удаленных переменных перед выполнением цикла.
Пример 6.1. Спецификация SHADOW-ссылок без угловых элементов.
REAL A(100), B(100)
CDVM$ ALIGN B( I ) WITH A( I )
CDVM$ DISTRIBUTE ( BLOCK) :: A
CDVM$ SHADOW B( 1:2 )
. . .
CDVM$ PARALLEL ( I ) ON A ( I ), SHADOW_RENEW ( B )
DO 10 I = 2, 98
A(I) = (B(I-1) + B(I+1) + B(I+2) ) / 3
10 CONTINUE
При обновлении значений в теневых гранях используются максимальные размеры 1:2 , заданные в директиве SHADOW.
Распределение и схема обновления теневых граней показана на рис.6.1.
| P-1 | P | P+1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| V | V | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Рис.6.1. Распределение массива с теневыми гранями.
На каждом процессоре распределяются два буфера, которые являются непрерывным продолжением локальной секции массива. Левая теневая грань имеет размер в 1 элемент (для B(I-1)), правая теневая грань имеет размер в 2 элемента (для B(I+1) и B(I+2)). Если перед выполнением цикла произвести обмен между процессорами по схеме на рис.6.1., то цикл может выполняться на каждом процессоре без замены ссылок на массивы ссылками на буфер.
Для многомерных распределенных массивов теневые грани могут распределяться по каждому измерению. Особая ситуация возникает, когда необходимо обновлять "угол" теневых граней. В этом случае требуется указать дополнительный параметр CORNER.
Пример 6.2. Спецификация SHADOW-ссылок с угловыми элементами.
REAL A(100,100), B(100,100)
CDVM$ ALIGN B( I, J ) WITH A( I, J )
CDVM$ DISTRIBUTE A ( BLOCK,BLOCK)
. . .
CDVM$ PARALLEL ( I, J ) ON A ( I, J ), SHADOW_RENEW ( B (CORNER))
DO 10 I = 2, 99
DO 10 J = 2, 99
A(I,J) = (B(I,J+1) + B(I+1,J) + B(I+1,J+1) ) / 3
10 CONTINUE
Теневые грани для массива В распределяются по умолчанию размером в 1 элемент по каждому измерению. Т.к. имеется удаленная "угловая" ссылка B(I+1,J+1) , то указывается параметр CORNER.
|
| теневые грани | |||||||||
|
| пересылаемые значения | |||||||||
|
| внутренняя область | |||||||||
|
| угловые элементы |
Рис. 6.2. Схема локальной секции массива с теневыми гранями.
6.2.3. Вычисление значений в теневых гранях. Спецификация SHADOW_COMPUTE
В разделах 6.2.1 и 6.2.2. были описаны способы обновления значений в теневых гранях путем обмена данными между процессорами. При этом новые значения массива вычислялись в одном цикле, а обновление производилось либо перед выполнением, либо во время выполнения другого цикла.
При некоторых условиях значения в теневых гранях можно обновлять без обмена данными между процессорами. Новые значения в теневых гранях можно вычислять в том же цикле, в котором вычисляются новые значения массивов. Такой способ обновления значений в теневых гранях описывается спецификацией SHADOW_COMPUTE, которая является частью директивы PARALLEL.
| shadow-compute-clause | is SHADOW_COMPUTE |
Рассмотрим некоторый параллельный цикл
CDVM$ PARALLEL (I1 , I2, …, In) ON A(f1,f2 ,…,fk)
где A – идентификатор массива, в соответствии с которым распределяются витки цикла.
Пусть
{LH} - множество ссылок на распределенные массивы в левых частях операторов присваивания цикла;
{RH} - множество ссылок на распределенные массивы в правых частях (выражениях) операторов присваивания цикла.
Для применения спецификации SHADOW_COMPUTE необходимо выполнение следующих условий:
-
ширина теневых граней распределенных измерений массивов из множеств {LH} и {RH} должна быть не меньше ширины теневых граней соответствующих измерений массива A;
-
теневые грани массивов из множества {RH} должны содержать значения, соответствующие значениям массивов.
Во время выполнения цикла значения в теневых гранях массивов из множества {LH} обновляются. Ширина обновленной части каждой теневой грани равна ширине соответствующей теневой грани массива A.
Пример 6.3. Спецификация SHADOW_COMPUTE.
CDVM$ DISTRIBUTE (BLOCK) :: A, B, C, D
CDVM$ SHADOW A(1:2)
CDVM$ SHADOW B(2:2)
CDVM$ PARALLEL ( I ) ON C( I ), SHADOW_COMPUTE,
CDVM$* SHADOW_RENEW( A, B )
DO 10 I = 1, N
C( I ) = A( I ) + B( I )
D( I ) = A( I ) - B( I )
10 CONTINUE
Так как по умолчанию ширина теневых граней для массивов C и D равна 1, то условие 1) удовлетворяется. Выполнение спецификации SHADOW_RENEW удовлетворяет условие 2).
6.2.4. Спецификация ACROSS зависимых ссылок типа SHADOW для одного цикла
Рассмотрим следующий цикл
DO 10 I = 2, N-1
DO 10 J = 2, N-1
A(I,J) = (A(I,J-1) + A(I,J+1) + A(I-1,J) + A(I+1,J)) / 4
10 CONTINUE
Между витками цикла с индексами i1 и i2 ( i1<i2 ) существует зависимость по данным (информационная связь) массива A, если оба эти витка осуществляют обращение к одному элементу массива по схеме запись‑чтение или чтение‑запись.
Если виток i1 записывает значение, а виток i2 читает это значение, то между этими витками существует потоковая зависимость или просто зависимость i1 i2.
Если виток i1 читает “старое” значение, а виток i2 записывает “новое” значение, то между этими витками существует обратная зависимость i1 i2.
В обоих случаях виток i2 может выполняться только после витка i1.
Значение i2 - i1 называется диапазоном или длиной зависимости. Если для любого витка i существует зависимый виток i + d (d - константа), тогда зависимость называется регулярной или зависимостью с постоянной длиной.
Цикл с регулярными вычислениями, в котором существуют регулярные зависимости по распределенным массивам, можно распределять с помощью директивы PARALLEL, указывая спецификацию ACROSS.
| across-clause | is ACROSS ( dependent-array-list ) |
| dependent-array | is dist-array-name ( dependence-list ) [(section-spec-list)] |
| dependence | is flow-dep-length : anti-dep-length | |
| flow-dep-length | is int-constant | |
| anti-dep-length | is int-constant | |
| section-spec | is SECTION ( section-subscript-list ) | |
В спецификации ACROSS перечисляются все распределенные массивы, по которым существует регулярная зависимость по данным. Для каждого измерения массива указывается длина прямой зависимости (flow-dep-length) и длина обратной зависимости (anti-dep-length). Нулевое значение длины зависимости означает отсутствие зависимости по данным.
Ограничение:
-
В каждой ссылке на массив может существовать зависимость по данным только по одному распределенному измерению. Например, разрешены ссылки A(I-1,J), A(I,J+1), но запрещены ссылки A(I‑1,J+1), A(I+1,J-1).
Если в цикле обновляются не все значения массива, а только значения некоторых секций массива, то эти секции следует указать в разделе SECTION.
Пример 6.4. Спецификация цикла с регулярной зависимостью по данным.
CDVM$ PARALLEL ( I, J ) ON A( I, J ) , ACROSS ( A( 1:1, 1:1 ))
DO 10 I = 2, N-1
DO 10 J = 2, N-1
A(I,J) = (A(I,J-1) + A(I,J+1) + A(I-1,J) + A(I+1,J)) / 4
10 CONTINUE















