Приложение 1. Варианты лабораторных заданий

Лабораторная работа №1

Разработка параллельной программы, обеспечивающей контроль использования вычислительных ресурсов

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

Теоретический материал

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

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

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

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

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

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

Один из подходов, который может быть применен для решения данной проблемы, заключается в вычислении времени выполнения некоторого участка программы, например, с использованием функции clock(WinAPI). Затем необходимо передать процессорное время другим процессам/потокам. Для этого можно использовать функцию Sleep (WinAPI). При этом необходимо помнить, что данная функция приостанавливает выполнение текущего потока на время не меньшее, чем то значение, что было передано ей в качестве аргумента. Поэтому нужно измерить время выполнения данной функции в программе. Таким образом, будет получено время выполнения и простоя участка программы. Данные значения должны накапливаться в двух независимых переменных, формируя результирующие значения выполнения и простоя для всей программы. С их использованием можно легко получить соотношение, позволяющее принять решение о необходимости приостановки программы или ее дальнейшем выполнении, а также о значении аргумента для функции Sleep на очередном шаге.

Важно помнить, что участок программы, для которого измеряется время выполнения, должен быть с одной стороны достаточно большой, чтобы процессорное время, затрачиваемое на его выполнение, было намного больше, чем время, затрачиваемое на расчеты, несвязанные с решение основной задачи. С другой стороны данный участок не должен быть слишком большим, чтобы снизить вероятность переключения на другую задачу в момент его выполнения, что приведет к неверным результатам измерений, если это будет происходить слишком часто. Наиболее оптимальный временной размер участка составляет 15-20 мс и может быть определен эмпирически.

Для обеспечения загрузки всех логических процессоров (ядер) необходимо создать соответствующее число потоков. Определить число логических процессоров в системе можно с помощью функции GetSystemInfo:

SYSTEM_INFO siSysInfo;

GetSystemInfo(&siSysInfo);

int cpuCount = siSysInfo.dwNumberOfProcessors;

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

Задание на лабораторную работу

Разработать консольную программу с использованием языка С/С++  и набора функций Windows API, реализующую параллельный расчет в соответствии с номером варианта и заданием из Приложения 1. Параллелизм должен быть реализован на уровне потоков. Уровень загрузки вычислительных ресурсов (общий уровень загрузки процессоров (ядер процессора)) не должен превышать значения заданного в процентах на этапе выполнения программы с консоли. Оформление лабораторной работы должно быть выполнено в соответствии с требованиями, приведенными в Приложении 2.


Лабораторная работа №2

Разработка простейшей распределенной вычислительной системы

Цель работы: изучение подхода к реализации распределенных вычислений и разработка с его использованием простейшей распределенной вычислительной системы.

Теоретический материал

Распределенные вычислительные системы представляют собой совокупность ЭВМ или других вычислительных систем, расположенных, друг от друга на значительном расстоянии, но объединенных с помощью программно управляемых коммутаторов и системных устройств, для решения как наборов независимых задач, так и единой сложной задачи.

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

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

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

Комплекс программ для распределенной вычислительной системы в простейшем случае состоит из серверного и клиентского приложений. Серверное приложение осуществляет разделение исходной задачи на подзадачи, рассылку подзадач клиентам, сбор и объединение результатов промежуточных вычислений, формируя конечный результат. При этом число подзадач равно числу подключившихся клиентов. Основной объем вычислений берут на себя клиентские приложения. Таким образом, сервер выступает в роли управляющего, а не вычислительного модуля (не считая задачи объединения результатов, которая при правильном параллельном алгоритме требует значительно меньший объем вычислительных ресурсов и ей принято пренебрегать).

 

Задание на лабораторную работу

Разработать консольные клиентское и серверное приложения с использованием языка С/С++ и библиотеки WinSock, взаимодействующие по протоколу TCP/IP. Серверное приложение должно обеспечивать одновременное подключение нескольких клиентов, прием входящих сообщений от клиентов, осуществлять выдачу задания каждому клиенту и прием результатов вычислений, а также формирование конечного результата вычислений и отображение его в консоли. Клиентское приложение в свою очередь должно обеспечивать подключение к серверу (порт и IP вводятся в консоли), прием от сервера задания, расчет задания и возврат результата вычислений серверу. Параллелизм реализуется на уровне клиентских процессов без применения многопоточной архитектуры внутри каждого из клиентов. Объем задания для каждого клиента должен быть одинаков и определен в самом начале вычислений, после подключения всех клиентов. Общая задача для вычислений определяется в соответствии с номером варианта и заданием из Приложения 1. Оформление лабораторной работы должно быть выполнено в соответствии с требованиями, приведенными в Приложении 2.

 


Лабораторная работа №3

Разработка вычислительной системы облачного типа

Цель работы: изучение подхода к реализации облачных вычислений и разработка с его использованием вычислительной системы облачного типа.

Теоретический материал

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

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

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

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

Эффективное использование вычислительных ресурсов предполагает распределение задач между узлами в соответствии с их аппаратными характеристиками для обеспечения максимально допустимого уровня их использования.

Неоднородность узлов предполагает различные вычислительные возможности каждого из узлов вычислительной системы.

Низкая надежность предполагает возможность отказа (либо отключения) любого из узлов в любой момент времени.

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

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

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

 

Задание на лабораторную работу

Разработать консольные клиентское и серверное приложения с использованием языка С/С++ и библиотеки WinSock, взаимодействующие по протоколу TCP/IP. Серверное приложение должно обеспечивать одновременное подключение нескольких клиентов, прием входящих сообщений от клиентов, осуществлять периодическую выдачу задания каждому клиенту и прием результатов вычислений, а также выдачу сообщения клиентам о завершении расчетов, формирование конечного результата вычислений и отображение его в консоли. Клиентское приложение в свою очередь должно обеспечивать подключение к серверу (порт и IP вводятся в консоли), периодический прием от сервера заданий, их расчет и возврат результатов вычислений серверу до тех пор, пока сервер не сообщит о завершении вычислений. Параллелизм реализуется как на уровне клиентских процессов, так и на уровне потоков в клиентских приложениях, при этом число потоков должно быть равно числу процессоров в системе. Для обеспечения равномерной загрузки и отказоустойчивости системы необходимо выдавать задания порционно. Общая задача для вычислений определяется в соответствии с номером варианта и заданием из Приложения 1. Оформление лабораторной работы должно быть выполнено в соответствии с требованиями, приведенными в Приложении 2.

 


Приложение 1. Варианты лабораторных заданий

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

Варианты лабораторных заданий, включающие определенный интеграл и шаг интегрирования приведены в таблице 6. При вычислении использовать тип данных double.

Таблица 6 - Варианты заданий


Дата добавления: 2020-04-25; просмотров: 118; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!