Главная » Все файлы » Просмотр файлов из архивов » PDF-файлы » Параллельное программирование с использованием OpenMP. Антонов (2009)

Параллельное программирование с использованием OpenMP. Антонов (2009) (Параллельное программирование с использованием OpenMP. Антонов (2009).pdf), страница 6

PDF-файл Параллельное программирование с использованием OpenMP. Антонов (2009) (Параллельное программирование с использованием OpenMP. Антонов (2009).pdf), страница 6 Суперкомпьютерное моделирование и технологии (63866): Книга - 11 семестр (3 семестр магистратуры)Параллельное программирование с использованием OpenMP. Антонов (2009) (Параллельное программирование с использованием OpenMP. Антонов (2009).pdf) - PD2020-08-25СтудИзба

Описание файла

PDF-файл из архива "Параллельное программирование с использованием OpenMP. Антонов (2009).pdf", который расположен в категории "". Всё это находится в предмете "суперкомпьютерное моделирование и технологии" из 11 семестр (3 семестр магистратуры), которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст 6 страницы из PDF

Если налокальные копии ссылаются в разных параллельных областях, то для сохранения их значений необходимо, чтобы не было объемлющих параллельныхобластей, количество нитей в обеих областях совпадало, а переменнаяOMP_DYNAMIC была установлена в false с начала первой области до началавторой. Переменные, объявленные как threadprivate, не могут использоваться в опциях директив OpenMP, кроме copyin, copyprivate, schedule,num_threads, if.Пример 15 демонстрирует использование директивы threadprivate.

Глобальная переменная n объявлена как threadprivate переменная. Значениепеременной n выводится в четырёх разных местах. Первый раз все нити выведут значение своей копии переменной n в начале параллельной области, иэто значение будет равно 1 на нити-мастере и 0 на остальных нитях. Далее спомощью функции omp_get_thread_num() все нити присвоят переменной nсвой порядковый номер и выведут это значение.

Затем в последовательнойобласти будет ещё раз выведено значение переменной n, которое окажетсяравным порядковому номеру нити-мастера, то есть 0. В последний раз значение переменной n выводится в новой параллельной области, причём значениекаждой локальной копии должно сохраниться.33#include <stdio.h>#include <omp.h>int n;#pragma omp threadprivate(n)int main(int argc, char *argv[]){int num;n=1;#pragma omp parallel private (num){num=omp_get_thread_num();printf("Значение n на нити %d (на входе): %d\n", num, n);/* Присвоим переменной n номер текущей нити */n=omp_get_thread_num();printf("Значение n на нити %d (на выходе): %d\n", num, n);}printf("Значение n (середина): %d\n", n);#pragma omp parallel private (num){num=omp_get_thread_num();printf("Значение n на нити %d (ещё раз): %d\n", num, n);}}Пример 15a. Директива threadprivate на языке Си.program example15binclude "omp_lib.h"common/nnn/ninteger n, num;!$omp threadprivate(/nnn/)n=1;!$omp parallel private (num)num=omp_get_thread_num()print *, "Значение n на нити ", num, " (на входе): ", nC Присвоим переменной n номер текущей нитиn=omp_get_thread_num();print *, "Значение n на нити ", num, " (на выходе): ", n!$omp end parallelprint *, "Значение n (середина): ", n!$omp parallel private (num)num=omp_get_thread_num()print *, "Значение n на нити ", num, " (ещё раз): ", n!$omp end parallelendПример 15b.

Директива threadprivate на языке Фортран.Если необходимо переменную, объявленную как threadprivate, инициализировать значением размножаемой переменной из нити-мастера, то на входев параллельную область можно использовать опцию copyin. Если значениелокальной переменной или переменной, объявленной как threadprivate,необходимо переслать от одной нити всем, работающим в данной параллель34ной области, для этого можно использовать опцию copyprivate директивыsingle.Пример 16 демонстрирует использование опции copyin. Глобальная переменная n определена как threadprivate. Применение опции copyin позволяет инициализировать локальные копии переменной n начальным значением нити-мастера.

Все нити выведут значение n, равное 1.#include <stdio.h>int n;#pragma omp threadprivate(n)int main(int argc, char *argv[]){n=1;#pragma omp parallel copyin(n){printf("Значение n: %d\n", n);}}Пример 16a. Опция copyin на языке Си.program example16bcommon/nnn/ninteger n!$omp threadprivate(/nnn/)n=1;!$omp parallel copyin(n)print *, "Значение n: ", n!$omp end parallelendПример 16b. Опция copyin на языке Фортран.Задания• Может ли одна и та же переменная выступать в одной части программы как общая, а в другой части – как локальная?• Что произойдёт, если несколько нитей одновременно обратятся к общей переменной?• Может ли произойти конфликт, если несколько нитей одновременнообратятся к одной и той же локальной переменной?• Каким образом при входе в параллельную область разослать всем порождаемым нитям значение некоторой переменной?• Можно ли сохранить значения локальных копий общих переменныхпосле завершения параллельной области? Если да, то что необходимодля их использования?• В чём отличие опции copyin от опции firstprivate?35Распределение работыOpenMP предлагает несколько вариантов распределения работы между запущенными нитями.

