🗊 Презентация Синтаксис директивы parallel

Категория: Образование
Нажмите для полного просмотра!
Синтаксис директивы parallel, слайд №1 Синтаксис директивы parallel, слайд №2 Синтаксис директивы parallel, слайд №3 Синтаксис директивы parallel, слайд №4 Синтаксис директивы parallel, слайд №5 Синтаксис директивы parallel, слайд №6 Синтаксис директивы parallel, слайд №7 Синтаксис директивы parallel, слайд №8 Синтаксис директивы parallel, слайд №9 Синтаксис директивы parallel, слайд №10 Синтаксис директивы parallel, слайд №11 Синтаксис директивы parallel, слайд №12 Синтаксис директивы parallel, слайд №13 Синтаксис директивы parallel, слайд №14 Синтаксис директивы parallel, слайд №15 Синтаксис директивы parallel, слайд №16 Синтаксис директивы parallel, слайд №17 Синтаксис директивы parallel, слайд №18 Синтаксис директивы parallel, слайд №19 Синтаксис директивы parallel, слайд №20 Синтаксис директивы parallel, слайд №21 Синтаксис директивы parallel, слайд №22 Синтаксис директивы parallel, слайд №23 Синтаксис директивы parallel, слайд №24 Синтаксис директивы parallel, слайд №25 Синтаксис директивы parallel, слайд №26 Синтаксис директивы parallel, слайд №27 Синтаксис директивы parallel, слайд №28 Синтаксис директивы parallel, слайд №29 Синтаксис директивы parallel, слайд №30 Синтаксис директивы parallel, слайд №31 Синтаксис директивы parallel, слайд №32 Синтаксис директивы parallel, слайд №33 Синтаксис директивы parallel, слайд №34

Содержание

Вы можете ознакомиться и скачать презентацию на тему Синтаксис директивы parallel. Доклад-сообщение содержит 34 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Mypresentation Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

Слайды и текст этой презентации


Слайд 1


Синтаксис директивы parallel for #pragma omp parallel for[опции ...] newline { ...for ... } schedule (type [,chunk]) ordered private (list)...
Описание слайда:
Синтаксис директивы parallel for #pragma omp parallel for[опции ...] newline { ...for ... } schedule (type [,chunk]) ordered private (list) firstprivate (list) lastprivate (list) shared (list) reduction (operator: list) collapse (n) nowait

Слайд 2


Опция collapse collapse(n) — n последовательных тесновложенных циклов ассоциируется с данной директивой. Для циклов образуется общее пространство...
Описание слайда:
Опция collapse collapse(n) — n последовательных тесновложенных циклов ассоциируется с данной директивой. Для циклов образуется общее пространство итераций, которое делится между тредами. Если опция не задана, то директива относится только к одному - непосредственно следующему за ней циклу.

Слайд 3


Опция ordered Опция для указания о том, что в цикле могут встречаться директивы ordered. В этом случае определяется блок внутри тела цикла, который...
Описание слайда:
Опция ordered Опция для указания о том, что в цикле могут встречаться директивы ordered. В этом случае определяется блок внутри тела цикла, который должен выполняться в порядке, установленном в последовательном цикле

Слайд 4


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

Слайд 5


Пример #include #define CHUNKSIZE 100 #define N 1000 main () { int i, chunk; float a[N], b[N], c[N]; // Some initializations for (i=0; i < N; i++)...
Описание слайда:
Пример #include #define CHUNKSIZE 100 #define N 1000 main () { int i, chunk; float a[N], b[N], c[N]; // Some initializations for (i=0; i < N; i++) a[i] = b[i] = i * 1.0; chunk = CHUNKSIZE; #pragma omp parallel shared(a,b,c,chunk) private(i) { #pragma omp for schedule(dynamic,chunk) nowait for (i=0; i < N; i++) c[i] = a[i] + b[i]; } // end of parallel section }

Слайд 6


