Параллельное программирование с использованием технологии OpenMP Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Лекция 2 Томский политехнический университет
Функция для работы с системным таймером Функция omp_get_wtime() возвращает в вызвавшей нити астрономическое время в секундах (вещественное число двойной точности), прошедшее с некоторого момента в прошлом. Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 2 double start_time, end_time; int a[30]; omp_set_num_threads(2); start_time = omp_get_wtime(); #pragma omp parallel { #pragma omp for for(int i = 0; i
Модель памяти OpenMP Параллельное программирование с использованием технологии OpenMP Аксёнов С.В Нить 001 Нить 001 Нить
Использование статических переменных. Директива threadprivate() Директива threadprivate() может позволить сделать локальные копии для статических переменных языка Си, которые по умолчанию являются общими. Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 4 int n; #pragma omp threadprivate(n) void main() { n=5; int num; omp_set_num_threads(2); #pragma omp parallel private (num) { num=omp_get_thread_num(); cout
Директива copyin() Применение опции copyin позволяет инициализировать локальные копии переменной n начальным значением нити-мастера. Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 5 int n; #pragma omp threadprivate(n) void main() { n=1; int num; omp_set_num_threads(2); #pragma omp parallel private (num) copyin(n) { num=omp_get_thread_num(); cout
Вложенные циклы Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 6 Параллельные области Функция omp_set_nested(int) разрешает или запрещает вложенный параллелизм. Аргумент: 0 - выключение вложенного параллелизма, 1 – включение вложенного параллелизма
Пример: Вложенные циклы Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 7 int n; omp_set_nested(1); omp_set_num_threads(3); #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp parallel { printf("Часть1, Поток %d - %d\n", n, omp_get_thread_num()); } omp_set_nested(0); #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp parallel { printf("Часть 2, Поток %d - %d\n", n, omp_get_thread_num()); }
Диспетчеризация циклов Ч.1 Опция schedule(type[, chunk]) задаёт, каким образом итерации цикла распределяются между нитями; Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 8 В опции schedule параметр type задаёт следующий тип распределения ите- раций: static – блочно-циклическое распределение итераций цикла; размер блока – chunk. Первый блок из chunk итераций выполняет нулевая нить, второй блок следующая и т.д. до последней нити, затем рас- пределение снова начинается с нулевой нити. dynamic – динамическое распределение итераций с фиксированным размером блока: сначала каждая нить получает chunk итераций (по умолчанию chunk=1), та нить, которая заканчивает выполнение своей порции итераций, получает первую свободную порцию из chunk ите- раций.
Диспетчеризация циклов Ч.2 Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 9 guided – динамическое распределение итераций, при котором размер порции уменьшается с некоторого начального значения до величины chunk (по умолчанию chunk=1) пропорционально количеству ещё не распределённых итераций, делённому на количество нитей, выпол- няющих цикл. runtime – способ распределения итераций выбирается во время работы программы по значению переменной среды OMP_SCHEDULE. Параметр chunk при этом не задаётся.
Пример: Диспетчеризация циклов Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 10 omp_set_num_threads(3); int A[100], B[100], C[100], i, n; for (i=0; i
Пример: распределение итераций по циклам Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 11
Распределение итераций по нитям для static(6) Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 12
Распределение итераций по нитям для dynamic(6) Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 13
Распределение итераций по нитям для guided(6) Параллельное программирование с использованием технологии OpenMP Аксёнов С.В. 14