Главная » Просмотр файлов » Спец часть (часть 3) (3 поток) (2015) (by Кибитова)

Спец часть (часть 3) (3 поток) (2015) (by Кибитова) (1161603), страница 47

Файл №1161603 Спец часть (часть 3) (3 поток) (2015) (by Кибитова) (Ответы на спец часть) 47 страницаСпец часть (часть 3) (3 поток) (2015) (by Кибитова) (1161603) страница 472019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 47)

220В параллельных регионах часто встречаются блоки кода, доступ к которым желательнопредоставлять только одному потоку, – например, блоки кода, отвечающие за запись данных вфайл. Во многих таких ситуациях не имеет значения, какой поток выполнит код, важно лишь,чтобы этот поток был единственным. Для этого в OpenMP служит директива single. l. 222Какая именно нить будет выполнять выделенный участок программы, не специфицируется. Однанить будет выполнять данный фрагмент, а все остальные нити будут ожидать завершения еёработы, если только не указана опция nowait. l. 224Следующий пример иллюстрирует применение опции copyprivate. В данном примере переменная nобъявлена в параллельной области как локальная. Каждая нить присвоит переменной n значение,равное своему порядковому номеру, и напечатает данное значение.

В области single одна из нитейприсвоит переменной n значение 100, и на выходе из области это значение будет присвоенопеременной n на всех нитях. В конце параллельной области значение n печатается ещё раз и на всехнитях оно равно 100. l. 226#include <stdio.h>#include <omp.h>int main(int argc, char *argv[]){int n;#pragma omp parallel private(n){n = omp_get_thread_num();printf("Значение n начало(): %d\n", n);#pragma omp single copyprivate(n){n = 100;}printf("Значение n конец(): %d\n", n);}}l.

249Ограничения для директивы single следующие:• Опция copyprivate не должна использоваться вместе с опцией nowait;• Только одна опция nowait может быть использована в директиве single;• Исключение брошенное в области single должно быть обработанно в рамках одной областиsingle, одной и той же нитью.l. 257Директива sectionsl. 259Директива sections используется для задания конечного (неитеративного) параллелизма. Директиваsections содержит набор структурированных блоков, которые распределяются по потокам в группе.Каждый структурированный блок исполняется один раз одним из потоков в группе. l. 261#pragma omp sections опция[[[,] опция] ...]{#pragma omp sectionструктурированныйблок#pragma omp sectionструктурированныйблок...}l.

272При выполнении этого кода OpenMP сначала создает группу потоков, а затем распределяет междуними обработку итераций цикла, после выполнения которого потоки начинают параллельнуюобработку оставшихся разделов кода. Если количество разделов программного кода будет большечисла потоков, обработка нескольких разделов будет отложена до тех пор, пока не появятсясвободные потоки.

В отличие от планирования циклов, распределение нагрузки между потокамипри обработке параллельных разделов кода осуществляется и контролируется OpenMP.Программисту остается только выбрать, какие переменные будут общими, а какие –индивидуальными, и предусмотреть выражения уменьшения аналогично сегменту с организациейциклов. l. 274Возможные опции:• private (список) – задаёт список переменных, для которых порождается локальная копия вкаждой нити; начальное значение локальных копий переменных из списка не определено;• firstprivate (список) – задаёт список переменных, для которых порождается локальнаякопия в каждой нити; локальные копии переменных инициализируются значениями этихпеременных в нити-мастере;• lastprivate (список) – переменным, перечисленным в списке, присваивается результат,полученный в последней секции;• reduction (оператор:список) – задаёт оператор и список общих переменных; для каждойпеременной создаются локальные копии в каждой нити; локальные копииинициализируются соответственно типу оператора (для аддитивных операций – 0 или егоаналоги, для мультипликативных операций – 1 или её аналоги); над локальными копиямипеременных после завершения всех секций выполняется заданный оператор; оператор это:+, *, -, &, |, ^, &&, ||; порядок выполнения операторов не определён, поэтомурезультат может отличаться от запуска к запуску;• nowait – в конце блока секций происходит неявная барьерная синхронизация параллельноработающих нитей: их дальнейшее выполнение происходит только тогда, когда все онидостигнут данной точки; если в подобной задержке нет необходимости, опция nowaitпозволяет нитям, уже дошедшим до конца своих секций, продолжить выполнение безсинхронизации с остальными.l.

283Директива section задаёт участок кода внутри секции sections для выполнения одной нитью. l. 285#pragma omp sectionl. 289Перед первым участком кода в блоке sections директива section не обязательна. Какие именно нитибудут задействованы для выполнения какой секции, не специфицируется. Если количество нитейбольше количества секций, то часть нитей для выполнения данного блока секций не будетзадействована. Если количество нитей меньше количества секций, то некоторым (или всем) нитямдостанется более одной секции. l. 291Следующий пример демонстрирует использование опции lastprivate.