Заключение по распараллеливанию циклов При распараллеливании цикла надо убедиться в том, что итерации данного цикла не имеют информационных...
Описание слайда:
Заключение по распараллеливанию циклов При распараллеливании цикла надо убедиться в том, что итерации данного цикла не имеют информационных зависимостей. Если цикл не содержит зависимостей, его итерации можно выполнять в любом порядке, в том числе параллельно. Соблюдение этого требования компилятор не проверяет, вся ответственность - на программисте. Если дать указание компилятору распараллелить цикл, содержащий зависимости, результат работы программы может оказаться некорректным. Задание – подобрать пример такого цикла, проверить выполнение параллельной программы.

Слайд 7


Директива sections Используется для реализации функционального параллелизма. Эта директива определяет набор независимых секций кода, каждая из...
Описание слайда:
Директива sections Используется для реализации функционального параллелизма. Эта директива определяет набор независимых секций кода, каждая из которых выполняется своим тредом.

Слайд 8


Синтаксис директивы sections #pragma omp sections [опции ...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator:...
Описание слайда:
Синтаксис директивы sections #pragma omp sections [опции ...] newline private (list) firstprivate (list) lastprivate (list) reduction (operator: list) nowait { #pragma omp section newline structured_block //отдельный тред #pragma omp section newline structured_block //отдельный тред … }

Слайд 9


