END DO
OPEN(Z, FILE=’JACOBI.DAT’, FORM=’FORMATTE’)
WRITE(Z, B)
CLOSE(Z)
END
Дадим некоторые пояснения:
1) массив A отображается на двумерную решётку процессоров
(смотри (BLOCK, BLOCK));
2) согласно директиве ALIGN элемент B(I, J) будет размещён
на том же процессоре, где находится A(I, J);
3) для второй директивы PARALLEL описываются общие
"теневые" данные, ширина теневых данных определятся разни-
цей индексных выражений элементов массивов, расположенных в
левой и в правой частях оператора присваивания (в данном случае
ширина теневых граней равна 1);
4) обе директивы PARALLEL описывают распределение итераций
цикла, согласованное с распределением массивов A и B: итерация
цикла (I, J) будет выполняться на том процессоре, где размещены
элементы A(I, J) и B(I, J).
Замечание. Перестановка индексов I и J связана с особенно-
стью распределения памяти при трансляции с языка Fortran: внут-
ренний цикл лучше заставить перебирать элементы столбца, т.к.
двумерные массивы в Фортране расположены в памяти по столб-
цам.
Для отладки делаются следующие шаги:
1) производится отладка программы, которая на этом шаге рас-
сматривается как последовательная программа;
2) программа запускается для проверки DVM-директив;
3) на третьем шаге программа запускается в режиме сравнения
результатов параллельного выполнения с эталонами, полученными
при последовательном выполнении;
4) используются средства трассировки для фиксации последо-
вательности обращений к переменным и для определения их зна-
чений;
5) применяется анализатор производительности для определе-
ния узких мест программы с целью выяснения эффективности рас-
параллеливания.
172