Страницу Назад
Поискать другие аналоги этой работы

550

Отказоустойчивые вычислительные системы. Лабораторная работа №2

ID: 200420
Дата закачки: 12 Мая 2019
Продавец: nura (Напишите, если есть вопросы)
    Посмотреть другие работы этого продавца

Тип работы: Работа Лабораторная

Описание:
ЛАБОРОТОРНАЯ №2. СОЗДАНИЕ ПАРАЛЛЕЛЬНЫХ ОБЛАСТЕЙ В OpenMP.

Цель лабораторной работы – рассмотреть Условия выполнения параллельных областей. Распределение выполняемой программой работы между главно нитью и остальными.
2.1.Обзор директив разделения задач
При запуске программы создается процесс и запускается одна нить приложения OpenMP. Первая нить называется главная, она существует на протяжении всего цикла работы программы, в литературе не редко главная нить называется нить-мастер (master thread) или основная нить. Программа выполняется главной нитью, как только главная нить обнаруживает директиву параллельной области, создается группа нитей для выполнения параллельных вычислений. После выполнения команд параллельной области группа нитей завершает свою работу, и управление переходит опять главной нити.
В OpenMP реализован набор директив, которые позволяют управлять процессом создания нитей и их использованием в процессе параллельных вычислений:
- директива parallel – инициализирует, создает параллельную область, которая исполняется всеми нитями;
- директива master – задает исполнения структурированного блока кода только мастер-нитью;
- директива single – задает исполнение структурированного блока кода только один раз (любой нитью).
Создание группы нитей параллельной области достаточно ресурсоемкая задача, поэтому если в параллельной программе требуется исполнение блока кода одной нитью или мастер-нитью, то эффективнее применять директивы single и master.

Директива parallel
Параллельная область инициализируется вызовом директивы parallel. В результате выполнения директивы порождается группа нитей.
Список доступных опций директивы parallel для языков Си.

Опции директивы parallel. Язык Си
-0 if(логическое выражение)
-1 num_threads(выражение целого типа)
-2 default (shared | none)
-3 private (список)
-4 firstprivate(список)
-5 shared(список)
-6 copyin(список)
-7 reduction(оператор: список)


Опции директивы parallel можно разделить на следующие группы:
1 условие на исполнение параллельной области if;
2 задание количества нитей num_threads;
3 задание способа размещения переменных в памяти default, private, shared;
4 задание способа инициализации переменных firstprivate, copyin;
5 задание в теле директивы, оператора выполняемого параллельно reduction.

Условия выполнения параллельных областей
Рассмотрим процесс инициализации параллельной области. Программа обращается к операционной системе и запрашивает создание требуемого количества нитей в рамках запущенного процесса и объединяет их в группу. Создание нити (нитей) ресурсоемкая задача, требующая несколько тысяч элементарных операций, поэтому прежде чем задать параллельное выполнение, нужно оценить количество операций в рассматриваемом блоке программы.
В OpenMP для реализации условий на выполнение применяется опция if директивы parallel. В условии if устанавливается ограничение на инициализацию параллельной области. Вариантов применения условий if несколько:
- зависимость от размерности задачи решаемого блока. При небольших размерах решаемой задачи инициализация параллельной области не происходит, и программа выполняется последовательно;

Пример1. Условие на размерности задачи
#pragrma omp parallel if(n>100)
for (i=0;i<n;i++) ! При n<=100 программа
s=s+i ! выполняется последовательно

- зависимость от количества используемых нитей. Для задач, в которых средняя степень параллелизма не является идеальной, существует ограничение на размер группы нитей, на которой параллельная программа выполняется эффективно. Такие ограничения реализуются при помощи условий if.

Пример2. Условие на размерности задачи
#pragrma omp parallel if((size>4)&&(size<32)) !
for (i=0;i<n;i++) ! size – количество нитей
s=s+i ! При 4<size<32 программа выполняется параллельно

Задание количества используемых нитей

В предыдущем примере рассматривалось условие на ограничения количества используемых нитей, чтобы параллельный блок программы был выполнен максимально эффективно. В ряде задач требуется точное задание размера группы нитей, для этого применяется опция num_threads директивы parallel. Опция num_threads имеет наивысший приоритет из способов задания количества нитей, то есть если через переменную окружения OMP_NUM_THREADS было задано количество нитей равное 10, а при инициализации параллельной области выполнена с опцией num_threads(2), то будет создано две нити.

