Главная страница
Навигация по странице:

Параллельная обработка данных лабраб. Лабораторная работа 1 Знакомство с многопоточной обработкой. Лабораторная работа 2 Поиск простых чисел



Скачать 471.5 Kb.
Название Лабораторная работа 1 Знакомство с многопоточной обработкой. Лабораторная работа 2 Поиск простых чисел
Анкор Параллельная обработка данных лабраб.doc
Дата 30.04.2017
Размер 471.5 Kb.
Формат файла doc
Имя файла Параллельная обработка данных лабраб.doc
Тип Лабораторная работа
#5280
страница 1 из 3
  1   2   3

Оглавление

Лабораторная работа 1 Знакомство с многопоточной обработкой.

Лабораторная работа 2 Поиск простых чисел

Лабораторная работа 3 Синхронизация доступа к одноэлементному буферу

Лабораторная работа 4 Синхронизация приоритетного доступа к многоэлементному буферу

Лабораторная работа 5 Клеточная модель "Игра жизнь"

Дж. Конвея

Лабораторная работа б Распараллеливание программы вычисления определенного интеграла с помощью

ОрепМР

Лабораторная работа 7 Распараллеливание программы решения

систем линейных алгебраических уравнений методом Гаусса с помощью ОрепМР. 40 Литература
ЛАБОРАТОРНАЯ РАБОТА № 1

ЗНАКОМСТВО С МНОГОПОТОЧНОЙ ОБРАБОТКОЙ

В работе исследуется эффективность распараллеливания незави­симой обработки элементов вектора. В первом задании в качестве об­работки можно выбрать то или иное математическое преобразование элементов вектора:


