Page 54 - 6571
P. 54
значення елементів масиву a додатні, то можна виконати почат-
кову ініціалізацію змінної mзначенням 0.
Тепер розглянемо способи розпаралелювання наведеної про-
грами. Припустимо, що цикл повністю розпаралелений шляхом
паралельної перевірки всіх елементів масиву.
int m = 0;
co [i = 0 to n-1]
if (a[i] > m) m = a[i];
У цій формі оператор co використовує один або декілька
квантифікаторів, які вказують, що набір операторів повинен ви-
конуватися паралельно для кожної комбінації значень параметрів
циклу. Наприклад, наступний тривіальний оператор ініціалізує
масиви a[i] та b[i] нулями.
co [i = 0 to n-1] {
a[i] = 0;
b[i] = 0;
}
Даний оператор створює nпроцесів, по одному для кожного
значення змінної i. Область видимості лічильника – опис проце-
су, і в кожного процесу своє, відмінне від інших, значення змін-
ної i. Дві форми оператора co можна змішувати. Наприклад, од-
на гілка може мати квантифікатор у квадратних дужках, а інша
оператор co паралельного виконання.
Попередня програма пошуку максимального елемента маси-
ву некоректна, оскільки процеси не є незалежними: кожен з них і
зчитує, і записує змінну m. Зокрема, припустимо, що всі процеси
виконуються з однаковою швидкістю, і, отже, кожен з них порів-
нює свій елемент масиву a[i] із змінною m в один і той же мо-
мент часу. Всі процеси визначать, що нерівність виконується
(оскільки всі елементи масиву a більші початкового значення
змінної m, яка дорівнює нулю). Отже, всі процеси будуть намага-
тися оновити значення змінної m. Апаратне забезпечення пам’яті
виконуватиме оновлення в порядку деякої черги, оскільки запис
елемента в пам’ять – це неподільна операція. Кінцевим значен-
ням змінної m буде значення a[i], присвоєне їй останнім проце-
сом.
53