Page 55 - 6571
P. 55

У програмі, представленій вище, зчитування і запис змінної m
            є окремими операціями. Для роботи з таким рівнем паралельності
            необхідно використати синхронізацію для поєднання окремих дій
            в одній неподільній операції. Це демонструє наступна програма.

                  int m = 0;
                  co [i = 0 to n-1]
                    <if (a[i] > m) m = a[i];>

                  Кутові  дужки  в  цьому  фрагменті  коду  вказують,  що  кожен

            оператор if виконується як неподільна операція, тобто перевіряє
            поточне значення m і відповідно з умовою оновлює його в одній

            неподільній дії.
                  На жаль, остання програма – це майже те ж саме, що і послі-
            довне рішення. У послідовній програмі елементи масиву a пере-
            віряються  у  встановленому  порядку  –  від  a[0]  до  a[n-1].  В

            останній програмі елементи масиву a перевіряються в довільному
            порядку,  оскільки  у  довільному  порядку  виконуються  процеси.

            Але через синхронізацію перевірки все ще виконуються по одній.
                  Основне  завдання  –  забезпечити,  щоб  оновлення  змінної  m
            були неподільними операціями, а значення змінної m було дійсно
            максимальним.  Припустимо,  що  порівняння  виконуються  пара-

            лельно, але оновлення даних виконуються по одному, як в насту-
            пній програмі.

                  int m = 0;
                  co [i = 0 to n-1]
                    if (a[i]> m)
                      <m = a[i];>

                  Результат виконання даної програми насправді буде тим же,
            що і першої паралельної програми. Кожен процес здатний порів-

            няти своє значення елемента з масиву a із змінною m і потім об-
            новити  значення  змінної  m.  І  хоча  оновлення  m  є  неподільною
            операцією, проте така неподільність фактично забезпечується на

            апаратному рівні.
                  Отже, вихід полягає в поєднанні останніх двох програм. Мо-
            жна безпечно виконувати паралельні порівняння, оскільки це дії,

            які тільки зчитують змінні. Але необхідно забезпечити, щоб при
            завершенні програми значення m дійсно було максимальним. Це
            досягається в наступній програмі.



                                                        54
   50   51   52   53   54   55   56   57   58   59   60