jor(inti=0; i



Многопоточная обработка реализуется с помощью объектов Thread. На многоядерной системе многопоточная обработка приводит к параллельности выполнения. Классы для работы с потоками распо­ложены в пространстве имен System.Threading.

Для создания потока необходимо указать имя рабочего метода потока, который может быть реализован в отдельном классе, в глав­ном классе приложения как статический метод или в виде лябда- выражения. Метод потока либо не принимает никаких аргументов, либо принимает аргумент типа object. Запуск потока осуществляется вызовом метода Start.







Дождаться завершения работы потоков можно с помощью метода Join:







В функции потока необходимо предусмотреть возможность раз­биения диапазона 0.. (N -1) на число потоков nThr. При запуске пото­ка в качестве аргумента передается либо "индекс потока", опреде­ляющий область массива, который обрабатывается в данном потоке, либо начальный и конечный индексы массива.







Многопоточное выполнение будет параллельным при наличии в вычислительной системе нескольких процессоров (ядер процессора). Число процессоров можно узнать с помощью свойства:

System.Environment.ProccessorCount;

Параллельное выполнение вычислений также можно реализо­вать с помощью классов библиотекиТРЬ (TaskParallelLibrary). Классы библиотеки располагаются в пространстве имен System.Threading.Tasks. Параллельное вычисление операций над элементами цикла выполняется с помощью метода Parallel.For:







Для анализа производительности последовательного и параллель­ного выполнения можно использовать переменные TnnaDateTime. Например,







Также можно использовать Stopwatch пространства System .Diagnostics:











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

Эффективность параллельного алгоритма существенно зависит от элементов массива, числа потоков, сложности математической функ­ции и т. д. Следует учитывать, что при малом объеме элементов мас­сива, накладные расходы, связанные с организацией многопоточной обработки, превышают выигрыш от параллельности обработки. При последовательном выполнении примитивной циклической обработки быстродействие достигается за счет оптимального использования кэш-памяти.

Выполняя анализ зависимости быстродействия от числа потоков, следует учитывать число ядер процессора. Увеличение числа потоков сверх возможностей вычислительной системы приводит к конкурен­ции потоков и ухудшению быстродействия.

Усложнение обработки элементов массива предлагается реализо­вать с помощью внутреннего цикла. Например,







К - параметр "сложности". Увеличивая параметр К. наблюдаем по­вышение эффективности параллельной обработки при меньшем объе­ме массива чисел.

В рассмотренных вариантах обработки вычислительная нагрузка на каждой итерации относительно одинакова. В ситуациях, когда вы­числительная нагрузка зависит от индекса элемента, разделение мас­сива по равным диапазонам может быть не эффективно. Рассмотрим следующий вариант обработки:







Вычислительная нагрузка при обработке i-элемента зависит от индекса i. Обработка начальных элементов массива занимает меньшее время по сравнению с обработкой последних элементов. Разделение данных по диапазону приводит к несбалансированной загрузке пото­ков и снижению эффективности распараллеливания.




Рисунок 1.2.




Одним из подходов к выравниванию загрузки потоков является применение круговой декомпозиции. В случае двух потоков получаем такую схему: первый поток обрабатывает все четные элементы, вто­рой поток обрабатывает все нечетные элементы. Реализуйте круговую декомпозицию для нескольких потоков (больше двух).
ЗАДАНИЕ К ЛАБОРАТОРНОЙ РАБОТЕ 1

  1. Реализуйте последовательную обработку элементов вектора, например, умножение элементов вектора на число. Число элементов вектора задается параметром N.

  1. Реализуйте многопоточную обработку элементов вектора, ис­пользуя разделение вектора на равное число элементов. Число пото­ков задается параметром М.

  2. Выполните анализ эффективности многопоточной обработки при разных параметрах (10, 100, 1000, 100000) и М (2, 3, 4, 5, 10). Результаты представьте в табличной форме.

  3. Выполните анализ эффективности при усложнении обработки каждого элемента вектора.

  4. Исследуйте эффективность разделения по диапазону при не­равномерной вычислительной сложности обработки элементов век­тора.

  5. Исследуйте эффективность параллелизма при круговом разде­лении элементов вектора. Сравните с эффективностью разделения по диапазону.

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Почему эффект от распараллеливания наблюдается только при большем числе элементов?

  2. Почему увеличение сложности обработки повышает эффек­тивность многопоточной обработки?

  3. Какое число потоков является оптимальным для конкретной вычислительной системы?

  4. Почему неравномерность загрузки потоков приводит к сниже­нию эффективности многопоточной обработки?

  5. Какие другие варианты декомпозиции позволяют увеличить равномерность загрузки потоков?

  6. В какой ситуации круговая декомпозиция не обеспечивает равномерную загрузку потоков?

ЛАБОРАТОРНАЯ РАБОТА № 2

ПОИСК ПРОСТЫХ ЧИСЕЛ

Цель работы: реализовать последовательный и параллельные ал­горитмы поиска простых чисел; выполнить анализ быстродействия алгоритмов при разном объеме данных, разном числе потоков; рас­считать ускорение и эффективность выполнения алгоритмов; сделать выводы о целесообразности применения параллельных алгоритмов и необходимости использования синхронизации.

Описание работы

Последовательный алгоритм "Решето Эратосфена"

Алгоритм заключается в последовательном переборе уже извест­ных простых чисел, начиная с двойки, и проверке разложимости всех чисел диапазона (т, п\ на найденное простое число т. На первом шаге выбирается число т = 2, проверяется разложимость чисел диапазона (2, п\ на 2-ку. Числа, которые делятся на двойку, помечают как со­ставные и они не участвуют в дальнейшем анализе. Следующим не­помеченным (простым) числом будет т = 3, и так далее.




Рисунок 2.1.




При этом достаточно проверить разложимость чисел на простые числа в интервале (2 ,л/п]. Например, в интервале от 2 до 20 проверяем все числа на разложимость 2, 3. Составных чисел, которые делятся только на пятерку, в этом диапазоне нет.

Модифицированный последовательный алгоритм поиска

В последовательном алгоритме "базовые" простые числа опреде­ляются поочередно. После тройки следует пятерка, так как четверка исключается при обработке двойки. Последовательность нахождения простых чисел затрудняет распараллеливание алгоритма. В модифи­цированном алгоритме выделяются два этапа:

  • 1-ый этап: поиск простых чисел в интервале от 2 ... л/п с помо­щью классического метода решета Эратосфена (базовые простые числа);

  • 2-ой этап: поиск простых чисел в интервале от л/п ... п, в провер­ке участвуют базовые простые числа, выявленные на первом этапе.




Рисунок 2.2.




На первом этапе алгоритма выполняется сравнительно не­большой объем работы, поэтому нецелесообразно распараллеливать этот этап. На втором этапе проверяются уже найденные базовые про­стые числа. Параллельные алгоритмы разрабатываются для второго этапа.




Рисунок 2.3. Параллельный алгоритм № 1: декомпозиция по данным.




Идея распараллеливания заключается в разбиении диапазона л/п...л на равные части. Каждый поток обрабатывает свою часть чи­сел, проверяя на разложимость по каждому базовому простому числу.




Рисунок 2.4 Параллельный алгоритм № 2: декомпозиция набора простых чисел.




В этом алгоритме разделяются базовые простые числа. Каждый поток работает с ограниченным набором простых чисел и проверяет весь диапазон у/п...л.

Параллельный алгоритм № 3: применение пула потоков

Применение пула потоков позволяет автоматизировать обработку независимых рабочих элементов. В качестве рабочих элементов пред­лагается использовать проверку всех чисел диапазона от yjn...n на разложимость по одному базовому простому числу.




Рисунок 2.5. Параллельный алгоритм № 3.




Для применения пула потоков необходимо загрузить рабочие элементы вместе с необходимыми параметрами в очередь пула пото­ков:







Run - метод обработки всех чисел диапазона 4п.. л на разложи­мость простому числу basePrime[i].

Выполнение рабочих элементов осуществляется автоматически после добавления в пул потоков. Не существует встроенного меха­низма ожидания завершения рабочих элементов, добавленных в пул потоков. Поэтому вызывающий поток (метод Main) должен контроли­ровать завершение либо с помощью средств синхронизации (напри­мер, сигнальных сообщений), либо с помощью общих переменных и цикла ожидания в методе Main.

Применение сигнальных сообщений может быть реализовано следующим образом:






Параллельный алгоритм # 4: последовательный перебор простых чисел

Идея алгоритма заключается в последовательном переборе базо­вых простых чисел разными потоками. Каждый поток осуществляет проверку всего диапазона на разложимость по определенному про­стому числу. После обработки первого простого числа поток не за­вершает работу, а обращается за следующим необработанным про­стым числом.




Рисунок 2.6. Параллельный алгоритм № 4.




Для получения текущего простого числа поток выполняет не­сколько операторов:







В этой реализации существует разделяемый ресурс - массив про­стых чисел. При одновременном доступе к ресурсу возникает пробле­ма гонки данных. Следствием этой проблемы являются: лишняя обра­ботка, если несколько потоков одновременно получают одно и то же число; пропущенная задача - потоки, получив одно число, последова­тельно увеличивают текущий индекс; исключение "Выход за пределы массива", когда один поток успешно прошел проверку текущего ин­декса, но перед обращением к элементу массива, другой поток увели­чивает текущий индекс.

Для устранения проблем с совместным доступом необходимо ис­пользовать средства синхронизации (критические секции, атомарные операторы, потокобезопасные коллекции).

Критическая секция позволяет ограничить доступ к блоку кода, если один поток уже начал выполнять операторы секции:

lock (sync obj)

{

критическая секция,

}

где sync_obj - объект синхронизации, идентифицирующий критиче­скую секцию (например, строковая константа).

ВОПРОСЫ И УПРАЖНЕНИЯ

  1. Какими достоинствами и недостатками обладает каждый вари­ант распараллеливания?

  2. Какие средства синхронизации можно использовать вместо конструкции lock? Какой вариант будет более эффективным?

  3. Какой вариант ожидания завершения работ, запущенных пу­лом потоков, более эффективный и почему?

  4. Реализуйте один или несколько вариантов распараллеливания с помощью объектов Task и с помощью метода Parallel.For. Выполни­те эффективность алгоритмов.

  5. Реализуйте алгоритм поиска простых чисел как LINQ-запрос к массиву чисел.

ЛАБОРАТОРНАЯ РАБОТА № 3

СИНХРОНИЗАЦИЯ ДОСТУПА К ОДНОЭЛЕМЕНТНОМУ БУФЕРУ

Описание работы

Несколько потоков работают с общим одноэлементным буфером. Потоки делятся на "писателей", осуществляющих запись сообщений в буфер, и "читателей", осуществляющих извлечение сообщений из бу­фера. Только один поток может осуществлять работу с буфером. Если буфер свободен, то только один писатель может осуществлять запись в буфер. Если буфер занят, то только один читатель может осуществ­лять чтение из буфера. После чтения буфер освобождается и доступен для записи. В качестве буфера используется глобальная переменная, например, типа string. Работа приложения заканчивается после того, как все сообщения писателей через общий буфер будут обработаны читателями.




Рисунок 3.1.




В случае одноэлементного буфера достаточно использовать флаг типа bool для контроля состояния буфера. Читатели обращаются к бу­феру, только если он свободен:







Писатели обращаются к буферу, только если он пуст:







Писатели работают, пока не запишут все свои сообщения. По оконча­нии работы писателей основной поток может изменить статус пере­менной finish, который является признаком окончания работы читате­лей.




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


Для писателей существует своя критическая секция:

Самый простой вариант решения проблемы заключается в ис­пользовании критической секции (lock или Monitor).

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

секции. Если буфер свободен, то синхронизация читателей из­быточна. Более эффективным является вариант двойной проверки:







Если буфер свободен, то читатели "крутятся" в цикле, проверяя со­стояние буфера. При этом читатели не блокируются. Как только бу­фер заполняется, несколько читателей, но не все, успевают войти в первый if-блок прежде, чем самый быстрый читатель успеет изменить статус буфера bEmpty = true.

Применение сигнальных сообщений позволяет упростить логику синхронизации доступа. Читатели ожидают сигнала о поступлении сообщения, писатели - сигнала об опустошении буфера. Читатель, освобождающий буфер, сигнализирует об опустошении. Писатель, заполняющий буфер, сигнализирует о наполнении буфера. Сообщения с автоматическим сбросом AutoResetEvent обладают полезным свой­ством - при блокировке нескольких потоков на одном и том же объек­те Auto Reset Even Появление сигнала освобождает только один поток, другие потоки остаются заблокированными. Порядок освобождения потоков при поступлении сигнала не известен, но в данной задаче это не существенно.






Данный фрагмент приводит к зависанию работы читателей. Писа­тели закончили работу, а читатели ждут сигнала о наполненности бу­фера evFull. Для разблокировки читателям необходимо сформировать сигналы evFull.Set() от писателей при завершении работы или от главного потока. Чтобы отличить ситуацию завершения? можно осу­ществлять проверку статуса finish непосредственно после разблоки­ровки.




Применение семафоров (Semaphore, SemaphoreSlim) в данной задаче аналогично использованию сигнальных сообщений AutoResetEvent. Кроме предложенного варианта обмена сигналами между читателями и писателями, семафоры и сигнальные сообщения
могут использоваться в качестве критической секции читателей и пи­сателей.

ЗАДАНИЕ К ЛАБОРАТОРНОЙ РАБОТЕ № 3

  1. Реализуйте взаимодействие потоков-читателей и потоков- писателей с общим буфером без каких-либо средств синхронизации. Проиллюстрируйте проблему совместного доступа. Почему возникает проблема доступа?

  2. Реализуйте доступ "читателей" и "писателей" к буферу с при­менением следующих средств синхронизации:

о блокировки (lock);

о сигнальные сообщения (ManualResetEvent, AutoResetEvent, ManualRe setEventSlim); о семафоры (Semaphore, Semaphore Slim), о атомарные операторы (Interlocked).

  1. Исследуйте производительность средств синхронизации при разном числе сообщений, разном объеме сообщений, разном числе потоков.

  2. Сделайте выводы об эффективности применения средств син­хронизации.

КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Почему проблема гонки данных проявляется не при каждом про­гоне?

  2. Какие факторы увеличивают вероятность проявления проблемы гонки данных?

  3. Возможно ли в данной задаче при отсутствии средств синхрони­зации возникновение исключения и аварийное завершение про­граммы?

  4. Можно ли в данной задаче использовать атомарные операторы для обеспечения согласованности доступа? Необходимы ли при этом дополнительные средства синхронизации?

  5. Можно ли в данной задаче использовать потокобезопасные кол­лекции для обеспечения согласованного доступа?

  6. Какие средства синхронизации обеспечивают наилучшее быст­родействие в данной задаче? Объясните с чем это связано.

ЛАБОРАТОРНАЯ РАБОТА № 4
  1   2   3
написать администратору сайта