Конструкции распределения работ в OpenMP не порождают новых нитей.Низкоуровневое распараллеливаниеВсе нити в параллельной области нумеруются последовательными целымичислами от 0 до N-1, где N — количество нитей, выполняющих данную область.Можно программировать на самом низком уровне, распределяя работу с помощью функций omp_get_thread_num() и omp_get_num_threads(), возвращающих номер нити и общее количество порождённых нитей в текущейпараллельной области, соответственно.Вызов функции omp_get_thread_num() позволяет нити получить свой уникальный номер в текущей параллельной области.Си:int omp_get_thread_num(void);Фортран:integer function omp_get_thread_num()Вызов функции omp_get_num_threads() позволяет нити получить количество нитей в текущей параллельной области.Си:int omp_get_num_threads(void);Фортран:integer function omp_get_num_threads()Пример 17 демонстрирует работу функций omp_get_num_threads() иomp_get_thread_num().

Нить, порядковый номер которой равен 0, напечатает общее количество порождённых нитей, а остальные нити напечатаютсвой порядковый номер.36#include <stdio.h>#include <omp.h>int main(int argc, char *argv[]){int count, num;#pragma omp parallel{count=omp_get_num_threads();num=omp_get_thread_num();if (num == 0) printf("Всего нитей: %d\n", count);else printf("Нить номер %d\n", num);}}Пример 17a. Функции omp_get_num_threads() и omp_get_thread_num() на языке Си.program example17binclude "omp_lib.h"integer count, num!$omp parallelcount=omp_get_num_threads()num=omp_get_thread_num()if (num .eq.

0) thenprint *, "Всего нитей: ", countelseprint *, "Нить номер ", numend if!$omp end parallelendПример 17b. Функции omp_get_num_threads() и omp_get_thread_num() на языке Фортран.Использование функций omp_get_thread_num() и omp_get_num_threads()позволяет назначать каждой нити свой кусок кода для выполнения, и такимобразом распределять работу между нитями в стиле технологии MPI [8]. Однако использование этого стиля программирования в OpenMP далеко не всегда оправдано – программист в этом случае должен явно организовыватьсинхронизацию доступа к общим данным. Другие способы распределенияработ в OpenMP обеспечивают значительную часть этой работы автоматически.Параллельные циклыЕсли в параллельной области встретился оператор цикла, то, согласно общему правилу, он будет выполнен всеми нитями текущей группы, то есть каждая нить выполнит все итерации данного цикла.

Для распределения итерацийцикла между различными нитями можно использовать директиву for (do... [end do]).37Си:#pragma omp for [опция [[,] опция]...]Фортран:!$omp do [опция [[,] опция]...]<блок циклов do>[!$omp end do [nowait]]Эта директива относится к идущему следом за данной директивой блоку,включающему операторы for (do).Возможные опции:private(список) – задаёт список переменных, для которых порожда-ется локальная копия в каждой нити; начальное значение локальныхкопий переменных из списка не определено;firstprivate(список) – задаёт список переменных, для которых по-рождается локальная копия в каждой нити; локальные копии переменных инициализируются значениями этих переменных в нити-мастере;lastprivate(список) – переменным, перечисленным в списке, при-сваивается результат с последнего витка цикла;reduction(оператор:список) – задаёт оператор и список общих пе-ременных; для каждой переменной создаются локальные копии в каждой нити; локальные копии инициализируются соответственно типуоператора (для аддитивных операций – 0 или его аналоги, для мультипликативных операций – 1 или её аналоги); над локальными копиямипеременных после завершения всех итераций цикла выполняется заданный оператор; оператор это: для языка Си – +, *, -, &, |, ^, &&, ||,для языка Фортран – +, *, -, .and., .or., .eqv., .neqv., max, min,iand, ior, ieor; порядок выполнения операторов не определён, поэтому результат может отличаться от запуска к запуску;schedule(type[, chunk]) – опция задаёт, каким образом итерациицикла распределяются между нитями;collapse(n) — опция указывает, что n последовательных тесновло-женных циклов ассоциируется с данной директивой; для циклов образуется общее пространство итераций, которое делится между нитями;если опция collapse не задана, то директива относится только к одному непосредственно следующему за ней циклу;38ordered – опция, говорящая о том, что в цикле могут встречаться директивы ordered; в этом случае определяется блок внутри тела цикла,который должен выполняться в том порядке, в котором итерации идутв последовательном цикле;nowait – в конце параллельного цикла происходит неявная барьернаясинхронизация параллельно работающих нитей: их дальнейшее выполнение происходит только тогда, когда все они достигнут данной точки;если в подобной задержке нет необходимости, опция nowait позволяетнитям, уже дошедшим до конца цикла, продолжить выполнение безсинхронизации с остальными.

Если директива end do в явном виде неуказана, то в конце параллельного цикла синхронизация все равно будет выполнена.Если в программе на языке Фортран не указывается директива end do, то онапредполагается в конце цикла do.На вид параллельных циклов накладываются достаточно жёсткие ограничения. В частности, предполагается, что корректная программа не должна зависеть от того, какая именно нить какую итерацию параллельного цикла выполнит. Нельзя использовать побочный выход из параллельного цикла.Размер блока итераций, указанный в опции schedule, не должен изменятьсяв рамках цикла.Формат параллельных циклов на языке Си упрощённо можно представитьследующим образом:for([целочисленный тип] i = инвариант цикла;i {<,>,=,<=,>=} инвариант цикла;i {+,-}= инвариант цикла)Эти требования введены для того, чтобы OpenMP мог при входе в цикл точноопределить число итераций.Если директива параллельного выполнения стоит перед гнездом циклов, завершающихся одним оператором, то директива действует только на самыйвнешний цикл.Итеративная переменная распределяемого цикла по смыслу должна быть локальной, поэтому в случае, если она специфицирована общей, то она неявноделается локальной при входе в цикл.

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5193
Авторов
на СтудИзбе
434
Средний доход
с одного платного файла
Обучение Подробнее