Пример3. Явное задание количества используемых нитей
#pragrma omp parallel num_threads(32)
{структурированный блок, ориентированный на выполнение на SMP системе из 32 процессоров}

Применение опции num_threads директивы parallel накладывает ограничения на SMP-систему, на которой может быть запущена параллельная программа. В примере, приведенном выше, создается 32 нити, и если SMP-система имеет 32 и более процессора (вычислительных ядер), то программа выполнится максимально быстро, в другом случае операционная система перераспределит нити между имеющимися процессорами, при этом скорость вычислений резко упадет.
В примере 3 приводится использование директивы parallel. При запуске программы создается главная нить, которая выводит «Главная нить: инициализация parallel». При выполнении директивы parallel создается группа нитей, которая исполняет структурный блок кода. В результате каждая нить выведет «Все нити: параллельное выполнение», а 2-ая нить дополнительно выдеведет «2-ая нить: логическое условие». После исполнения структурного блока кода директивой parallel группа нитей уничтожается, оставшиеся команды выполнит главная нить – выведет «Главная нить: завершение parallel».
Пример №4. Задание количества нитей.


Параллельная область на языке Си
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Главная нить: инициализация parallel\\n");
#pragma omp parallel num_threads(3)

{
printf("Все нити: параллельное выполнение \\n");
if (omp_get_thread_num()==2)
{
printf("2-ая нить: логическое условие \\n");
}
}
printf("Главная нить: завершение parallel \\n");
}

Директива master
При решении вычислительных итерационных задач на SMP-системах главная нить выполняет инициализацию параметров, выводить промежуточные результаты или проверяет критерии останова итерационного алгоритма. Директива master (master ... end master) используется для выделения структурированного блока кода, который будет выполнять только главной нитью.

Синтаксис оператора. Язык Си
#pragma omp master


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

Пример 5 демонстрирует применение директивы master. Переменная n является локальной, то есть каждая нить работает со своим экземпляром. Сначала все нити присвоят переменной n значение 1. Потом нить-мастер присвоит переменной n значение 2, и все нити напечатают значение n. Затем нить-мастер присвоит переменной n значение 3, и снова все нити напечатают значение n. Видно, что директиву master всегда выполняет одна и та же нить. В данном примере все нити выведут значение 1, а нить-мастер сначала выведет значение 2, а потом - значение 3.

Пример 5.
Директива master на языке Си
#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);
}
}



Директива single
Если в параллельной области какой-либо участок кода должен быть выполнен лишь один раз, то его нужно выделить директивами single (single ...end single).

Синтаксис оператора. Язык Си
#pragma omp single [опция [[,] опция]...]


Список доступных опций директивы single для языков Си .

Опции директивы single. Язык Си
-16 private (список)
-17 firstprivate(список)
-18 copyprivate(список)
-19 nowait


В программах на языке Си все опции указываются у директивы single, а в программах на языке Фортран опции private и firstprivate относятся к директиве single, а опции copyprivate и nowait – к директиве end single. Какая именно нить будет выполнять выделенный участок программы, не специфицируется. Одна нить будет выполнять данный фрагмент, а все остальные нити будут ожидать завершения её работы, если только не указана опция nowait. Необходимость использования директивы single часто возникает при работе с общими переменными.

Пример 6 иллюстрирует применение директивы single вместе с опцией nowait. Сначала все нити напечатают текст "Сообщение 1", при этом одна нить (не обязательно нить-мастер) дополнительно напечатает текст "Одна нить". Остальные нити, не дожидаясь завершения выполнения области single, напечатают текст "Сообщение 2". Таким образом, первое появление "Сообщение 2" в выводе может встретиться как до текста "Одна нить", так и после него. Если убрать опцию nowait, то по окончании области single произойдёт барьерная синхронизация, и ни одна выдача "Сообщение 2" не может появиться до выдачи "Одна нить".

