Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
*Паралл прогр-исполнение программного кода несколькими вычислителями(код единый).
Разделяется на системы с общей памятью и распределенной памятью(массивно-параллельные системы) также сущ гибрид NUMA неоднородный доступ к памяти.
Система с распеределенной памятью-сборник однотипных вычислительных узлов.(на каждом сетевой кабель,память и др устройства)-кластеры MPI, PVM.Обмен между узлами осуществляется через сеть.Процессоры видят только свою ОП-напрямую к памяти др процессоров обратиться нельзя
Системы с общей памятью-процессоры остаются на узлах,однако память общая и обращение к ней идет через спец шину к общей памяти суперкомьютера Open MP,treds потоки.Любой процессор может адресовать любое адресное пространство всего кластера.любой процессор имеет доступ к любой ячейке.
Недостатки:немаштабируемость,создание общей памяти намного сложнее,обеспечение конкретностей КЭШей.
Гибридные-на физ уровне-это система с распределенной памятью(кластер),на логическом уровне(интерфейс)-система с общей памятью.Проблемы организации памяти скрыты от программиста.Аппаратура сама осуществляет доступ к памяти
OpenMP (Open Multi-Processing) открытый стандарт для распараллеливания программ на языках Си, Си++ и Фортран. Описывает совокупность директив компилятора, библиотечныхпроцедур и переменных окружения, которые предназначены для программирования многопоточных приложений на многопроцессорных системах с общей памятью.Технология фирмы Intel.
Топологии:
*Директивы:
#pragma omp parallel [раздел[ [,] раздел]...]
структурированный блок
Эта директива сообщает компилятору, что структурированный блок кода должен быть выполнен параллельно, в нескольких потоках. Каждый поток будет выполнять один и тот же поток команд, но не один и тот же набор команд все зависит от операторов, управляющих логикой программы, таких как if-else.
#pragma omp for опция[[[,] опция] ... ]цикл
for
Каждая нить выполнит все итерации цикла
#pragma omp single опция[ [[,] опция]...]структурированный
блок
Если в параллельной секции какой нибудь участок кода должен быть выполнен единажды
#pragma omp sections опция[[[,] опция] ...]
{
#pragma omp section структурированный
блок
#pragma omp section структурированный
блок
...
}
Создается группа потоков и распределяется между ними обработка итераций цикла,после выполнения которых потоки начинают обработку оставшихся разделов кода.Если кол-во разделов кода будет больше числа потоков,то обработка нескольких разделов будет отложена до тех пор пока не появятся свободные потоки
#pragma omp master
Выделяется участок кода,который будет выполнен.Все остальные потоки это игнорируют
#pragma omp critical имя[()]структурированный
блок
Критическая секция программы.Определяется код,который может выполняться в любой момнт времени только одним потоком
#pragma omp barrier
Дает всем потокам указание ждать друг друга ,перед тем как они продолжат выполнение за барьером.
#pragma omp atomic структурированный
блок
Частный случай критической ситуации.Директива относится к идущему непосредственно за ней оператору присваивания.На время выполнения доступ к этой переменной блокируется для всех остальных потоков.
#pragma omp ordered структурированный
блок
Определяет блок внутри цикла,который должен выполняться в том порядке,в котором идут итерации в цикле.
#pragma omp task опция[[[,] опция] ...]структурированный
блок
Для отдельной,независимой задачи
#pragma omp flash (список переменных)
Синхронизация(установление зн-я)общей переменной
#pragma omp copy m взять из главного потока
#pragma omp copyprivate сделать переменные общими
*Параметры деректив:
SHARED
Применяется к переменным, которые необходимо сделать общими. Директивы:parallel
PRIVATE
Применяется к переменным, которые необходимо сделать приватными. При входе в параллельную область для каждой нити создается отдельный экземпляр переменной, который не имеет никакой связи с оригинальной переменной вне параллельной области. Директивы: parallel, for, sections, single
THREADPRIVATE
Применяется к COMMON-блокам, которые необходимо сделать приватными. Директива должна применяться после каждой декларации COMMON-блока.
FIRSTPRIVATE
Приватные копии переменной при входе в параллельную область инициализируются значением оригинальной переменной.
LASTPRIVATE
По окончании параллельно цикла или блока параллельных секций, нить, которая выполнила последнюю итерацию цикла или последнюю секцию блока, обновляет значение оригинальной переменной.
REDUCTION(+:A)
Обозначает переменную, с которой в цикле производится reduction-операция (например, суммирование). При выходе из цикла, данная операция производится над копиями переменной во всех нитях, и результат присваивается оригинальной переменной. Директивы: parallel, for, sections
COPYIN
Применяется к COMMON-блокам, которые помечены как THREADPRIVATE. При входе в параллельную область приватные копии этих данных инициализируются оригинальными значениями.
DEFAULT Параметр для установки правила по умолчанию на использование переменных в потоках.
IF Параметр для задания условия, только при выполнении которого осуществляется создание параллельного фрагмента. Директивы: parallel
Num_treads Параметр для задания количества создаваемых потоков в параллельной области. Директивы:parallel
Режимы:
OMP-DYNAMIC разрешает среде менять количество потоков
OMP_NESTED способ обрабатывания паралл потокв(вкл-множатся,выкл-нет)
OMP_NUM_THREADS количество потоков по умолчанию
OMP_SHEDULE Переменная для задания способа управления распределением итераций распараллеливаемого цикла между потоками. Значение по умолчанию: static
*Функции:
void omp_set_num_threads (int num_threads); |
Установить количество создаваемых потоков |
int omp_get_max_threads (void); |
Получение максимально возможного количества потоков |
int omp_get_num_threads (void); |
Получение количества потоков в параллельной области программы |
int omp_get_thread_num (void); |
Получение номера потока |
int omp_get_num_procs (void); |
Получение числа вычислительных элементов (процессоров или ядер), доступных приложению |
void omp_set_dynamic (int dynamic); |
Установить режим динамического создания потоков |
int omp_get_dynamic (void); |
Получение состояние динамического режима |
void omp_set_nested (int nested); |
Установить режим поддержки вложенных параллельных фрагментов |
int omp_get_nested (void); |
Получения состояние режима поддержки вложенных параллельных фрагментов |
void omp_init_lock (omp_lock_t *lock); |
Инициализировать замок |
void omp_set_lock (omp_lock_t &lock); |
Установить замок |
void omp_unset_lock (omp_lock_t &lock); |
Освободить замок |
int omp_test_lock (omp_lock_t &lock); |
Установить замок без блокировки |
void omp_destroy_lock (omp_lock_t &lock); |
Перевод замка в неинициализированное состояние.ожидание потоков |
double omp_get_wtime (void); |
Получение времени текущего момента выполнения программы |
double omp_get_wtick (void); |
Получение времени в секундах между двумя последовательными показателями времени аппаратного таймера |
int omp_in_parallel (void); |
Проверка нахождения программы в параллельном фрагменте |
*Причины недостатка производительности || программ
1.недооценка трудоемкости организации || цикла2.неэффективность обработки малых объемов программ3.несбалансированность потоков4.переизбыток общих переменных5.ограниченный объем кэш-памяти
Иерархия памяти (сверху вниз)регистры процессора,кэш 1 уровень,кэш 2 уровень,кэш 3 уровень,своя память,удаленная память(Чем выше в уровне иерархии тем выше скорость доступа).Объем дост на каждом уровне все меньше и меньше
Автоматическое распараллеливание работает только для циклов
Эффективность-ускорение\кол во потоков .Функция от числа потоков и размера задач .Э[0,1]Ускорение-отношение времени работы послед прогр-я ко времени работы параллельного прогр-яМасштабируемость-характер зависимости ускорения или эффективности от кол-ва потоков