Page 46 - 4868
P. 46

Ошибка! Стиль не определен.                                                                44

               a[i] із змінною m в один і той же момент часу. Всі процеси визначать, що
               нерівність виконується (оскільки всі елементи масиву a більші початкового

               значення  змінної  m,  яка  дорівнює  нулю).  Отже,  всі  процеси  будуть
               намагатися  оновити  значення  змінної  m.  Апаратне  забезпечення  пам’яті
               виконуватиме оновлення в порядку деякої черги, оскільки запис елемента в
               пам’ять  –  це  неподільна  операція.  Кінцевим  значенням  змінної  m  буде
               значення a[i], присвоєне їй останнім процесом.
                     У  програмі,  представленій  вище,  зчитування  і  запис  змінної  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 дійсно було максимальним. Це досягається в наступній програмі.

                     int m = 0;
                     co [i = 0 to n-1]
                       if (a[i]> m) # перевірка значення змінної m
   41   42   43   44   45   46   47   48   49   50   51