Пример int main() { int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp sections { #pragma omp section {...
Описание слайда:
Пример int main() { int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); #pragma omp sections { #pragma omp section { printf("section1, thread %d\n", n); } #pragma omp section { printf("section2, thread %d\n", n); } #pragma omp section { printf("section3, thread %d\n", n); } } printf("parallel region, thread %d\n", n); } }

Слайд 10


Особенности выполнения Перед первым участком кода в блоке sections директива section не обязательна. Какие треды будут выполнять какую секцию, не...
Описание слайда:
Особенности выполнения Перед первым участком кода в блоке sections директива section не обязательна. Какие треды будут выполнять какую секцию, не определено. Если число тредов больше количества секций, то часть тредов для выполнения данного блока секций не будет задействована. Если число тредов меньше количества секций, то некоторым тредам достанется более одной секции.

Слайд 11


Особенности выполнения Опция lastprivate определенно связана с последней section: int n=0; #pragma omp parallel { #pragma omp sections lastprivate(n)...
Описание слайда:
Особенности выполнения Опция lastprivate определенно связана с последней section: 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 on thread%d: %d\n", omp_get_thread_num(), n); } printf(«n out of parallel region: %d\n", n);

Слайд 12


Особенности выполнения Переменная n объявлена как lastprivate. Три треда, выполняющие секции section, присваивают своей локальным копиям n разные...
Описание слайда:
Особенности выполнения Переменная n объявлена как lastprivate. Три треда, выполняющие секции section, присваивают своей локальным копиям n разные значения. По выходе из области sections значение n из последней секции присваивается локальным копиям во всех тредах. Поэтому все треды напечатают число 3. Это же значение сохранится для переменной n и в последовательной области.

Слайд 13


Синхронизация С. – ожидание одних (выполняющихся тредов) другими (уже выполненными). С. действует в некоторых случаях (см. ранее for, sections) по...
Описание слайда:
Синхронизация С. – ожидание одних (выполняющихся тредов) другими (уже выполненными). С. действует в некоторых случаях (см. ранее for, sections) по умолчанию. Опция nowait отменяет ожидание. Самый распространенный способ синхронизации в OpenMP – барьер.

Слайд 14


Директива barrier Синтаксис директивы: #pragma omp barrier Треды, выполняющие текущую параллельную область, дойдя до этой директивы, останавливаются...
Описание слайда:
Директива barrier Синтаксис директивы: #pragma omp barrier Треды, выполняющие текущую параллельную область, дойдя до этой директивы, останавливаются и ждут, пока все треды не дойдут до этой точки программы, после чего разблокировываются и продолжают работать дальше.

Слайд 15


Пример – синхронизация печати #pragma omp parallel { printf("Message 1\n"); printf("Message 2\n"); #pragma omp barrier...
Описание слайда:
Пример – синхронизация печати #pragma omp parallel { printf("Message 1\n"); printf("Message 2\n"); #pragma omp barrier printf("Message 3\n"); } Выдачи разных тредов Message 1 и Message 2 могут появиться в произвольном порядке. Выдача Message 3 со всех тредов придёт строго после двух предыдущих выдач.

Слайд 16


Директива ordered Синтаксис директивы: #pragma omp ordered { ... } Директива определяет блок внутри параллельного цикла, который должен выполняться в...
Описание слайда:
Директива ordered Синтаксис директивы: #pragma omp ordered { ... } Директива определяет блок внутри параллельного цикла, который должен выполняться в том порядке, в котором итерации шли бы в последовательном цикле. Директива for должна содержать опцию ordered

Слайд 17


Особенности выполнения Для вложенных циклов выделенный блок операторов относится к самому внутреннему из циклов. Тред, выполняющий первую итерацию...
Описание слайда:
Особенности выполнения Для вложенных циклов выделенный блок операторов относится к самому внутреннему из циклов. Тред, выполняющий первую итерацию цикла, выполняет операции выделенного блока. Тред, выполняющий k-ую итерацию, должен сначала дождаться выполнения всех операций выделенного блока всеми тредами, выполняющими предыдущие итерации.

Слайд 18


Пример – синхронизация печати int i, n; omp_set_num_threads(4); #pragma omp parallel private (i, n) { n=omp_get_thread_num(); #pragma omp for ordered...
Описание слайда:
Пример – синхронизация печати int i, n; omp_set_num_threads(4); #pragma omp parallel private (i, n) { n=omp_get_thread_num(); #pragma omp for ordered for (i=0; i

Слайд 19


Пример – синхронизация печати В результате: первая выдача будет неупорядоченной, вторая идёт в порядке по возрастанию номера итерации.
Описание слайда:
Пример – синхронизация печати В результате: первая выдача будет неупорядоченной, вторая идёт в порядке по возрастанию номера итерации.

Слайд 20


Критические разделы В коде можно выделять критические разделы. С помощью критических разделов можно предотвратить одновременный доступ к одному...
Описание слайда:
Критические разделы В коде можно выделять критические разделы. С помощью критических разделов можно предотвратить одновременный доступ к одному сегменту кода (критическому разделу!) из нескольких тредов. Один тред получает доступ только тогда, когда другие не выполняют данный код.

Слайд 21


Директива critical Синтаксис директивы: #pragma omp critical [name] { ... }
Описание слайда:
Директива critical Синтаксис директивы: #pragma omp critical [name] { ... }

Слайд 22


Особенности выполнения В каждый момент времени критический раздел может выполнять не более одного треда. Если критический раздел уже выполняет...
Описание слайда:
Особенности выполнения В каждый момент времени критический раздел может выполнять не более одного треда. Если критический раздел уже выполняет какой-либо тред, то все другие треды будут заблокированы, пока вошедший тред не закончит выполнение. Как только работавший тред выйдет из критического раздела, один из заблокированных войдет в него. Если на входе в критический раздел стояло несколько тредов, то случайным образом выбирается один из них. Остальные заблокированные треды продолжают ожидание.

Слайд 23


Пример – корректная работа с общей переменной main() { int x; x = 0; #pragma omp parallel shared(x) { #pragma omp critical x = x + 1; } // end of...
Описание слайда:
Пример – корректная работа с общей переменной main() { int x; x = 0; #pragma omp parallel shared(x) { #pragma omp critical x = x + 1; } // end of parallel section }

Слайд 24


Директива single Блок выполняется единственным тредом Синтаксис директивы: #pragma omp single [опции ...] newline private (list) firstprivate (list)...
Описание слайда:
Директива single Блок выполняется единственным тредом Синтаксис директивы: #pragma omp single [опции ...] newline private (list) firstprivate (list) copyprivate (list) nowait { structured_block //единственный тред }

Слайд 25


Опция copyprivate После выполнения треда новые значения переменных списка будут доступны всем одноименным частным переменным (private и...
Описание слайда:
Опция copyprivate После выполнения треда новые значения переменных списка будут доступны всем одноименным частным переменным (private и firstprivate), описанным в начале параллельной области и используемым всеми её тредами. Опция не может использоваться совместно с опцией nowait. Переменные списка не могут быть перечислены в опциях private и firstprivate данной директивы single.

Слайд 26


Пример (copyprivate) int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); printf("n (start): %d\n", n); #pragma omp single...
Описание слайда:
Пример (copyprivate) int n; #pragma omp parallel private(n) { n=omp_get_thread_num(); printf("n (start): %d\n", n); #pragma omp single copyprivate(n) { n=100; } printf("n (finish): %d\n", n); } Каждый тред присвоит переменной n значение, равное своему номеру, и напечатает его. В области single один из тредов присвоит переменной n значение 100. На выходе из области это значение будет присвоено переменной n на всех тредах. В конце параллельной области значение n печатается ещё раз . На всех тредах n=100.

Слайд 27


Директива master Блок выполняется единственным master-тредом. Остальные треды пропускают блок и продолжают работу с оператора, расположенного за ним....
Описание слайда:
Директива master Блок выполняется единственным master-тредом. Остальные треды пропускают блок и продолжают работу с оператора, расположенного за ним. Неявной синхронизации директива не предполагает. Синтаксис директивы: #pragma omp master newline { structured_block //master-тред }

Слайд 28


Директива atomic Используется для корректного обновления общих переменных. Применяется к отдельному оператору типа присваивания. Синтаксис директивы:...
Описание слайда:
Директива atomic Используется для корректного обновления общих переменных. Применяется к отдельному оператору типа присваивания. Синтаксис директивы: #pragma omp atomic statement_expression

Слайд 29


statement_expression: statement_expression: x op= expr;//составное присваивание x = x op expr; x++; ++x; x--; --x; х – скалярная переменная, expr –...
Описание слайда:
statement_expression: statement_expression: x op= expr;//составное присваивание x = x op expr; x++; ++x; x--; --x; х – скалярная переменная, expr – скалярное выражение, в котором не присутствует переменная х. op - оператор: + * - / & ^ |

Слайд 30


Особенности выполнения На время выполнения оператора блокируется доступ к данной переменной всем запущенным в данный момент тредам, кроме треда,...
Описание слайда:
Особенности выполнения На время выполнения оператора блокируется доступ к данной переменной всем запущенным в данный момент тредам, кроме треда, выполняющего операцию. Атомарной является только работа с переменной в левой части оператора присваивания. Вычисления в правой части не обязаны быть атомарными

Слайд 31


Пример int count = 0; #pragma omp parallel { #pragma omp atomic count++; } printf("number of threads: %d\n", count); Чтобы предотвратить...
Описание слайда:
Пример int count = 0; #pragma omp parallel { #pragma omp atomic count++; } printf("number of threads: %d\n", count); Чтобы предотвратить одновременное изменение несколькими тредами значения переменной, стоящей в левой части оператора присваивания, используется директива atomic

Слайд 32


Директива flush Используется для согласования состояния памяти (консистентность). Синтаксис директивы: #pragma omp flush [(list)]
Описание слайда:
Директива flush Используется для согласования состояния памяти (консистентность). Синтаксис директивы: #pragma omp flush [(list)]

Слайд 33


Особенности выполнения Значения всех переменных (или переменных из списка), временно хранящиеся в регистрах и кэш-памяти текущего треда, будут...
Описание слайда:
Особенности выполнения Значения всех переменных (или переменных из списка), временно хранящиеся в регистрах и кэш-памяти текущего треда, будут занесены в основную память. Все изменения переменных, сделанные тредом во время работы, станут видимы остальным тредам. Если какая-то информация хранится в буферах вывода, то буферы будут сброшены и т.п. Операция производится только с данными вызвавшего треда. Данные, изменявшиеся другими тредами, не затрагиваются.

Слайд 34


Неявно flush без параметров присутствует (если нет опции nowait): Неявно flush без параметров присутствует (если нет опции nowait): в директиве...
Описание слайда:
Неявно flush без параметров присутствует (если нет опции nowait): Неявно flush без параметров присутствует (если нет опции nowait): в директиве barrier, на входе и выходе областей действия директив parallel, critical, ordered, на выходе for, sections, single в вызовах функций семафоров flush вызывается для переменной, участвующей в операции, ассоциированной с директивой atomic. flush не применяется на входе и выходе области действия директивы master



Похожие презентации
Mypresentation.ru
Загрузить презентацию