Способы и средства записи параллельных программ

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

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

  • сама задача недостаточно подходит для применения к ней параллельных методов решения;
  • неправильное использование методов распараллеливания, что приводит к неэффективности данного подхода.

Сдай на права пока
учишься в ВУЗе
Вся теория в удобном приложении. Выбери инструктора и начни заниматься!

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

C++ Advanced. Параллельное программирование. Потоки и средства их синхронизации. Урок 5

  1. В поставленной задаче нужно иметь достаточный объём работы для распараллеливания, чтобы покрыть издержки самого процесса распараллеливания.
  2. Необходимо грамотно определить размер отдельных подзадач и их общее количество. Так, если их будет слишком много, то образуются очереди к ядрам процессора, и решение оказывается неоптимальным. И наоборот, если количество подзадач будет очень малым, то некоторые ядра процессора будут просто без работы, что также снижает общую производительность системы.
  3. Должна быть правильно выстроена балансировка нагрузки между отдельными ядрами процессора, что зачастую автоматически реализуется в применяемых инструментах для параллельного программирования.
  4. Требуется хорошая организация по выделению памяти и сборке мусора. Поскольку области памяти компьютера, выделяемые для параллельных вычислений, не должны перекрывать друг друга, то здесь важны вопросы о синхронизации всех одновременно выполняемых программой процессов. При очищении памяти возникают достаточно серьёзные временные затраты, плюс затрудняется распараллеливание задачи во время такой постоянной очистки.
  5. Минимизация проблем, связанных с кэшированием. Например, бывает так, что одно из ядер записывает значение в определённую область памяти, расположенную в кэше другого ядра. Или же различные ядра записывают значения хотя и в разные области памяти, но, допустим, находящиеся в одной строке кэша. Всё это значительно снижает производительность программы. Для того, чтобы уменьшить вероятность появления таких ситуаций, нужно определённым образом проектировать структуры данных, сохраняя в алгоритме решения задачи локальность обрабатываемых данных относительно общего потока.

«Параллельное программирование»
Готовые курсовые работы и рефераты
Решение учебных вопросов в 2 клика
Помощь в написании учебной работы

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

В настоящее время существует достаточно большое количество инструментов, позволяющих организовать параллельные вычисления для решения объёмных задач, например, таких как проведение различных научно-инженерных расчётов на вычислительных кластерах и в сетях. Среди них есть такие технологии как MPI, OpenMP, CUDA, HPF, DVM и т. д.

НИКОГДА НЕ ПОВТОРЯЙ ЭТО В STANDOFF 2

Замечание 1

Любой язык, подходящий для параллельного программирования, должен предоставлять:

  • средства для создания параллельных потоков;
  • возможности по взаимодействию параллельных процессов между собой;
  • конструкции для их синхронизации.

Интерфейс MPI

Определение 2

MPI (от англ. Message Passing Interface – интерфейс передачи сообщений) – это одна из распространённых технологий для параллельного программировании, основанная на том, что параллельные процессы взаимодействуют друг с другом при помощи обмена сообщениями.

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

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

Так как MPI представляет собой библиотеку, то для успешной компиляции программы необходимо подключить соответствующие библиотечные модули. В начале любой программы, использующей технологию MPI, должна быть выполнена команда include ‘mpif.h’ или include «mpi.h» (для языков Фортран и Си, соответственно). С помощью неё мы включаем в программу базовый файл с описанием интерфейса MPI.

Читайте также:
Называется программа которая служит для просмотра веб страниц на экране компьютера

Затем исполняемый файл нужно будет запустить на требуемом количестве процессоров. Для этого обычно используется команда mpirun, задающая подключение MPI-приложения:

mpirun –np N , где N – число процессов, допустимое в данной системе для решения одной задачи.

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

Отметим, что все объекты в MPI, такие как процедуры, константы и другие типы данных, в своих названиях имеют специальный префикс MPI_.

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

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

Источник: spravochnick.ru

1.3. Разработка параллельных приложений

