О параллелизме на уровне программы имеет смысл говорить в двух случаях. Во-первых, когда в программе могут быть выделены независимые участки, которые допустимо выполнять параллельно. Примером такого вида параллелизма может служить программа робота. Пусть имеется робот, запрограммированный на обнаружение электрических розеток, когда уровень напряжения в его аккумуляторах падает. Когда робот находит одну из розеток, он включается в нее на подзарядку. В процесс вовлечены три подсистемы робота: зрение, манипуляция и движение. Каждая подсистема управляется своим процессором, то есть подсистемы при выполнении разных действий способны работать параллельно (таблица 8).
Таблица 8 | |||
Задача | Зрение | Манипуляция | Движение |
Поиск розетки | X | X | |
Движение к розетке | X | X | |
Подключение к розетке | X | X |
Подсистемы достаточно независимы при ведущей роли системы зрения. Возможен также и центральный процессор — «мозг». Это пример параллелизма программ, в котором разные задачи выполняются единовременно для достижения общей цели.
Второй тип параллелизма программ возможен в пределах отдельного программного цикла, если в нем отдельные итерации не зависят друг от друга. Программный параллелизм может быть реализован за счет большого количества процессоров или множества функциональных блоков. В качестве примера рассмотрим следующий фрагмент кода:
For I:=l to N do A(I):=B(I) + C(I)
Все суммы независимы, то есть вычисление Вi + Сi не зависит от Bj + Cj для любого j < i. Это означает, что вычисления могут производиться в любой последовательности и в вычислительной системе с N процессорами все суммы могут быть вычислены одновременно.
Общая форма параллелизма на уровне программ проистекает из разбиения программируемых данных на подмножества. Это разделение называют декомпозицией области (domain decomposition), а параллелизм, возникающий при этом, носит название параллелизма данных. Подмножества данных назначаются разным вычислительным процессам, и называется этот процесс распределением данных (data distribution). Процессоры выделяются определенным процессам либо по инициативе программы, либо в процессе работы операционной системой. На каждом процессоре может выполняться более чем один процесс.