Научная статья на тему 'Язык описания типов проблем производительности при взаимодействии процессов в MPI-приложениях'

Язык описания типов проблем производительности при взаимодействии процессов в MPI-приложениях Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
157
58
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ПАРАЛЛЕЛЬНОЕ ПРОГРАММИРОВАНИЕ / АНАЛИЗ ПРОИЗВОДИТЕЛЬНОСТИ / MESSAGE PASSING INTERFACE (MPI) / MPI / PARALLEL PROGRAMMING / PERFORMANCE ANALYSIS

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Карпенко Сергей Николаевич, Дергунов Антон Владимирович

Предложены модель выполнения MPI-приложения и язык описания типов проблем производительности при взаимодействии процессов. Приведен пример описания на этом языке одной проблемы производительности: прием сообщений в неверном порядке.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

A LANGUAGE TO DESCRIBE PERFORMANCE PROBLEM TYPES FOR INTERPROCESS COMMUNICATION IN MPI APPLICATIONS

A model of MPI program execution and a language to describe performance problem types for interprocess communication are proposed. The language is illustrated by encoding a performance problem: receiving messages in the wrong order.

Текст научной работы на тему «Язык описания типов проблем производительности при взаимодействии процессов в MPI-приложениях»

Информационные технологии Вестник Нижегородского университета им. Н.И. Лобачевского, 2011, № 3 (2), с. 219-226

УДК 519.685.1

ЯЗЫК ОПИСАНИЯ ТИПОВ ПРОБЛЕМ ПРОИЗВОДИТЕЛЬНОСТИ ПРИ ВЗАИМОДЕЙСТВИИ ПРОЦЕССОВ В MPI-ПРИЛОЖЕНИЯХ

© 2011 г. С.Н. Карпенко, А.В. Дергунов

Нижегородский госуниверситет им. Н.И. Лобачевского

anton.dergunov@gmail.com

Поступила в редакцию 27.01.2011

Предложены модель выполнения MPI-приложения и язык описания типов проблем производительности при взаимодействии процессов. Приведен пример описания на этом языке одной проблемы производительности: прием сообщений в неверном порядке.

Ключевые слова: параллельное программирование, MPI, анализ производительности.

Введение

Цель параллельных вычислений - решить задачу быстрее. Чтобы определить, где именно тратится время на вычисления в параллельной программе, используются инструменты для измерения и визуализации производительности. Пример такого инструмента - Intel Trace Analyzer and Collector, который обеспечивает визуализацию трассы выполнения программы. Но трасса параллельной программы зачастую бывает очень большой, поэтому ее сложно анализировать вручную. Разработанная автором система позволяет автоматизировать анализ данных трассы и выявление проблем производительности в MPI программах.

Анализ эффективности взаимодействия процессов при параллельных вычислениях

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

Пусть для решения некоторой задачи с помощью последовательной программы, выполняемой на одном процессоре, нужно время T\, а с помощью параллельной программы, выполня-

емой на p процессорах - Tp. Тогда ускорение (speedup) параллельной программы определяется как: S = T1 / Tp.

Эффективность (efficiency) - мера того, насколько хорошо параллельная программа использует дополнительные процессоры. Она определяется следующим образом:

E = S/p = Т1 /(p*Тр).

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

To = PTp - Ti.

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

_ _ _ + _р

1 p .

Р

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

1) создание процессов и их диспетчеризация;

2) взаимодействие процессов;

3) синхронизация процессов.

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

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

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

Общая архитектура системы

Схема работы системы представлена на рис. 1. Входными данными является трасса выполнения MPI-приложения (полученная, например, с помощью Intel Trace Collector). Трасса конвертируется в специальный формат, в котором выполнение MPI-приложения представлено набором операций и их параметров. Входные данные анализируются модулем автоматического анализа проблем производительности. Для этого используется описание проблем производительности на специальном языке. Результат анализа - список обнаруженных проблем производительности с указанием степени их влияния на общее время работы приложения.

