Введение
Последовательная и параллельная модели программирования
Модель программирования - это совокупность приемов программирования, отвечающих архитектуре абстрактного компьютера, предназначенного для выполнения определенного класса алгоритмов. Модель программирования основана на определенном представлении о логической организации компьютера, его архитектуре. Существуют различные архитектуры, и одной из схем их классификации является таксономия Флинна, основанная на описании работы компьютера с потоками команд и данных (рис. 1.1 - 1.5).
Рис. 1.2 . Архитектура SISD (Single Instruction Stream - Single Data Stream) - один поток команд и один поток данных
Рис. 1.3 . Архитектура SIMD (Single Instruction Stream - Multiple Data Stream) - один поток команд и несколько потоков данных
Рис. 1.4 . Архитектура MISD (Multiple Instruction Stream - Single Data Stream) - несколько потоков команд и один поток данных
Рис. 1.5 . Архитектура MIMD (Multiple Instruction Stream - Multiple Data Stream) - несколько потоков команд и несколько потоков данных
Взаимодействие данных и команд может быть представлено информационным графом. Информационный граф описывает последовательность выполнения операций и взаимную зависимость между различными макрооперациями или блоками операций. Узлами информационного графа являются макрооперации, а однонаправленными дугами - каналы обмена данными (рис. 1.6).
Каждый узел можно охарактеризовать парой , где - имя узла, - его размер. Размер узла определяется количеством элементарных операций, входящих в его состав. Дуга характеризуется парой , где - пересылаемые данные, а - время, затрачиваемое на ее пересылку.
Информационный граф содержит линейные участки, а также многосвязные фрагменты (циклы). Предельные случаи информационного графа, топологически эквивалентные линейной последовательности макроопераций и лесу линейных последовательностей (рис. 1.7), соответствуют чистым последовательной и параллельной моделям вычислений.
Для последовательной модели программирования характерны следующие особенности:
- относительно невысокая производительность;
- применение стандартных языков программирования;
- хорошая переносимость программ на уровне исходного кода.
Параллельная модель программирования характеризуется:
- возможностью добиться более высокой производительности программ;
- применением специальных приемов программирования;
- применением специальных инструментов программирования;
- более высокой трудоемкостью программирования;
- проблемами с переносимостью программ.
При разработке параллельных приложений возникают и специфические для параллельной модели программирования проблемы:
- управление работой множества процессов;
- организация межпроцессных пересылок данных;
- вероятность тупиковых ситуаций (взаимных блокировок). Блокировки возникают, если процесс или поток ожидает доступ к ресурсу, заблокированному другим процессом, блокируя, в свою очередь, доступ к ресурсу, требуемому для продолжения работы второго процесса или потока;
- нелокальный и динамический характер ошибок. Процессы или потоки выполняются на разных процессорах или ядрах. Загрузка вычислительных узлов изменяется с течением времени, поэтому для обеспечения корректной работы параллельной программы может потребоваться явная синхронизация;
- утрата детерминизма (предсказуемого поведения программы в процессе ее исполнения). Параллельная программа может давать разные результаты при повторных запусках даже без модификации кода и исходных данных. Это является следствием "гонок за данными" - одновременного и асинхронного доступа разных процессов или потоков к общим переменным;
- необходимость заботиться о масштабируемости программы (масштабируемость -это свойство вычислительной системы, компьютерной сети или процесса/процессов, которое заключается в сохранении способности эффективно работать при возрастании их сложности);
- необходимость заботиться о сбалансированной загрузке вычислительных узлов.