В данном примере опцияlastprivate используется вместе с директивой sections. Переменная n объявлена как lastprivateпеременная. Три нити, выполняющие секции section, присваивают своей локальной копии n разныезначения. По выходе из области sections значение n из последней секции присваивается локальнымкопиям во всех нитях, поэтому все нити напечатают число 3. Это же значение сохранится дляпеременной n и в последовательной области. l. 293#include <stdio.h>#include <omp.h>int main(int argc, char *argv[]){int n = 0;#pragma omp parallel{#pragma omp sections lastprivate(n){#pragma omp section{n = 1;}#pragma omp section{n = 2;}#pragma omp section{n = 3;}}printf("Значение n на нити %d: %d\n",omp_get_thread_num(), n);}printf("Значение n в последовательной области: %d\n", n);}l.

329Директива masterl. 331Директивы master выделяют участок кода, который будет выполнен только нитью-мастером.Остальные нити просто пропускают данный участок и продолжают работу с оператора,расположенного следом за ним. Неявной синхронизации данная директива не предполагает. l. 333#pragma omp masterl. 337Следующий пример демонстрирует применение директивы master. Переменная n являетсялокальной, то есть каждая нить работает со своим экземпляром. Сначала все нити присвоятпеременной n значение 1.

Потом нить-мастер присвоит переменной n значение 2, и все нитинапечатают значение n. Затем нитьмастер присвоит переменной n значение 3, и снова все нитинапечатают значение n. Видно, что директиву master всегда выполняет одна и та же нить. В данномпримере все нити выведут значение 1, а нить-мастер сначала выведет значение 2, а потом - значение3. l. 339#include <stdio.h>int main(int argc, char *argv[]){int n;#pragma omp parallel private(n){n = 1;#pragma omp master{n = 2;}printf("Первое значение n: %d\n", n);#pragma omp barrier#pragma omp master{n = 3;}printf("Второе значение n: %d\n", n);}}l. 369Директива criticall.

371С помощью директив critical оформляется критическая секция программы. Критическая секциязапрещает одновременное исполнение структурированного блока более чем одним потоком. l. 373#pragma omp critical имя[()]структурированныйблокl. 378В каждый момент времени в критической секции может находиться не более одной нити. Есликритическая секция уже выполняется какой-либо нитью, то все другие нити, выполнившиедирективу для секции с данным именем, будут заблокированы, пока вошедшая нить не закончитвыполнение данной критической секции.

Как только работавшая нить выйдет из критическойсекции, одна из заблокированных на входе нитей войдет в неё. Если на входе в критическую секциюстояло несколько нитей, то случайным образом выбирается одна из них, а остальныезаблокированные нити продолжают ожидание. l. 380Все неименованные критические секции условно ассоциируются с одним и тем же именем. Всекритические секции, имеющие одно и тоже имя, рассматриваются единой секцией, даже еслинаходятся в разных параллельных областях. Побочные входы и выходы из критической секциизапрещены. l.

382Следующий пример иллюстрирует применение директивы critical. Переменная n объявлена внепараллельной области, поэтому по умолчанию является общей. Критическая секция позволяетразграничить доступ к переменной n. Каждая нить по очереди присвоит n свой номер и затемнапечатает полученное значение. l. 384#include <stdio.h>#include <omp.h>int main(int argc, char *argv[]){int n;#pragma omp parallel{#pragma omp critical{n = omp_get_thread_num();printf("Нить %d\n", n);}}}l. 402Если бы в примере не была указана директива critical, результат выполнения программы был бынепредсказуем.

С директивой critical порядок вывода результатов может быть произвольным, ноэто всегда будет набор одних и тех же чисел от 0 до OMP_NUM_THREADS-1. Конечно, подобногоже результата можно было бы добиться другими способами, например, объявив переменную nлокальной, тогда каждая нить работала бы со своей копией этой переменной. Однако в исполненииэтих фрагментов разница существенная. l. 404Если есть критическая секция, то в каждый момент времени фрагмент будет обрабатываться лишькакой-либо одной нитью. Остальные нити, даже если они уже подошли к данной точке программыи готовы к работе, будут ожидать своей очереди.

Если критической секции нет, то все нити могутодновременно выполнить данный участок кода. С одной стороны, критические секциипредоставляют удобный механизм для работы с общими переменными. Но с другой стороны,пользоваться им нужно осмотрительно, поскольку критические секции добавляютпоследовательные участки кода в параллельную программу, что может снизить её эффективность.l. 406Директива barrierl. 408Самый распространенный способ синхронизации в OpenMP – барьер. Он оформляется с помощьюдирективы barrier. Директива barrier дает всем потокам указание ожидать друг друга перед тем, какони продолжат выполнение за барьером. l. 410#pragma omp barrierl. 414Нити, выполняющие текущую параллельную область, дойдя до этой директивы, останавливаются иждут, пока все нити не дойдут до этой точки программы, после чего разблокируются и продолжаютработать дальше.

Характеристики

Тип файла
PDF-файл
Размер
17,52 Mb
Высшее учебное заведение

Список файлов ответов (шпаргалок)

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