· уменьшение счетчика на заданную величину (subCounter);
· установка таймера на данный счетчик (setTimer);
· запуск таймера (startTimer);
· останов таймера (stopTimer).
Пример: сколько времени данная функция проводит, посылая сообщения?
void foo ()
{
add (fooFlag); // fooFlag является признаком входа в функцию
. . .
sub (fooFlag);
}
sendMessage ()
{
if (fooFlag)
startTimer ();
. . .
if (fooFlag)
stopTimer ();
}
Ресурсы – все интересующие нас объекты параллельной системы (процессоры, каналы, задачи). Ресурсы упорядочены в некоторое количество иерархий. В каждой иерархии представлены объекты определенного типа. На нижнем уровне иерархии находятся конкретные объекты данного типа, существующие на данный момент в системе. На следующем более высоком уровне они собираются по определенному признаку, например в объекты, содержащие их.
Иерархии ресурсов позволяют определить детализацию собираемой информации о производительности. Каждый более высокий уровень базируется на информации предоставляемой более низким уровнем. В примере с иерархией каналов, на самом нижнем уровне вычисляются метрики конкретных каналов. На уровне процессоров вычисляются общие метрики, такие как усредненные или суммарные значения метрик всех каналов на конкретном процессоре. На самом высоком уровне – всей системы – вычисляются общие метрики для всех каналов в системе.
Кроме иерархии каналов определены иерархии ресурсов процессоров и задач.
Иерархическая организация информации используется при анализе характеристик и производительности параллельных программ в реальном времени.
Для сбора информации используется метод сэмплирования (от английского sampling), т.е. периодического считывания текущих данных. Поступление очередного набора данных назовем сэмплом (sample).
При необходимости определенной информации диспетчер посылает запрос по служебному каналу, который не содержит данных. Каждый процессор, принимая запрос, дополняет его своей информацией и посылает дальше по служебному каналу, следующему процессору. В результате прохождения запроса по всем процессорам системы он возвращается к диспетчеру с накопленной информацией.
Целесообразность использования кольца служебных каналов (по сравнению с “веником”):
1. Небольшое общее количество односторонних каналов (N+1 вместо 2N);
2. Как следствие, разгрузка канала обмена диспетчера (нагрузка распределяется между всеми процессорами системы);
3. Более низкие требования к производительности диспетчера (есть время на обработку информации между соседними сэмплами);
4. Простота контроля загруженности канала сэмплирования (наряду со стандартными метриками каналов введены счетчики посланных и принятых запросов в диспетчере, в заголовок запроса включено поле – время отправления, по которому при возвращении запроса определяется время его осуществления);
5. Контроль потока служебной информации (легко регулируется периодичность запросов);
6. Простота сбора данных.
В каждом запросе указывается объект определенной иерархии и запрашиваемая метрика:
· вид ресурсов;
· уровень иерархии;
· номер объекта на данном уровне иерархии;
· код запрашиваемой метрики для данного объекта.
Структура получаемой информации однозначно определяется типом объектов указанных в запросе.
Возможно получение информации сразу по всем объектам и/или всем метрикам – при указании специальных значений последних двух полей. В данном случае в ответ на запрос возвращается массив однотипных структур.
Диспетчер, – выделенный процессор, управляющий и контролирующий параллельную систему, – осуществляет мониторинг, и сбор необходимой информации о системе в реальном времени. Определен прикладной программный интерфейс диспетчера, который может использоваться программами начального распределения задач, визуализации, анализа производительности, динамической оптимизации и др.
Таким образом, диспетчер поддерживает рабочий профиль параллельной программы. Общий вид структуры информации представляет собой двумерную матрицу. Одна размерность состоит из наименований однотипных объектов, другая – из наименований метрик, измеряемых для данных объектов. В качестве объектов используются процессоры, задачи и каналы. Таким образом, имеется три матрицы текущих параметров параллельной программы. Также, имеются вектора средних и общих параметров.
Для процессора вычисляются, например, следующие параметры: загруженность, количество памяти, время простоя и др.
Для задач вычисляются общее время вычисления, время обмена данными и др.
Для каналов: счетчики входов в процедуры обмена send/recv, объем переданных/принятых данных, среднее время нахождения в режиме приема/передачи и др.
5. Контроль производительности.
В данном разделе описываются идейные соображения для построения системы, анализирующей производительность параллельных программ в реальном времени.
Накопленная диспетчером информация – рабочий профиль – может использоваться для анализа выполнения параллельной программы. Далее описан примерный сценарий анализа.
Пусть задан вопрос: работает ли программа эффективно.
Гипотеза H0: программа работает эффективно.
Гипотеза H1: программа работает неэффективно.
Проверку гипотез производим из следующих соображений. Выделим основные типы неэффективной работы параллельной программы, один из них:
· большая доля времени простоя задач от общего времени работы.
Упрощенно это выражается следующим выражением:
Можно взять критерий: Eп< 0,8.
Итак, если время простоя занимает более 20 процентов общего времени работы программы, то есть основания считать работу программы неэффективной.
Подтвердив данную гипотезу – первого уровня, – переходим к анализу гипотез второго уровня. Предположим, в программе имеется «узкое место» в плане обмена данных. Рассмотрим участок графа потоков данных программы, показанный на рисунке.
Существует два типа «узких мест»:
1. T2не успевает обрабатывать входные данные, T1находится в состоянии ожидания обработки выходных данных. При этом наблюдается:
a) загруженность T2высока (> 90 %), загруженность T1низка (< 50%),
b) количество сгенерированных L1и обработанных L2данных находятся в отношении L1 – L2 > d > 0,
c) длина очереди данных входного канала для T2 велика.
2. T1генерирует мало данных, T2находится в состоянии ожидания входных данных. При этом наблюдается:
a) загруженность T1высока (> 90 %), загруженность T2низка (< 50%),
b) длина очереди данных входного канала для T2 мала.
В данном случае можно выдвинуть две соответствующие гипотезы. Их проверку можно осуществить из следующих соображений.
Рассмотрим метрику канала связи процессоров – среднее время обмена. Для первой задачи это функция send, для второй – recv.
Пусть процесс изменения этих метрик во времени выглядят примерно так, как показано на рисунке.
Если имеет место первая причина снижения производительности, то первая метрика будет превышать вторую, т.к. первый процесс относительно долго находится в режиме передачи, а второй при этом не принимает данные, а, скорее всего, вычисляет.
Если имеет место вторая причина, то все наоборот.
Для подтверждения тех или иных гипотез можно применить методы анализа случайных процессов.
Заключение
Описанная система параллельного программирования является основой для создания программ визуализации, анализа производительности, оптимального начального распределения задач, динамической оптимизации выполнения параллельных программ.
Программы визуализации и анализа производительности могут использоваться для изучения параллельных алгоритмов, как таковых.
В будущем, законченная система может использоваться для осуществления практических вычислительных задач большой сложности и оперирующих большими объемами данных.
Преимущество данной системы состоит в том, что она не требует применения мощных компьютерных систем, вместо этого она полноценно использует ресурсы любых локальных сетей на базе ОС Windows 95.
Литература:
1. Сервер ВЦ РАН http://www.ccas.ru/paral/
2. Ian Foster,“Designing and Building Parallel Programs”, 1995
3. Barton P. Miller and others, “The Paradyn Parallel Performance Measurement Tools” Computer Sciences Department, University of Wisconsin-Madison. http://www.cs.wisc.edu/paradyn/
4. Бертекас, Галлагер, “Сети передачи данных”, 1989.