Примеры работы алгоритма

5.5.1 Программа "Якоби"

Листинг последовательной программы

PROGRAM JAC

PARAMETER (L=8, ITMAX=20)

REAL A(L,L), EPS, MAXEPS, B(L,L)

PRINT *, '********** TEST_JACOBI **********'

MAXEPS = 0.5E - 7

DO 1 J = 1, L(1)

DO 1 I = 1, L(2)

A(I, J) = 0. IF(I.EQ.1.OR. J.EQ.1.OR. I.EQ.L.OR. J.EQ.L) THEN

B(I, J) = 0.

ELSE

B(I, J) = (1. + I + J) ENDIF

1 CONTINUE

DO 2 IT = 1, ITMAX(3)

EPS = 0.

DO 21 J = 2, L-1(4)

DO 21 I = 2, L-1(5)

EPS = MAX (EPS, ABS(B(I, J) - A(I, J)))

A(I, J) = B(I, J)

21 CONTINUE

DO 22 J = 2, L-1(6)

DO 22 I = 2, L-1(7)

B(I, J) = (A(I-1, J) + A(I, J-1) + A(I+1, J)+ A(I, J+1)) / 4

22 CONTINUE

PRINT 200, IT, EPS

200 FORMAT(' IT = ',I4, ' EPS = ', E14.7)

IF (EPS. LT. MAXEPS) GO TO 3

2 CONTINUE

3 OPEN (3, FILE='JAC.DAT', FORM='FORMATTED', STATUS='UNKNOWN')

WRITE (3,*) B CLOSE (3) END

Первое внутреннее представление для циклов

После первого шага в первом внутреннем представлении помеченным в листинге последовательной программы циклам будут соответствовать следующие вершины:

 

(1) Тип:ППЦ,уровень = 0, число итераций = 8

 

Использование переменных:

 

Имя: i. Пометки: PRIVATE, SET, SHARED, NO

Имя: j. Пометки: PRIVATE, IND, SHARED, NO

Имя: a. Пометки: PRIVATE, POS, SHARED, DEF

Имя: b. Пометки: PRIVATE, POS, SHARED, DEF

(2) Тип:ППЦ,уровень = 1, число итераций = 8

 

Использование переменных:

 

Имя: i. Пометки: PRIVATE, IND, SHARED, NO

Имя: j. Пометки: PRIVATE, POS, SHARED, DEF

Имя: a. Пометки: PRIVATE, POS, SHARED, DEF

Имя: b. Пометки: PRIVATE, POS, SHARED, DEF

(3) Тип:ЦНР,уровень = 0, число итераций = 20


Использование переменных:

 

Имя: eps. Пометки: PRIVATE, SET, SHARED, NO

Имя: j. Пометки: PRIVATE, SET, SHARED, NO

Имя: i. Пометки: PRIVATE, SET, SHARED, NO

Имя: b. Пометки: PRIVATE, NO, SHARED, SET ORDERED!

Имя: a. Пометки: PRIVATE, NO, SHARED, SET ORDERED!

(4) Тип:ППЦ,уровень = 1, число итераций = 6

 

Использование переменных:

 

Имя: i. Пометки: PRIVATE, SET, SHARED, NO

Имя: eps. Пометки: REDUCTION, MAX, SHARED, NO

Имя: b. Пометки: PRIVATE, POS, SHARED, DEF

Имя: j. Пометки: PRIVATE, IND, SHARED, NO

Имя: a. Пометки: PRIVATE, POS, SHARED, DEF

(5) Тип:ППЦ,уровень = 2, число итераций = 6

 

Использование переменных:

 

Имя: eps. Пометки: REDUCTION, MAX, SHARED, NO

Имя: b. Пометки: PRIVATE, POS, SHARED, DEF

Имя: i. Пометки: PRIVATE, IND, SHARED, NO

Имя: j. Пометки: PRIVATE, POS, SHARED, DEF

Имя: a. Пометки: PRIVATE, POS, SHARED, DEF

(6) Тип:ППЦ,уровень = 1, число итераций = 6

 

Использование переменных:

 

Имя: i. Пометки: PRIVATE, SET, SHARED, NO

