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

Выравнивание нагрузки (load balancing): как проектировать программы для максимально равномерной загрузки вычислительных ядер/узлов.

schedule(type[, chunk])– опция задаёт, каким образом итерации цикла распределяются между нитями;

В опции schedule параметр type задаёт следующий тип распределения итераций:

• static– блочно-циклическое распределение итераций цикла; размер блока– chunk. Первый блок из chunk итераций выполняет нулевая нить, второй блок— следующая и т.д. до последней нити, затем распределение снова начинается с нулевой нити. Если значение chunk не указано, то всё множество итераций делится на непрерывные куски примерно одинакового размера(конкретный способ зависит от реализации), и полученные порции итераций распределяются между нитями.

• dynamic– динамическое распределение итераций с фиксированным размером блока: сначала каждая нить получает chunk итераций(по умолчанию chunk=1), та нить, которая заканчивает выполнение своей порции итераций, получает первую свободную порцию из chunk итераций. Освободившиеся нити получают новые порции итераций до тех пор, пока все порции не будут исчерпаны. Последняя порция может содержать меньше итераций, чем все остальные.

• guided– динамическое распределение итераций, при котором размер порции уменьшается с некоторого начального значения до величины chunk(по умолчанию chunk=1) пропорционально количеству ещё не распределённых итераций, делённому на количество нитей, выполняющих цикл. Размер первоначально выделяемого блока зависит от реализации. В ряде случаев такое распределение позволяет аккуратнее разделить работу и сбалансировать загрузку нитей. Количество итераций в последней порции может оказаться меньше значения chunk.

• auto– способ распределения итераций выбирается компилятором

и/или системой выполнения. Параметр chunk при этом не задаётся.

• runtime– способ распределения итераций выбирается во время работы

программы по значению переменной среды OMP_SCHEDULE. Параметр chunk при этом не задаётся.

Синхронизация в OpenMp: поведение по умолчанию, директивы nowait, barrier.

Неявная синхронизация происходит в начале и конце любой конструкции parallel (до тех пор, пока не указана директива nowait).

Синхронизация типа barrier

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

Для задания синхронизации типа barrier в OpenMP в программах, написанных на языке C/C++, используется прагма:

#pragma omp barrier

Пример использования синхронизации типа barrier приведен во фрагменте программы (пример 3.3).

Отметим, что неявно синхронизация типа barrier по умолчанию устанавливается в конце циклов. Для ее отмены можно воспользоваться директивой OpenMP nowait.

#include <stdio.h>

#include <omp.h>

int main(int argc, char *argv[])

{

#pragma omp parallel

{

printf("Сообщение1\n");

printf("Сообщение2\n");

#pragma omp barrier

printf("Сообщение3\n");

}

}

Пример 3.3. Пример синхронизации типа barrier

Здесь же отметим, что на языке C/C++ определение директивы nowait выглядит так:

#pragma omp <оператор> nowait

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

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