ченные данные. Грид-системы гарантируют безопасность и защиту информации. Ярким примером является научно-техническая программа «СКИФ-ГРИД», выполняемая совместно Россией и Белоруссией. Цель программы – «освоение и адаптация передовых наукоемких технологий на перспективных суперкомпьютерных платформах, оптимизация суперкомпьютерных конфигураций семейства “СКИФ”, ориентированных на построение на их основе Грид-компьютерных сетей…» 1 .

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

1.3. Разработка параллельных приложений

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

ОС, многие многооконные приложения и пр .

Распределенные: файл-сервер, СУБД, Web и пр.

Параллельные: научные, графика и обработка изображений, задачи оптимизации и пр.

Рис. 1.10. Классы приложений

1. Многопоточные приложения. Термин многопоточный обычно означает, что программа содержит больше процессов/потоков 2 , чем суще-

1 URL: http://skif-grid.botik.ru/.

2 Мы оставим за рамками обсуждения различия между терминами «процесс»

и «поток». Здесь и далее в этой главе эти термины считаются взаимозаменяемыми. Затем под процессом понимается выполняемая в системе программа, решающая некоторую задачу, владеющая и/или претендующая на некоторые ресурсы системы. Ресурсы процессу могут выделяться как в безраздельное пользование (например, адресное пространство), так и разделяться с другими процессами (например, процессор). Поток –

Г л а в а 1. Обзор области параллельных вычислений

ствует процессоров для их выполнения. В результате некоторые процессы приложения выполняются по очереди.

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

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

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

Читайте также:
Какой программой открыть файл cfg

Примерами распределенных систем могут служить файловые серверы в сети, СУБД, веб-серверы в сети Интернет, отказоустойчивые системы, которые продолжают работать независимо от сбоев в компонентах.

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

Основной проблемой реализации распределенных программ является обмен информацией о состоянии разделяемого ресурса .

3. Параллельные (согласованные) вычисления. Цель таких при-

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

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

это «облегченный» процесс, т. е. потоки имеют собственные счетчики команд, стеки выполнения, но работают в общем адресном пространстве.

1.3. Разработка параллельных приложений

Параллельные программы требуют больших вычислительных мощ-

ностей. Обычно число процессов в параллельных программах равно числу процессоров (ядер) .

В таксономии Флинна уже прослеживается два основных подхода

к построению параллельных приложений.

1. Параллелизм по данным основан на выполнении процессами (потоками) одних и тех же действий над собственной частью данных.

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

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

Как правило, выбор метода распараллеливания основан на свойствах самой задачи или выбранного алгоритма ее решения. Так, для сеточных вычислений характерен параллелизм по данным, однако можно выбрать такой алгоритм решения (например, метод прогонки для решения СЛАУ с трехдиагональной матрицей), который испортит весь параллелизм исходной задачи. Задача обработки изображения может обладать внутренним параллелизмом по задачам, а каждая задача – параллелизмом по данным.

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

Декомпозиция – это процесс разбиения прикладной задачи на части. Иногда декомпозиция естественным образом следует из природы самой задачи, иногда она определяется разработчиком.

Можно проводить разбиение на основе логики действий (например, сортировка, поиск, ввод-вывод, вычисление), на основе логики ресурсов (например, работа с файлом, принтером, базой данных), на основе логики данных (например, обработка массива по строкам, столбцам или блокам).

Г л а в а 1. Обзор области параллельных вычислений

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

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

Источник: studfile.net

Введение

В настоящее время при создании параллельных программ, которые предназначены для многопроцессорных вычислительных систем MPP с распределенной памятью, для обмена данными между параллельными процессами, работающими в разных узлах системы, широко применяется интерфейс обмена сообщениями ( Message Passing Interface , MPI ). При использовании этого интерфейса обмен данными между различными процессами в программе осуществляется с помощью механизма передачи и приемки сообщений. Кроме MPI при создании параллельных программ возможны и другие методы обмена, например, основанные на использовании функций программной системы PVM (Parallel Virtual Machine ) или функций библиотеки SHMEM, разработанной компаниями Cray и Silicon Graphics .