Имя: a. Пометки: PRIVATE, POS, SHARED, DEF

Имя: j. Пометки: PRIVATE, IND, SHARED, NO

Имя: b. Пометки: PRIVATE, POS, SHARED, DEF

(7) Тип:ППЦ,уровень = 2, число итераций = 6

 

Использование переменных:

 

Имя: a. Пометки: PRIVATE, POS, SHARED, DEF

Имя: i. Пометки: PRIVATE, IND, SHARED, NO

Имя: j. Пометки: PRIVATE, POS, SHARED, DEF

Имя: b. Пометки: PRIVATE, POS, SHARED, DEF

 


Второй шаг

На этом шаге будет устроен перебор различных вариантов распараллеливания. Рассмотрим их, группируя по регионам. Все варианты будем рассматривать при числе процессоров=4. 1-й регион: циклы (1) и (2). Здесь будет рассмотрено 3 варианта, время исполнения 1 витка внутреннего цикла =6, L=8.

 

!$OMP PARALLEL PRIVATE (I) !$OMP DO DO 1 J = 1, L DO 1 I = 1, L A(I, J) = 0. IF(I.EQ.1.OR. J.EQ.1.OR. I.EQ.L.OR. J.EQ.L) THEN B(I, J) = 0. ELSE B(I, J) = (1. + I + J) ENDIF ENDDO ENDDO !$OMP END DO !$OMP END PARALLEL DO 1 J = 1, L !$OMP PARALLEL !$OMP DO DO 1 I = 1, L A(I, J) = 0. IF(I.EQ.1.OR. J.EQ.1.OR. I.EQ.L.OR. J.EQ.L) THEN B(I, J) = 0. ELSE B(I, J) = (1. + I + J) ENDIF ENDDO !$OMP END DO ENDDO !$OMP END PARALLEL
Стоимость = 6*8*8/4 + 14 = 110 Количество приватных = 2 Время инициализации = 5 Время синхронизации переменных и удаления региона = 7 Итого: 14 Стоимость = 8*(6*8/4 + 12) = 192 Количество приватных = 1 Время инициализации = 5 Время синхронизации переменных и удаления региона = 6 Итого: 12

Рис. 11. Сравнение вариантов распараллеливания в 1-м регионе программы "Якоби".

 

На Рис. 11 показаны возможные рассматриваемые варианты распараллеливания: цикла по J в левой части и цикла по I в левой части. Пункт "Стоимость" отражает подсчет оценочной функции. Она берется, как сумма "параллельного" вычисления цикла и "дополнительных" расходов, подсчитанных в пункте "Итого". Так как стоимость последовательная = 6*8*8 = 384, будет выбран вариант, показанный в левой части.

2-й регион: циклы (4) и (5). Время исполнения 1 витка внутреннего цикла =5.

 

!$OMP PARALLEL PRIVATE (I) !$OMP DO REDUCTION(EPS,MAX) DO 21 J = 2, L-1 DO 21 I = 2, L-1 EPS = MAX (EPS, ABS(B(I, J) - A(I, J))) A(I, J) = B(I, J) 21 CONTINUE !$OMP END DO !$OMP END PARALLEL DO 21 J = 2, L-1 !$OMP PARALLEL !$OMP DO REDUCTION(EPS,MAX) DO 21 I = 2, L-1 EPS = MAX (EPS, ABS(B(I, J) - A(I, J))) A(I, J) = B(I, J) !$OMP END DO !$OMP END PARALLEL 21 CONTINUE
Стоимость = 5*6*6/4+16=61 Количество приватных = 3 Время инициализации = 5 Время синхронизации переменных и удаления региона = 8 Итого: 16 Стоимость = 6*(5*6/4+14)=129 Количество приватных = 2 Время инициализации = 5 Время синхронизации переменных и удаления региона = 7 Итого: 14

Рис. 12. Сравнение вариантов распараллеливания в 2-м регионе программы "Якоби".


На Рис. 12 показаны возможные рассматриваемые варианты распараллеливания: цикла по J в левой части и цикла по I в левой части. Стоимость последовательная = 6*6*5= 180, следовательно, будет выбран вариант, описанный в левой части Рис. 12. Редукционная переменная считается как приватная.