Пример 6.
Директива single и опция nowait на языке Си
#include <stdio.h>
int main(int argc, char *argv[])
{
#pragma omp parallel num_threads(3)

{
printf("Сообщение 1\\n");
#pragma omp single nowait
{
printf("Одна нить\\n");
}
printf("Сообщение 2\\n");
}
}

Пример 7 иллюстрирует применение опции copyprivate. В данном примере переменная n объявлена в параллельной области как локальная. Каждая нить присвоит переменной n значение, равное своему порядковому номеру, и напечатает данное значение. В области single одна из нитей присвоит переменной n значение 100, и на выходе из области это значение будет присвоено переменной n на всех нитях. В конце параллельной области значение n печатается ещё раз и на всех нитях оно равно 100.

Пример 7.
Опция copyprivate на языке Си
#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);
}
}



Упражнения

1. Напишите программу вывода натурального числа в параллельной области всеми нитями; главной нитью; любой нитью.
2. Напишите программу суммирования ряда из n натуральных чисел. Если n<500 программа должна выполняться последовательно, если n=>500 программа должна выполняться параллельно (применение опции if директивы parallel).
3. В предыдущей программе замерите время суммирования ряда в параллельном и последовательном варианте. Сделайте вывод о том, при каком n параллельная программа будет выполняться эффективно?
4. Напишите программу скалярного произведения двух векторов. При инициализации параллельной области явно укажите количество используемых нитей 2 или 4.
5. Предыдущую программу измените так, чтобы вывод результата скалярного произведения произвела главная нить; первая, завершившая вычисления нить.



Комментарии: Уважаемый студент, дистанционного обучения,
Оценена Ваша работа по предмету: Отказоустойчивые вычислительные системы (ДВ 3.2)
Вид работы: Лабораторная работа 2
Оценка:Зачет
Дата оценки: 09.05.2019
Рецензия:Уважаемая

Задорожный Анатолий Филиппович

Размер файла: 367 Кбайт
Фаил: Упакованные файлы (.rar)
-------------------
Обратите внимание, что преподаватели часто переставляют варианты и меняют исходные данные!
Если вы хотите, чтобы работа точно соответствовала, смотрите исходные данные. Если их нет, обратитесь к продавцу или к нам в тех. поддержку.
Имейте ввиду, что согласно гарантии возврата средств, мы не возвращаем деньги если вариант окажется не тот.
-------------------

   Скачать

   Добавить в корзину


    Скачано: 8         Коментариев: 0


Есть вопросы? Посмотри часто задаваемые вопросы и ответы на них.
Опять не то? Мы можем помочь сделать!

Некоторые похожие работы:

Лабораторные работы №1,2,3 по дисциплине: Отказоустойчивые вычислительные системы. Вариант №1
Лабораторная работа №1 по дисциплине: Отказоустойчивые вычислительные системы. Для всех вариантов
Контрольная и лабораторные работы №1,2,3 по дисциплине: Отказоустойчивые вычислительные системы. Вариант №4
Лабораторная работа №3 по дисциплине: Отказоустойчивые вычислительные системы. Вариант №4
Контрольная и Лабораторная работа 2-3 по дисциплине: Отказоустойчивые вычислительные системы. Вариант 7
Лабораторная работа №2 по дисциплине: Отказоустойчивые вычислительные системы. Вариант №4
Лабораторная работа 2-3 по дисциплине: Отказоустойчивые вычислительные системы. Вариант 7
Ещё искать по базе с такими же ключевыми словами.

Не можешь найти то что нужно? Мы можем помочь сделать! 

От 350 руб. за реферат, низкие цены. Просто заполни форму и всё.

Спеши, предложение ограничено !



Что бы написать комментарий, вам надо войти в аккаунт, либо зарегистрироваться.

Страницу Назад

  Cодержание / Вычислительные машины, системы и сети / Отказоустойчивые вычислительные системы. Лабораторная работа №2
Вход в аккаунт:
Войти

Забыли ваш пароль?

Вы еще не зарегистрированы?

Создать новый Аккаунт


Способы оплаты:
UnionPay СБР Ю-Money qiwi Payeer Крипто-валюты Крипто-валюты


И еще более 50 способов оплаты...
Гарантии возврата денег

Как скачать и покупать?

Как скачивать и покупать в картинках


Сайт помощи студентам, без посредников!