Рис. 1. Схема работы системы

Модель выполнения MPI-приложения

В рамках разработанной системы результат запуска МР1-программы представляется с помощью:

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

• Набором коммуникационных операций, выполненных при ее работе, и параметров этих операций.

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

полей и их значений. В текстовом виде они имеют следующий формат:

<название типа структуры>

<название поля> <значение поля> <название поля> <значение поля>

<название поля> <значение поля>;

Таблица 1

Структура данных типа «program», описывающая общую информацию о запущенном приложении

Название поля Значение Описание

process_count число Количество процессов в МР1 приложении

total_time число Общее время работы приложения

total_communication_time число Суммарное время, затраченное всеми процессами приложения при вызове коммуникационных операций МР1

Таблица 2

Структура данных типа «process», описывающая общую информацию о работе процесса в приложении

Название поля Значение Описание

rank число Ранк процесса

start_time число Время начала работы процесса

finish_time число Время завершения работы процесса

Таблица 3

Структура данных типа «operation point_to_point», описывающая параметры операции двухточечного обмена

Название поля Значение Описание

send_op_name число Название процедуры MPI, осуществляющей посылку данных (например, «MPI_Send» и т.д.)

send_op_type строка Тип процедуры, осуществляющей посылку. Может принимать одно из следующих значений: • «non-blocking» (если процедура посылки данных никогда не блокируется до тех пор, пока не начнется прием; таким свойством обладают следующие процедуры: MPI_Bsend, MPI_Rsend, MPI_Isend, MPI_Ibsend, MPI_Irsend); • «possibly-blocking» (если процедура посылки данных может быть заблокирована до начала приема; таким свойством обладает процедура MPI_Send); • «blocking» (если процедура посылки данных обязательно блокируется до начала приема данных; таким свойством обладает процедура MPI_Ssend).

receive_op_name число Название процедуры MPI, осуществляющей прием данных (например, «MPI_Recv»)

Название поля Значение Описание

receive_op_type строка Тип процедуры, осуществляющей прием. Может принимать одно из следующих значений: • «non-blocking» (если процедура приема данных никогда не блокируется до начала посылки данных; таким свойством обладает процедура MPI_Irecv); • «blocking» (если процедура приема данных обязательно блокируется до начала посылки данных; таким свойством обладает процедура MPI Recv).

send_process_rank число Ранк процесса, передающего сообщение

receive_process_rank число Ранк процесса, принимающего сообщение

send_start_time число Время начала передачи сообщения

send_finish_time число Время окончания передачи сообщения

receive_start_time число Время начала приема сообщения

receive_finish_time число Время окончания приема сообщения

send_source_code строка Место в исходном коде приложения, где вызывается операция посылки данных в формате: <путь к файлу>:<номер строки>

receive_source_code строка Место в исходном коде приложения, где вызывается операция приема данных в формате: <путь к файлу>:<номер строки>

Таблица 4

Структура данных типа «operation collective», описывающая параметры операции коллективного обмена

Название поля Значение Описание

op_name число Название процедуры коллективного обмена MPI

op_type строка Тип процедуры коллективного обмена. Может принимать одно из следующих значений: • «all-to-one» (если коллективная операция собирает данные от всех процессов группы и посылает одному определенному процессу; таким свойством обладают следующие процедуры: MPI_Gather, MPI_Gatherv, MPI_Reduce); • «one-to-all» (если коллективная операция пересылает данные от одного определенного процесса всем процессам группы; таким свойством обладают следующие процедуры: MPI_Bcast, MPI_Scatter, MPI_Scatterv); • «all-to-all» (если коллективная операция пересылает данные от всех процессов группы ко всем процессам этой группы; таким свойством обладают следующие процедуры: MPI_Allgather, MPI_Allgatherv, MPI_Allreduce, MPI_Addtoall, MPI_Alltoallv, MPI_Reduce_scatter, MPI_Scan); • «barrier» (если коллективная операция осуществляет синхронизацию с помощью «барьера» среди всех процессов группы; таким свойством обладает процедура MPI Barrier).

