Параллельные вычисления. Баканов В.М. - 28 стр.

UptoLike

Составители: 

- 28 -
последовательностью вызовов
fork
родительским процессом (создаются два
процесса с одинаковыми кодами и данными) и
exec
дочерним процессом (при
этом он завершается и замещаетсяновымпроцессом). Корректность рабо-
ты с процессами требует вызова родительским процессом
wait
после
fork
(да-
бы приостановить работу до момента завершения дочернего процесс и заме-
щения егоновым’).
Системный вызов
exit
завершает выполнение процесса с возвратом задан-
ного значения целочисленного статуса завершения (exit status), процесс-
родитель имеет возможность анализировать эту величину (при условии вы-
полнения им
wait
).
Параллелизм часто описывается в терминах макрооператоров
FORK
и
JOIN
,
в параллельных языках запуск параллельных ветвей осуществляется с помо-
щью оператора
FORK M1, M2 , ...ML
, где
M1, M2, ...ML
- имена независимых
ветвей; каждая ветвь заканчивается оператором
JOIN (R,K)
, исполнение кото-
рого вызывает вычитание единицы из ячейки памяти
R
. Предварительно в
R
записывается равное количеству ветвей число, при последнем срабатывании
оператора
JOIN
(т.е. когда все ветви выполнены) в
R
оказывается нуль и
управление передается оператору
K
(в некоторых случаях в
JOIN
описывается
подмножество ветвей, при выполнении которого срабатывает этот оператор).
В последовательных языках аналогов операторам
FORK
и
JOIN
не может быть
и ветви выполняются последовательно друг за другом.
В терминах
FORK/JOIN
итерационная параллельная программа может
иметь следующий вид (функции
F1
,
F2
и
F3
из-за различной алгоритмиче-
ской реализации должны вычисляться отдельными программными сегмента-
ми, которые логично оформить в виде ветвей параллельной программы), [7]:
X1=X10; X2=X20; X3=X30; R=3;
// инициализация переменных
LL FORK M1, M2, M3 // запустить параллельно M1,M2,M3
M1 Z1 = F1 (X1, X2, X3) // вычислить Z1=F1(X1, X2, X3)
JOIN (R, KK) // R=R-1
M2 Z2 = F2 (X1, X2, X3) // вычислить Z2=F2(X1, X2, X3)
JOIN (R, KK) // R=R-1
M3 Z3 = F3 (X1, X2, X3) // вычислить Z3=F3(X1, X2, X3)
JOIN (R, KK) // R=R-1
KK
IF (ABS (Z1-X1) <
ε
) AND
(ABS (Z2-X2) <
ε
) AND
(ABS (Z3-X3) <
ε
)
// если абсолютная точность
ε
// вычислений достигнута
THEN вывод результатов;
STOP
// то вывести данные и закончить
ELSE X1=Z1; X2=Z2; X3=Z3;
GO TO LL
// иначе переопределить X1,X2,X3
// и повторить цикл вычислений
Для многопроцессорных вычислительных систем особое значение имеет
обеспечение синхронизации процессов (вышеописанный оператор
JOIN
со-
                                      - 28 -


последовательностью вызовов fork родительским процессом (создаются два
процесса с одинаковыми кодами и данными) и exec дочерним процессом (при
этом он завершается и замещается ‘новым’ процессом). Корректность рабо-
ты с процессами требует вызова родительским процессом wait после fork (да-
бы приостановить работу до момента завершения дочернего процесс и заме-
щения его ‘новым’).
  Системный вызов exit завершает выполнение процесса с возвратом задан-
ного значения целочисленного статуса завершения (exit status), процесс-
родитель имеет возможность анализировать эту величину (при условии вы-
полнения им wait).
  Параллелизм часто описывается в терминах макрооператоров FORK и JOIN,
в параллельных языках запуск параллельных ветвей осуществляется с помо-
щью оператора FORK M1, M2 , ...ML, где M1, M2, ...ML - имена независимых
ветвей; каждая ветвь заканчивается оператором JOIN (R,K), исполнение кото-
рого вызывает вычитание единицы из ячейки памяти R. Предварительно в R
записывается равное количеству ветвей число, при последнем срабатывании
оператора JOIN (т.е. когда все ветви выполнены) в R оказывается нуль и
управление передается оператору K (в некоторых случаях в JOIN описывается
подмножество ветвей, при выполнении которого срабатывает этот оператор).
В последовательных языках аналогов операторам FORK и JOIN не может быть
и ветви выполняются последовательно друг за другом.
  В терминах FORK/JOIN итерационная параллельная программа может
иметь следующий вид (функции F1, F2 и F3 из-за различной алгоритмиче-
ской реализации должны вычисляться отдельными программными сегмента-
ми, которые логично оформить в виде ветвей параллельной программы), [7]:

       X1=X10; X2=X20; X3=X30; R=3;        // инициализация переменных
LL     FORK M1, M2, M3                     // запустить параллельно M1,M2,M3
M1     Z1 = F1 (X1, X2, X3)                // вычислить Z1=F1(X1, X2, X3)
       JOIN (R, KK)                        // R=R-1
M2     Z2 = F2 (X1, X2, X3)                // вычислить Z2=F2(X1, X2, X3)
       JOIN (R, KK)                        // R=R-1
M3     Z3 = F3 (X1, X2, X3)                // вычислить Z3=F3(X1, X2, X3)
       JOIN (R, KK)                        // R=R-1
KK     IF (ABS (Z1-X1) < ε) AND            // если абсолютная точность ε
          (ABS (Z2-X2) < ε) AND            // вычислений достигнута…
          (ABS (Z3-X3) < ε )
        THEN вывод результатов;            // то вывести данные и закончить
             STOP
        ELSE X1=Z1; X2=Z2; X3=Z3;          // иначе переопределить X1,X2,X3
             GO TO LL                      // и повторить цикл вычислений

  Для многопроцессорных вычислительных систем особое значение имеет
обеспечение синхронизации процессов (вышеописанный оператор JOIN со-