Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая3.docx
Скачиваний:
0
Добавлен:
27.01.2020
Размер:
43.3 Кб
Скачать

1.Введение.

Когда-то параллельное программирование было уделом только некоторых групп IT сообщества, которых интересовали задачи для огромных суперкомпьютеров. Но теперь, когда на многоядерных процессорах начали работать обычные приложения, параллельное программирование быстро становится технологией, которую должен освоить и уметь применять любой профессиональный разработчик ПО.

Естественный вопрос для разработчика - как ускорить выполнение программы? Конечно, можно посоветовать пользователю использовать более быстрый компьютер, но это решение очень ограничено, да и скорости компьютеров сейчас несильно увеличиваются. А вот что увеличивается - это количество ядер на компьютере.

Что дают эти ядра? Возможность независимо запустить несколько программ так, чтобы они не мешали друг другу. На четырехядерном компьютере вы можете одновременно запустить четыре линейных программы, требующих полной загрузки, и производительность не упадет. Возникает вопрос: а можно ли так сделать, чтобы одна программа стала работать в четыре раза быстрее?

Глобальный ответ - нет. Не существует мистического способа заставить программу работать быстрее просто из-за того, что у процессора есть несколько ядер. Почему? Да потому, что программа - это последовательность инструкций. Компьютер не сможет понять, какие из них нужно выполнять одновременно.

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

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

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

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

  • Определение параллелизма: анализ задачи с целью выделить подзадачи, которые могут выполняться одновременно

  • Выявление параллелизма: изменение структуры задачи таким образом, чтобы можно было эффективно выполнять подзадачи. Для этого часто требуется найти зависимости между подзадачами и организовать исходный код так, чтобы ими можно было эффективно управлять

  • Выражение параллелизма: реализация параллельного алгоритма в исходном коде с помощью языка параллельного программирования

При эксплуатации первых многопроцессорных ВС для повышения эффективности их работы возникла необходимость в параллельных алгоритмах, а следовательно, и в языках параллельного программирования (ЯПП), имеющих специальные средства для описания параллельных процессов. ЯПП в первую очередь должны предоставлять программистам средства для описания явного и обнаружения скрытого параллелизма. На

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

Средства описания вычислительного процесса, заложенные в большинстве языков программирования, носят, как правило, последовательный характер. Все дело в том, что применяемое понятие алгоритма использует пошаговый процесс его реализации. Даже такие высокоразвитые и широко применяемые языки, как ФОРТРАН и ПАСКАЛЬ, базируются на последовательном характере записи алгоритма. Однако в связи с созданием и эксплуатацией многопроцессорных систем и многомашинных комплексов назрела и постепенно начала воплощаться в жизнь идея описания алгоритмов в последовательно-параллельной форме, что позволило явно указывать в программе элементы, допускающие их параллельное выполнение.

Программирование задач для таких вычислительных установок получило название параллельного программирования, а соответствующие языки называют языками параллельного программирования. Под параллельным программированием будем понимать создание объектов – параллельных программ, каждая из которых есть организованная совокупность модулей с возможностями одновременного выполнения и взаимодействия.

Можно выделить два подхода к проектированию ЯПП. При так называемом параллельно-последовательном подходе ЯПП должен иметь средства для явного указания параллельных ветвей и порядка следования участков параллельности. При выполнении программы управление переходит от одного участка параллельности к другому, каждый раз ветвясь на требуемое число независимых управлений. Переход между участками

программы осуществляется только тогда, когда все независимые управления достигнут конца своих ветвей.

При асинхронном подходе параллельные ветви явно не задаются, и лишь в некоторые моменты времени при выполнении программы выясняется возможность (готовность) выполнения отдельного фрагмента задачи независимо от других фрагментов.

При проектировании ЯПП работа ведется как в направлении создания дополнительных средств в существующих последовательных языках, так и в плане создания ЯПП на совершенно новых принципах.

  • Переносимость: какие платформы необходимо поддерживать? Среда MPI приобрела такую популярность, в частности, потому, что работает в любых средах и на любых платформах. Однако, если планируется поддержка только оборудования с совместным использованием адресного пространства, то система обозначений на основе потоков может стать более удачным выбором.

  • Производительность: управляемые и высокоуровневые среды выполнения сильно облегчают жизнь программиста. Учитывая высокую стоимость создания и обслуживания ПО, очень важно рассмотреть эти возможности. Но ради них придется и чем-то пожертвовать. Низкоуровневые API-интерфейсы (такие как потоки Windows, Pthreads или MPI), где программист напрямую управляет оборудованием, позволяют выполнять более тонкую оптимизацию. В