process_rank число Ранк текущего процесса

root_process_rank число Ранк главного процесса. Главным процессом называется: принимающий процесс для операции типа «all-to-one»;

Название поля Значение Описание

передающий процесс для операции типа «опе-1;о-а11»; не определен для операций других типов; в этом случае им считается процесс с минимальным значением ранка среди всех процессов группы, для которой вызывается эта операция.

start_time_min число Минимальное время начала выполнения коллективной операции среди всех процессов группы

start_time_max число Максимальное время начала выполнения коллективной операции среди всех процессов группы

finish_time_min число Минимальное время окончания выполнения коллективной операции среди всех процессов группы

finish_time_max число Максимальное время окончания выполнения коллективной операции среди всех процессов группы

start_time число Время начала выполнения коллективной операции для текущего процесса

finish_time число Время окончания выполнения коллективной операции для текущего процесса

root_start_time число Время начала выполнения коллективной операции для главного процесса

root_finish_time число Время окончания выполнения коллективной операции для главного процесса

source_code строка Место в исходном коде приложения, где вызывается операция коллективного обмена.

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

Поддерживаются следующие типы структур данных:

• Структура типа «program». Описывает общую информацию о приложении.

• Структура данных типа «process». Описывает общую информацию о работе процесса.

• Структура данных типа «operation point_to_point». Описывает параметры операции двухточечного обмена.

• Структура данных типа «operation collective». Описывает параметры операции коллективного обмена.

Для каждой трассы необходимо наличие ровно одного экземпляра структуры типа «pro-gram» и любое количество экземпляров структур типов «process», «operation point_to_point» и «operation collective». В табл. І, 2, З и 4 перечислены поля этих структур.

Ниже приведен простой пример описания работы MPI-приложения:

program

process count 2

total_time 2.471200748267274

total communication time 2.003308519420723;

process

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

rank 0

start time 0.005429202836520959 finish_time 2.4711356559414064;

process

rank 1

start time 0.0

finish time 2.4698204696877464;

operation point to point send op name send op type receive op name receive op type send start time send finish time receive start time receive finish time send process rank receive process rank send source code receive source code

"MPI_Ssend"

"blocking"

"MPI_Recv"

"blocking"

0.4687189432899993

2.4709433821505122

2.4695157509991628

2.469596837040292

0

1

"traces\latereceiver.cpp:20"

"traces\latereceiver.cpp:31"

Здесь описывается программа с двумя процессами. За время работы приложения была осуществлена одна операция двухточечного обмена данными («operation point_to_point»). Процесс номер 0 переслал данные с помощью процедуры MPI_Ssend процессу номер 1, который принял эти данные с использованием процедуры MPI_Recv.

Язык описания типов проблем производительности при взаимодействии процессов в MPI-приложениях

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

problem <название типа проблемы>

description <описание типа проблемы>

find <имя 1-й переменной> type <тип 1-й операции>

find <имя N-й переменной> type <тип N-й операции> where

<условное выражение, где используются имена переменых> severity

<числовое выражение, где используются имена переменых>;

Здесь указывается название типа проблемы производительности и ее текстовое описание. Затем перечисляется, операции каких типов («point_to_point» или «collective») надо найти в трассе. Каждой операции присваивается имя переменной. Условное выражение (указанное после ключевого слова «where») описывает условия, которые обеспечивают наличие проблемы

производительности. Это логическое выражение, в котором можно использовать имена переменных, которые соответствуют операциям из трассы, и напрямую обращаться к полям из структуры «program». Синтаксис логического выражения аналогичен синтаксису в распространенных языках программирования, таких как C++, Java и т.д. Пример логического выражения:

op1.receive_op_type eq "blocking" and op1.send_start_time > op1.receive_start_time

Здесь обеспечивается доступ к полям «гесегее_ор_1уре», «8епё_81ж1;_1;1ше» и «гесегее_ 81ж1;_1;1ше» структуры типа «рот1;_1;о_рот1», которой присвоено имя переменной ор1. Операция ед сравнивает значение полей строкового типа.

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

сле ключевого слова «severity»). В этом выражении также можно использовать имена переменных, которые соответствуют операциям из трассы, и напрямую обращаться к полям из структуры «program». Его синтаксис также соответствует синтаксису в распространенных языках программирования. Результатом вычисления выражения должно быть вещественное число от 0 до 1. Пример числового выражения:

(op1.send_start_time - op1.receive_start_time) / total_communication_time

Рис. 2. Прием сообщений в неверном порядке

Для вычисления выражения определяется разность между значениями полей «send_start_ time» и «receive_op_type» структуры типа «point_to_point», которой присвоено имя переменной opl, и затем это значение делится на значение поля «total_communication_time» из структуры «program».

Рассмотрим в качестве примера проблему производительности «Прием сообщений в не-

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

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

problem "Прием сообщений в неверном порядке"

description "Порядок посылки и приема сообщений не совпадают. Из-за этого блокирующие операции приема затрачивают лишнее время на ожидание приема соответствующего сообщения." find op1 type point to point find op2 type point to point where

op1.receive op type eq "blocking" and

op2.receive op type eq "blocking" and

op1.receive process rank = op2.receive process rank and op1.receive start time < op2.receive start time and op1.send start time > op2.send start time and

op1.send start time > op1.receive start time

severity

(op1.send start time - op1.receive start time) / total communication time;

Здесь осуществляется поиск двух операций типа «рот1;_1;о_рот1;», которые удовлетворяют следующим условиям:

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

• прием данных в этих операциях осуществляется на одном и том же процессе,

• прием данных во время первой операции произошел раньше приема данных для второй операции,

• посылка данных во время первой операции, напротив, произошла позднее посылки данных для второй операции,

• в рамках первой операции посылка данных произошла позднее начала их приема, что обеспечивает ожидание.

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

Заключение

Предложены модель выполнения МР1 приложения и язык описания типов проблем производительности при взаимодействии процессов. Приведен пример описания на этом языке одной проблемы производительности: прием сообщений в неверном порядке. Использование предложенного языка позволяет автоматизировать анализ трассы МР1 программы и находить часто встречающиеся проблемы производительности. В разработанной на основе предложенной модели системе повышения производительности МР1 приложений предусмотрена возможность расширения количества анализируемых проблем с помощью описания новых типов операций и типов проблем производительности. Анализ степени влияния на производительность позволяет ранжировать обнаруженные проблемы и позволяет начать с реше-

ния наиболее важных из них. В [5] перечислены типы проблем производительности, которые были описаны на рассмотренном языке.

Список литературы

1. Foster I. Designing and Building Parallel Programs: Concepts and Tools for Parallel Software Engineering. Boston, 1995. 381 p.

2. Гергель В.П. Теория и практика параллельных вычислений. М.: Бином, 2007. 424 с.

3. Эндрюс Г.Р. Основы многопоточного, параллельного и распределенного программирования. М.: Издательский дом «Вильямс», 2003. 512 с.

4. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. СПб.: БХВ-Петербург, 2004. 608 с.

5. Карпенко С.Н., Дергунов А.В. Модели и программные средства повышения производительности MPI-приложений // Технологии Microsoft в теории и практике программирования: Материалы конференции. Н. Новгород: Изд. Нижегородского госунивер-ситета, 2009. С. 188-192.

A LANGUAGE TO DESCRIBE PERFORMANCE PROBLEM TYPES FOR INTERPROCESS COMMUNICATION IN MPI APPLICATIONS

S.N. Karpenko, A.V. Dergunov

A model of MPI program execution and a language to describe performance problem types for interprocess communication are proposed. The language is illustrated by encoding a performance problem: receiving messages in the wrong order.

Keywords: parallel programming, message passing interface (MPI), performance analysis.

i Надоели баннеры? Вы всегда можете отключить рекламу.