Разработка параллельной программы представляет собой, как правило, сложный, высококвалифицированный и непроизводительный труд. Параллельные программы с большими затратами переносятся между различными архитектурами параллельных вычислительных систем. Круг пользователей многих параллельных программ весьма узок. Эти обстоятельства являются мощным стимулом для создания средств автоматического распараллеливания последовательных программ.
Программирование на последовательном языке программирования и последующее автоматическое распараллеливание выглядит весьма привлекательным, поскольку позволяет:
Однако в настоящее время последовательное программирование и последующее автоматическое распараллеливание редко используются в промышленном программировании, поскольку редко обеспечивают достижение приемлемого уровня эффективности параллельных программ.
Можно выделить четыре стадии решения задачи на параллельной вычислительной системе:
Степень параллелизма результатов этих стадий (алгоритма, программы, объектного кода, вычислительного процесса) обозначим , соответственно. Таким образом, — степень параллелизма алгоритма, —степень параллелизма программы, — степень параллелизма объектного кода, — степень параллелизма вычислительного процесса. Меры параллелизма будут рассмотрены позже.
Очевидно, что имеют место следующие неравенства

Проблема состоит в том, чтобы не растерять, а в максимальной степени сохранить параллелизм алгоритма на пути . Параллелизм является максимально достижимым (потенциальным) параллелизмом для всех стадий.
рис. 1, рис. 2, рис. 3, рис. 4 иллюстрируют различные варианты решения задач на параллельных вычислительных системах с точки зрения сохранения параллелизм алгоритма на пути .
Рис. 1.  Идеальный вариант сохранения параллелизма.
Рис. 2.  Потеря и восстановление параллелизма при использовании последовательного языка программирования и распараллеливающего, в частности, векторизующего компилятора.
Рис. 3.  Использование проблемно-ориентированного (непроцедурного) языка программирования типа языка НОРМА.
Рис. 4.  Использование параллельного ЯВУ, ориентированного на архитектуру данной параллельной вычислительной системы.
Как правило, основное время выполнения последовательных программ связано с реализацией циклов. Поэтому в проблеме автоматического распараллеливания последовательных программ распараллеливанию циклов уделяется первостепенное внимание.
Наряду с автоматическим распараллеливанием в вычислительной практике широко используется автоматизированное распараллеливание последовательных программ, когда программист "подсказывает" компилятору какие фрагменты следует распараллелить и каким методом. Такими подсказками для компилятора являются, по-сути, директивы языка HPF (см. параграф 4.4).
Различают статическое и динамическое распараллеливание последовательных программ. Чаще всего используют статическое распараллеливание последовательных программ (распараллеливание до выполнения программы), которым мы и ограничимся. При динамическом распараллеливании последовательных программ программа анализируется в процессе исполнения, на основе этого анализа принимается решение о назначении различных операторов различным устройствам для параллельной обработки.
Заметим, что, вообще говоря, распараллеливание программ можно осуществлять на уровне задач, процедур, операторов, операций и микроопераций. Целесообразность того или иного уровня распараллеливания решаться в каждом отдельном случае в зависимости от структуры вычислительной системы, языка программирования и цели распараллеливания.
Имеется множество коммерческих и некоммерческих систем автоматического и автоматизированного распараллеливания последовательных программ. Рассмотрим вкратце для примера пакет PGI, предлагаемый компанией Portland Group.
Пакет PGI включает в себя набор оптимизирующих и распараллеливающих компиляторов и средств, которые облегчают процесс разработки и поддержки вычислительных приложений на рабочих станциях, серверах и кластерах на базе процессоров Intel:
Пакет PGI работает в операционных системах Linux (x86), Solaris (x86) и Windows NT.