3-й регион: циклы (6) и (7). Время исполнения 1 витка внутреннего цикла =9.

 

!$OMP PARALLEL PRIVATE (I) !$OMP DO DO 22 J = 2, L-1 DO 22 I = 2, L-1 B(I, J) = (A(I-1, J) + A(I, J-1) + A(I+1, J)+ A(I, J+1)) / 4 22 CONTINUE !$OMP END DO !$OMP END PARALLEL DO 21 J = 2, L-1 !$OMP PARALLEL !$OMP DO SHARED(J), REDUCTION(EPS,MAX) DO 21 I = 2, L-1 EPS = MAX (EPS, ABS(B(I, J) - A(I, J))) A(I, J) = B(I, J) !$OMP END DO !$OMP END PARALLEL 21 CONTINUE
Стоимость = 9*6*6/4+14=95 Количество приватных = 2 Время инициализации = 5 Время синхронизации переменных и удаления региона = 7 Итого: 14 Стоимость = 6*(9*6/4+12)=153 Количество приватных = 1 Время инициализации = 5 Время синхронизации переменных и удаления региона = 7 Итого: 12

Рис. 13. Сравнение вариантов распараллеливания в 3-м регионе программы "Якоби".

 

На Рис. 13 показаны возможные рассматриваемые варианты распараллеливания: цикла по J в левой части и цикла по I в левой части. Стоимость последовательная = 9*6*6=324, следовательно, будет выбран 1-й вариант из Рис. 13.

2-й и 3-й параллельные регионы объединятся в один регион, т.к. нет противоречий по локализации переменных. Проверка на NOWAIT не будет успешна: для обращения A(I, J) = B(I, J) есть обращение B(I, J) = (A(I-1, J) + A(I, J-1) + A(I+1, J)+ A(I, J+1)) / 4 (может возникнуть ситуация, когда одной нити придется использовать "старое" значение массива A во втором цикле).


Шаг 3 и Шаг 4

На шаге 3 не найдется параллельных соседних параллельных регионов для склейки. Из всевозможных альтернативных локализаций ни одна не будет принята, т.к. в любой из них количество приватных переменных (а следовательно и оценочная функция будут расти). Для простановки threadprivate не найдется ни одного приватного массива.

На шаге 4 получим выходную программу:

 

program jac

parameter (l = 8,itmax = 20)

real a(l,l),eps,maxeps,b(l,l)

! arrays A and B with block distribution

print *, '********** TEST_JACOBI **********'

maxeps = 5.000000e-008

!nest of two parallel loops, iteration (i,j) will be executed on

!processor, which is owner of element A(i,j)

!OMP PARALLEL PRIVATE(i)

!OMP DO

do j = 1,l

do i = 1,l

a(i,j) = 0.

if (i.eq. 1.or. j.eq. 1.or. i.eq. l.or. j.eq. l) then

b(i,j) = 0.

else

b(i,j) = 1. + i + j

endif

enddo

enddo

!OMP ENDDO

!OMP END PARALLEL

do it = 1,itmax

eps = 0

!variable EPS is used for calculation of maximum value

!OMP PARALLEL PRIVATE(i)

!OMP DO REDUCTION(MAX:eps)

do j = 2,l - 1

do i = 2,l - 1

eps = max (eps,abs (b(i,j) - a(i,j)))

a(i,j) = b(i,j)

enddo

enddo

!Copying shadow elements of array A from

!neighbouring processors before loop execution

!OMP ENDDO

!OMP DO

do j = 2,l - 1

do i = 2,l - 1

b(i,j) = (a(i - 1,j) + a(i,j - 1) + a(i + 1,j) + a(i,j +

&1)) / 4

enddo

enddo

!OMP ENDDO

!OMP END PARALLEL

print 200, it,eps

200 FORMAT(' IT = ',I4, ' EPS = ', E14.7)

if (eps.lt. 5.000000e-008) goto 3

enddo

3 open (unit = 3,file = 'JAC.DAT',form = 'FORMATTED',status = 'UNKNO

&WN')

write (unit = 3,fmt = *) b

close (unit = 3)

end

 

Для данной программы будет выдана следующая оценка производительности:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: