Технология программирования для распределенных параллельных систем. Демьянович Ю.К - 47 стр.

UptoLike

int smallest=v, largest=v; # начальное состояние
# послать v следующему процессу P[1]:
send values[1](smallest, largest);
# получить глобальные максимальное и
# минимальное от P[n-1] и отправить
# их процессу P[1]:
receive values[0](smallest, largest);
send values[1](smallest, largest);
}
process P[i=1 to n-1] {
int v; # считается, что v инициализирована
int smallest, largest;
# получить текущие минимум и максимум
# и обновить их, сравнивая с v:
receive values[i](smallest, largest);
if (v<smallest)
smallest=v;
if (v>largest)
largest=v;
# отправить результат следующему процессу и
# ожидать получение глобальных результатов:
send values[(i+1) mod n](smallest, largest);
}
Замечание. Симметричное решение самое короткое, его легко
программировать, но оно требует взаимодействия каждого с каж-
дым. Хотя теоретически все сообщения могут быть посланы одно-
временно и пересылка может п роисходить параллельно с наимень-
шими временными затратами, но на практике пересылка большого
количества сообщений требует значительных затрат времени, что
может свести на нет ускорение, связанное с распараллеливанием.
Заметим, что при симметричном решении устанавливаем n(n-1)/2
связей точка-точка, где n число ВМ; это число весьма значитель-
но, если число ВМ велико.
Кольцевое решение напоминает конвейер: операнды u
min
и u
max
получают дополнительную обработку на каждом шаге конвейера.
Однако, конвейер плохо загр ужен (особенно, если n велико); та-
48