Читайте также:
Характерным признаком линейной программы является наличие в каждой

При создании параллельных программ, предназначенных для многопроцессорных вычислительных систем с общей памятью, в настоящее время для обмена данными между процессорами обычно используются либо методы многопоточного программирования с помощью нитей ( threads ), либо директивы OpenMP [1.6-1.13]. Директивы OpenMP являются специальными директивами для компиляторов. Они создают и организуют выполнение параллельных процессов (нитей), а также обмен данными между процессами. Отметим также, что обмен данными между процессами в многопроцессорных вычислительных системах с общей памятью может осуществляться и с применением функций MPI и SHMEM.

В конце 2005 года компания Intel объявила о создании приложения Cluster OpenMP для компьютеров с процессорами собственного производства. Cluster OpenMP реализует расширение OpenMP , позволяет объявлять области данных доступными всем узлам кластера и тем самым распространяет методы OpenMP на создание параллельных программ для параллельных вычислительных систем с разделенной памятью. Это средство обладает рядом преимуществ по сравнению с MPI , главным из которых является простота разработки программ для Cluster OpenMP , поскольку передача данных между узлами кластера происходит неявно, по протоколу Lazy Release Consistency. Отметим, что компания Intel не является изобретателем этого подхода — ранее такие попытки предпринимались в Японии (см., например, [1.14]) и некоторых других странах).

Основными алгоритмическими языками параллельного программирования с использованием OpenMP в настоящее время являются Fortran и C/C++. Существуют многочисленные версии компиляторов, разработанные различными производителями программного обеспечения, позволяющие быстро и легко организовать параллельные вычисления с помощью методов OpenMP . Обычно директивы распараллеливания OpenMP применяются для распараллеливания последовательных программ. При этом последовательные программы не теряют своей работоспособности. Вернуться к последовательной версии очень просто: достаточно просто убрать опцию — openmp в вызове компилятора при компиляции программы.

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

В настоящее время на рынке программного обеспечения представлен достаточно широкий спектр коммерческих программных продуктов для автоматического распараллеливания. Как правило, эти системы состоят из графических средств представления параллельных программ, препроцессоров для генерации программ на языках Fortran (77, 90, 95) и C/С++, специализированных трассировщиков и отладчиков, а также средств визуализации.

Компания Intel разрабатывает не только процессоры для параллельных вычислительных систем, но и целый спектр инструментов для отладки, оптимизации и настройки эффективной работы параллельных программ. В настоящее время в компании разработаны компиляторы Fortran и C/C++ с возможностями создания параллельных программ средствами OpenMP на платформах Linux и Windows , а также средства анализа производительности программ VTune Performance Analyzer и Intel Thread Checker , позволяющие находить критические секции в многопоточных программах и существенно ускорять их выполнение. Кроме того, разработаны библиотеки стандартных функций Intel Math Kernel Library , Intel Cluster Math Kernel Library и Intel Integrated Performance Primitives, позволяющие существенно ускорить работу параллельных программ по обработке как числовой, так и графической информации. В конце 2005 года компания анонсировала появление продукта Intel Cluster OpenMP , позволяющего распространить технологии OpenMP на кластерные системы с разделенной памятью.

При отладке параллельных программ также используется целый ряд специализированных отладчиков. Среди них отметим:

  • idb — символический отладчик, разработанный корпорацией Intel. Поставляется вместе с компиляторами. Поддерживает отладку программ, написанных на алгоритмических языках Fortran и C/C++;
  • gdb — свободно распространяемый отладчик GNU. Поддерживает отладку программ, написанных на алгоритмических языках C/C++ и Modula-2, а также на алгоритмическом языке Fortran 95 при установке дополнительного модуля gdb95;
  • ddd — графический интерфейс к отладчику gdb и некоторым другим отладчикам;
  • TotalView — лицензионный графический отладчик для отладки приложений в средах OpenMP и MPI.

Источник: intuit.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru