47
параллельной
программы
желательно
выделять
такие
области
распараллеливания,
в
которых можно
организовать
выполнение
независимых параллельных потоков. Для обмена данными между
параллельными процессами (потоками) в OpenMP используются общие
переменные. При обращении к общим переменным в различных
параллельных потоках возможно возникновение конфликтных ситуаций
при доступе к данным. Для предотвращения конфликтов можно
воспользоваться процедурой синхронизации. При этом надо иметь в виду,
что процедура синхронизации - очень дорогая операция по временным
затратам и желательно по возможности избегать ее
или применять как
можно реже.
Выполнение параллельных потоков в параллельной области
программы начинается с их инициализации. Она заключается в создании
дескрипторов порождаемых потоков и копировании всех данных из
области данных главного потока в области данных создаваемых
параллельных
потоков.
После
порождения
потоки
нумеруются
последовательными натуральными числами, причем главный поток имеет
номер 0.
После завершения выполнения параллельных потоков управление
программой вновь передается главному потоку. При этом возникает
проблема корректной передачи данных от
параллельных потоков
главному. Здесь важную роль играет синхронизация завершения работы
параллельных потоков, поскольку в силу целого ряда обстоятельств время
выполнения даже одинаковых по трудоемкости параллельных потоков
непредсказуемо
(оно
определяется
как
историей
конкуренции
параллельных процессов, так и текущим состоянием вычислительной
системы). При выполнении операции синхронизации параллельные
потоки, уже завершившие свое выполнение,
простаивают и ожидают
завершения работы самого последнего потока. Естественно, при этом
неизбежна потеря эффективности работы параллельной программы.
Для того чтобы получить параллельную версию, сначала
необходимо определить ресурс параллелизма программы, то есть, найти в
ней участки, которые могут выполняться независимо разными нитями.
Если таких участков относительно немного, то для распараллеливания
чаще
всего
используются
конструкции,
задающие
конечный
(неитеративный) параллелизм.
Однако, как показывает практика, наибольший ресурс параллелизма
в
программах
сосредоточен
в
циклах.
Поэтому
наиболее
распространенным способом распараллеливания
является то или иное
распределение итераций циклов. Если между итерациями некоторого
цикла нет информационных зависимостей, то их можно каким-либо
48
способом раздать разным процессорам для одновременного исполнения.
Различные способы распределения итераций позволяют добиваться
максимально
равномерной
загрузки
нитей,
между
которыми
распределяются итерации цикла.
Статический способ распределения итераций позволяет уже в
момент написания программы точно определить,
какой нити достанутся
какие итерации. Однако он не учитывает текущей загруженности
процессоров, соотношения времён выполнения различных итераций и
некоторых других факторов. Эти факторы в той или иной степени
учитываются динамическими способами распределения итераций. Кроме
того, возможно отложить решение по способу распределения итераций на
время выполнения программы (например, выбирать его, исходя из
текущей загруженности нитей) или возложить выбор распределения на
компилятор и/или систему выполнения.
Обмен данными в OpenMP происходит через общие переменные.
Это приводит к необходимости разграничения
одновременного доступа
разных нитей к общим данным. Для этого предусмотрены достаточно
развитые средства синхронизации. При этом нужно учитывать, что
использование излишних синхронизаций может существенно замедлить
программу [3,11].
Программа, созданная с использованием технологии OpenMP, может
быть использована и в качестве последовательной программы. Таким
образом, нет необходимости поддерживать последовательную и
параллельную версии. Директивы OpenMP просто игнорируются
последовательным компилятором, а для
вызова функций OpenMP могут
быть подставлены специальные «заглушки» (stubs), текст которых
приведен в описании стандарта. Они гарантируют корректную работу
программы
в
последовательном
случае
–
нужно
только
перекомпилировать программу и подключить другую библиотеку.
Достарыңызбен бөлісу: