Page 166 - 4868
P. 166
Ошибка! Стиль не определен. 164
паралельної програми. Для визначення поточного значення точності може
бути використана функція:
double MPI_Wtick(void)
що дозволяє визначити час в секундах між двома послідовними показниками
часу апаратного таймера використовуваної комп’ютерної системи.
22.2. Колективні операції передачі даних у MPI
Функції MPI_Send і MPI_Recv, забезпечують можливість виконання
парних операцій передачі даних між двома процесами паралельної програми.
Для виконання комунікаційних колективних операцій, в яких беруть участь
усі процеси комунікатора, в MPI передбачений спеціальний набір функцій. У
цьому підрозділі будуть розглянуті три такі функції, широко вживані навіть
при розробці порівняно простих паралельних програм.
Для демонстрації застосування даних MPI-функцій використаємо
навчальнузадачу підсумовування елементів вектораx:
n
S
x
i
i 1
Розробка паралельного алгоритму для вирішення даноїзадачі не
викликає важкості: необхідно розділити дані на рівні блоки, передати ці
блоки процесам, виконати в процесах підсумовування отриманих даних,
зібрати значення вичислених власних сум на одному з процесів і скласти
значення власних сум для отримання загального результату вирішуваної
задачі. При подальшій розробці демонстраційних програм цей алгоритм буде
дещо спрощений: процесам програми передаватиметься увесь
підсумовуваний вектор, а не окремі блоки цього вектору.
Передача даних від одного процесу усім процесам програми. Перше
завдання при виконанні розглянутого паралельного алгоритму
підсумовування полягає в необхідності передачі значень вектору x усім
процесам паралельної програми. Звичайно, для вирішення цього завдання
можна скористатися розглянутими раніше функціями парних операцій
передачі даних :
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
for (int i = 1; i < ProcNum; i++)
MPI_Send(&x, n, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
Проте таке рішення буде вкрай неефективним, оскільки повторення
операцій передачі призводить до підсумовування витрат (латентностей) на
підготовку повідомлень, що передаються. Така операція може бути виконана
за log 2p ітерацій передачі даних.
Досягнення ефективного виконання операції передачі даних від одного
процесу усім процесам програми (широкомовна розсилка даних ) може бути
забезпечена за допомогою наступної функції MPI:
int MPI_Bcast(void *buf, int count, MPI_Datatype type, int
root, MPI_Comm comm)