случае, если требуется приспособиться к последнему вышедшему ядру, такая оптимизация приобретает очень большое значение.

  • Выпуски последовательных и параллельных продуктов: программное обеспечение живет долго. Успешный разработчик ПО должен обеспечить поддержку самого разного оборудования. Следовательно, обслуживание как последовательной, так и параллельной версии ПО в рамках одного каркаса исходного кода может оказаться важным. Это может оказаться нелегкой задачей, если система обозначений параллельного программирования требует значительной переработки ПО для реализации параллелизма.

  • Легкость в освоении: изучение нового языка может оказаться сложным. Если речь идет о группе разработчиков, затраты на обучение незнакомому языку могут быть слишком велики. Следовательно, очень важно, чтобы система обозначений параллельного программирования являлась расширением знакомого последовательного языка.

2.Технологии создания параллельных программ

При всем богатстве выбора существующих и создающихся вновь средств разработки параллельных программ, начиная от языков программирования и заканчивая библиотеками, предлагающими готовые реализации типовых вычислительных задач, реальных альтернатив на сегодняшний момент довольно немного, и каждой из них присущи свои ограничения.

2.1. Технология OpenMp

Задачи, которые должен решить программист, разрабатывающий параллельную программу для системы с общей памятью, во многих случаях идентичны, а значит, их реализацию можно переложить на компилятор, что и предлагает стандарт OpenMP, специфицирующий набор директив компилятора (для языков C, C++ и Fortran), функций библиотеки (для тех же языков) и переменных окружения. OpenMP

можно рассматривать как высокоуровневую надстройку над POSIX или Windows Threads (или аналогичными библиотеками потоков).

Преимуществами OpenMP являются:

  • Простота использования – разработчик не создает новую параллельную программу, а добавляет в текст последовательной программы необходимые директивы и, возможно, вызовы библиотечных функций, указывающие компилятору способы распределения вычислений и данных между потоками, а также доступа к ним. Главной идеей OpenMP является распараллеливание циклов, обычно несущих основную вычислительную нагрузку.

  • Гибкость – OpenMP предоставляет разработчику достаточно большие возможности контроля над поведением параллельной программы.

  • Повторное использование – OpenMP-программа во многих случаях может быть использована как обычная последовательная, если необходимо обеспечить ее выполнение на однопроцессорной платформе. При этом, чтобы избавиться от реализации OpenMP в исполняемом модуле, достаточно пересобрать его последовательным компилятором. Директивы OpenMP будут проигнорированы, а вызовы функций библиотеки могут быть заменены на заглушки, текст которых приведен в спецификациях стандарта.

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

2.2. Технология mpi

Параллельное программирование для систем с распределенной памятью (кластеров) не имеет в достаточной степени высокоуровневой (наподобие потоков) поддержки в операционных системах. Прямую работу с сокетами для реализации обмена данными между процессами параллельной программы не отнесешь к удобным подходам. Стандарт MPI предоставляет механизм построения параллельных программ в модели обмена сообщениями, характерной для разработки программ, ориентированных на кластерные системы. Стандарт специфицирует набор функций и вводит определенный уровень абстракций на основе сообщений, типов, групп и коммуникаторов, виртуальных топологий. Существуют стандартные

“привязки” MPI к языкам С, С++, Fortran. Реализации стандарта MPI имеются практически для всех суперкомпьютерных платформ, а также кластеров на основе рабочих станций UNIX\Linux и Windows. В настоящее время MPI – наиболее широко используемый и динамично развивающийся интерфейс из своего класса.

К положительным моментам MPI можно отнести:

  • Переносимость – MPI позволяет в значительной степени снизить остроту проблемы переносимости параллельных программ между разными компьютерными системами – параллельная программа, разработанная на алгоритмическом языке C или Fortran с использованием библиотеки MPI, как правило, будет работать на любых вычислительных платформах, для которых имеется реализация стандарта.

  • Повышение эффективности – MPI содействует повышению эффективности параллельных вычислений, поскольку в настоящее время практически для каждого типа вычислительных систем существуют реализации стандарта, в максимальной степени учитывающие возможности используемого компьютерного оборудования.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]