Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура компьютеров / 10_Большие системы.doc
Скачиваний:
57
Добавлен:
20.03.2015
Размер:
389.63 Кб
Скачать

10.6. Программный параллелизм и общие переменные

Во введении к этой главе говорилось, что сложную задачу не всегда легко разбить на параллельно выполняемые подзадачи. Однако есть особые случаи, когда это сделать достаточно просто. В частности, если главная задача представляет собой набор независимых программ, эти программы легко выполнить на разных про­цессорах. И если программы не блокируют друг друга, соревнуясь за устройства ввода-вывода, мультипроцессор оказывается полностью загруженным.

Кроме того, программу легко разделить на параллельно выполняемые задачи при использовании языка высокого уровня, позволяющего программисту явно выделить отдельные задачи. Такая конструкция часто называется PAR-сегментом. Она показана на рис. 10.13. Между управляющими командами PARBEGIN и PAREND находится список процедур, от Proc1 до ProcК, которые могут выпол­няться параллельно. Рассмотрим порядок реализации этой программы. После за­вершения сегмента программы, предшествующего команде PARBEGIN, может немедленно начаться выполнение любой из К параллельных процедур или же всех этих процедур, что зависит от количества свободных процессоров. Последо­вательность их запуска может быть любой. Выполнение части программы, сле­дующей за командой PAREND, разрешается только после завершения выполне­ния всех или К параллельных процедур.

PARBEGIN

Proc1;

Proc2;

….. PAR-сегмент

ProcК;

PAREND

…..

Рис. 10.13. Программная конструкция для параллельного выполнения

Если мультипроцессорная система выполняет только эту программу, за эффек­тивное использование процессоров отвечает программист. Степенью параллелиз­ма PAR-сегментов К, и отношением их общего размера к размеру последователь­ных сегментов определяется эффективность работы мультипроцессорной системы.

Наиболее эффективное использование мультипроцессорных систем достига­ется путем применения компиляторов, способных автоматически определять фрагменты пользовательских программ, которые можно запускать параллельно. Программист обычно представляет программу как набор последовательно произ­водимых операций. Но, несмотря на это, существует много возможностей парал­лельной реализации различных групп команд. Простейшим примером является многократно выполняемый программный цикл. Если данные, используемые на разных итерациях, независимы, итерации можно осуществлять параллельно. Ес­ли же при первом прохождении по циклу генерируются данные для второго про­хождения и т. д., параллельная работа не возможна. Компилятор должен выяв­лять зависимости по данным и решать, какие операции можно выполнить парал­лельно, а какие — нельзя. Разработка компиляторов, разбивающих программу на параллельно выполняемые фрагменты, — задача не из простых. И даже после то­го, как такие фрагменты будут выделены, их еще нужно оптимально распреде­лить между процессорами, так как свободных процессоров может быть меньше, чем фрагментов. Мы не будем обсуждать вопрос распределения подзадач между процессорами и планирования последовательности их реализации, а лишь пого­ворим о доступе к общим переменным, которые модифицируются параллельно выполняемыми подзадачами в мультипроцессорной системе.

Соседние файлы в папке Архитектура компьютеров