Отладка эффективности DVM-программ

Москва, 1998 г.


Оглавление

1. Введение

2. Характеристики производительности

2.1. Основные характеристики производительности
2.2. Компоненты основных характеристик
2.3. Характеристики выполнения программы на каждом процессоре

3. Методология отладки эффективности

3.1. Представление программы в виде иерархии интервалов
3.2. Рекомендации по анализу характеристик

4. Алгоритмы вычисления характеристик

4.1. Характеристики выполнения программы на каждом процессоре
4.2. Основные характеристики и их компоненты

5. Форма выдачи характеристик

Литература


Аннотация.

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

Ключевые слова: параллельная программа, анализ производительности, эффективность распараллеливания

Работа выполнена при финансовой поддержке Российского фонда фундаментальных исследований, грант 96-01-01745.

1. Введение

Данная работа посвящена проблеме отладки производительности программ, создаваемых в рамках DVM-модели (Distributed Virtual Machine, Distributed Virtual Memory), разработанной в ИПМ им М. В. Келдыша РАН [1].

Эффективность выполнения параллельных программ на многопроцессорных ЭВМ с распределенной памятью определяется следующими основными факторами:

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

Вычислительные программы для последовательных ЭВМ традиционно создавались на языках Фортран 77 и Си. Для многопроцессорных ЭВМ с распределенной памятью (транспьютерные системы, Intel Paragon, IBM SP2, МВС-100) и сетей ЭВМ такие программы в настоящее время, как правило, создаются на языках Фортран 77 и Си, расширенных библиотеками передачи сообщений (PVM, MPI). Параллельная программа в этой модели (модели передачи сообщений) представляет собой систему взаимодействующих программ, каждая из которых имеет собственное пространство имен переменных и собственное адресное пространство, в котором расположены эти переменные.

При использовании DVM-модели программист определяет поведение параллельной программы в глобальном пространстве имен (едином адресном пространстве). Ему предоставляются следующие основные возможности спецификации параллельного выполнения программы:

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

В настоящее время DVM-модель реализована в языках C-DVM и Fortran-DVM. Первый язык представляет собой расширение языка Си с помощью специальных макросов [2] , а язык Fortran-DVM является расширением языка Фортран 77 с помощью специальных комментариев. Такой способ расширения стандартных языков позволил сделать правила параллельного выполнения “невидимыми” для стандартных компиляторов с языков Си и Фортран 77. Поэтому DVM-программа может выполняться и отлаживаться на рабочих станциях как обычная последовательная программа.

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

Для анализа и отладки эффективности выполнения DVM-программ созданы инструментальные средства, функционирующие следующим образом. Система поддержки выполнения DVM-программ во время выполнения программы на многопроцессорной ЭВМ (или однородной сети ЭВМ) накапливает трассировочную информацию в оперативной памяти процессоров, а при завершении выполнения программы записывает эту информацию в файл, который затем обрабатывается на рабочих станциях в среде Windows 95/NT или UNIX специальным инструментом - визуализатором производительности.

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

2. Характеристики производительности

2.1. Основные характеристики производительности

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

Существуют следующие составляющие потерянного времени:

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

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

При выполнении DVM-программы обмен сообщениями между процессорами производится для осуществления следующих коллективных операций:

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

Для оценки суммарных потенциальных потерь, которые могут возникнуть из-за неодновременного запуска коллективных операций на разных процессорах, служит специальная характеристика – синхронизация.

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

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

Рассинхронизация может возникать не только из-за разбалансировки, но также из-за различий во временах завершения выполнения на разных процессорах одной и той же коллективной операции, вызванных особенностями ее реализации на конкретной параллельной ЭВМ. Для оценки величины такой потенциальной рассинхронизации программисту выдается специальная характеристика – разброс времен завершения коллективных операций. Как и время разбалансировки, эта характеристика является интегральной. Она достаточно точно отражает возможные потери из-за рассинхронизации в том случае, когда различия времен выполнения коллективных операций не являются случайными, а определяются, например, топологией коммуникационной сети или функциональной специализацией процессоров (процессор ввода-вывода, процессор-исполнитель редукционных операций, и т.п.).

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

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

2.2. Компоненты основных характеристик

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

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

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

Для уточнения времени коммуникаций оно разлагается на следующие составляющие:

  1. время запуска операций редукции;
  2. время ожидания завершения операций редукции;
  3. время запуска операций обновления теневых элементов;
  4. время ожидания завершения операций обновления теневых элементов;
  5. время загрузки буферов для доступа к удаленным данным;
  6. время динамического перераспределения данных;
  7. время обмена сообщениями при выполнении операций ввода-вывода.

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

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

2.3. Характеристики выполнения программы на каждом процессоре

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

3. Методология отладки эффективности

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

3.1. Представление программы в виде иерархии интервалов

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

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

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

Для выделения последовательности операторов в качестве интервалов служат специальные конструкции в языках C-DVM и FORTRAN-DVM.

В языке C-DVM интервал задается следующим образом:

DVM (INTERVAL [целочисленное выражение]) <оператор>,

а в языке FORTRAN-DVM:

CDVM$ INTERVAL[целочисленное выражение]
. . .
CDVM$ ENDINTERVAL

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

3.2. Рекомендации по анализу характеристик

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

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

Прежде чем перейти к рекомендациям по анализу потерянного времени, сделаем ряд замечаний.

Во-первых, потерянное время (как и коэффициент эффективности распараллеливания) вычисляется, опираясь не на реальное время выполнения программы на одном процессоре, а на прогнозируемое время. Этот прогноз может отличаться от реального времени и в ту, и в другую сторону.

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

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

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

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

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

В случае заметного расхождения времен параллельного и последовательного выполнения программы, можно воспользоваться следующими возможностями DVM-системы.

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

Описанные выше замечания пользователь должен иметь в виду, приступая к анализу потерянного времени и его компонент.

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

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

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

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

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

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

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

4. Алгоритмы вычисления характеристик

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

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

4.1. Характеристики выполнения программы на каждом процессоре

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

  1. Время выполнения каждого интервала (Execution_time) вычисляется как сумма отрезков времени, когда этот интервал был текущим интервалом. Вычисление осуществляется в тот момент, когда интервал перестает быть текущим (при выходе из него или входе во вложенный интервал).
  2. Время ввода-вывода (I/O_time) вычисляется для каждого интервала как сумма времен выполнения выданных в нем (когда он был текущим) операций ввода-вывода, без учета затрат на выполнение требуемых для этого операций обмена сообщениями.
  3. Времена коммуникаций для всех типов коллективных операций (Start_reduction, Wait_reduction, Start_shadow, Wait_shadow, Remote_access, Redistribution и I/O) вычисляются для каждого интервала как суммы времен выполнения операций обмена сообщениями, требуемых для осуществления выданных в нем коллективных операций.
  4. Общее время коммуникаций (Communication) является суммой времен коммуникаций всех коллективных операций. Вычисляется для каждого интервала при выходе из него.
  5. Для каждого параллельного интервала при выходе из него определяется процессорное время параллельных вычислений (CPU_time_Par) путем вычитания общего времени коммуникаций (Communication) и времени ввода-вывода (I/O_time) из времени выполнения (Execution time). Общее процессорное время (CPU_time) данного интервала полагается равным процессорному времени параллельных вычислений.
  6. Для всех остальных интервалов (последовательных или комбинированных) таким же образом определяется процессорное время последовательных вычислений (CPU_time_Seq) и общее процессорное время (CPU_time).
  7. Для каждого параллельного интервала при выходе из него определяется время потерь из-за недостаточного параллелизма при параллельных вычислениях (Insufficient_parallelism_Par) следующим образом:
    Insufficient_parallelism _Par = CPU_time * (n-1) / n

    где n – количество процессоров, выполнявших одни и те же вычисления (в данном случае – одни и те же витки одного параллельного цикла).
    Эта формула отражает тот факт, что если n процессоров выполняли одни и те же вычисления, можно считать полезной только n-ую часть работы каждого процессора.
    Общее время потерь из-за недостаточного параллелизма (Insufficient_parallelism) данного интервала полагается равным той же величине.
  8. Для всех остальных интервалов (последовательных или комбинированных) таким же образом определяется время потерь из-за недостаточного параллелизма при последовательных вычислениях (Insufficient parallelism_Seq) и общее время потерь из-за недостаточного параллелизма (Insufficient_parallelism).
  9. Время перекрытия редукции (Reduction_overlap) равно сумме отрезков времени от окончания выполнения операции запуска редукции (Start_reduction) до начала выполнения соответствующей операции ожидания завершения редукции (Wait_reduction). Если какой-то из таких отрезков времени относится сразу к нескольким интервалам, которые были текущими в течение этого отрезка времени, то для каждого такого интервала вычисляется его доля (например, от начала отрезка до конца интервала, либо от начала отрезка до начала вложенного интервала, либо от начала интервала до конца отрезка, и т.п.).
  10. Время перекрытия обновления теневых граней (Shadow_overlap) вычисляется аналогично как сумма отрезков времени от окончания выполнения операции запуска обновления (Start_shadow) до начала выполнения операции ожидания завершения обновления (Wait_shadow).
  11. Время перекрытия обменов вычислениями (Overlap) вычисляется как сумма двух базовых характеристик - времени перекрытия редукции и времени перекрытия обновления теневых граней.
  12. Число используемых процессоров для данного интервала (Processors) устанавливается в момент первого выхода из интервала, а затем при последующих выходах проверяется, не изменилось ли оно. Если интервал выполняется разным количеством процессоров (что возможно при перераспределении вычислений между процессорами), то некоторые характеристики, введенные в главе 2, теряют для этого интервала смысл. Поэтому при фиксации изменения этой характеристики она устанавливается в “неопределенное” состояние. Отличие этой характеристики от параметра n, упоминавшегося выше, легко показать на примере интервала – параллельного цикла. Для него обычно значение параметра n равно 1 (каждый процессор выполняет свои витки цикла), а значение данной характеристики равно N (все процессоры выполняли один параллельный цикл).
  13. Количество витков параллельных циклов (Parallel_loop_iteration) вычисляется для каждого интервала (параллельного цикла) как суммарное число их витков, выполнявшихся на данном процессоре при многократном входе в данный параллельный цикл.

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

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

  1. Используя накопленные для всех процессоров времена начала выполнения коллективных операций, производится вычисление потерь из-за рассинхронизации (Synchronization). Эти потери определяются для каждого типа коллективных операций как сумма отрезков времени от начала каждой операции на данном процессоре до момента выдачи этой операции всеми процессорами (т.е. до выдачи ее процессором, оказавшимся последним). Характеристика вычисляется для каждого интервала, из которого были выданы соответствующие коллективные операции.
  2. Аналогичным образом, используя накопленные для всех процессоров времена окончания выполнения коллективных операций, производится вычисление потерь из-за разброса времен (Time_variation). Эти потери определяются для каждого типа коллективных операций и равны сумме отрезков времен от окончания каждой операции на данном процессоре до момента окончания этой операции на всех процессорах (т.е. до окончания ее на процессоре, оказавшимся последним).

В) Затем производится вычисление (или коррекция) всех перечисленных выше характеристик (кроме характеристики Processors) для всех составных интервалов. При этом каждая характеристика любого интервала i-го уровня вычисляется посредством добавления к ней одноименных характеристик всех интервалов (i+1)-го уровня, входящих в этот интервал.

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

  1. Используя времена выполнения интервала (Execution_time), вычисленные на тех процессорах, на которых интервал выполнялся, определяются простои на данном процессоре (Idle) как разность между максимальным временем выполнения интервала (на каком-то процессоре) и временем его выполнения на данном процессоре. При этом проверяется, что интервал всегда выполнялся на одних и тех же процессорах. Если это не так (характеристика Processors этого интервала либо не определена на каком-то процессоре, либо имеет разное значение на разных процессорах, либо отличается от реального количества процессоров, на которых интервал выполнялся), то данная характеристика (Idle) считается неопределенной.
  2. Потерянное время (Lost time) вычисляется как сумма ее составляющих – потерь из-за недостаточного параллелизма (Insufficient parallelism), коммуникаций (Communication) и простоев (Idle).
  3. Используя процессорные времена параллельных вычислений интервала (CPU_time_Par), вычисленные на тех процессорах, на которых интервал выполнялся, определяется разбалансировка на данном процессоре (Load_Imbalance) как разность между максимальным временем (на каком-то процессоре) и временем на данном процессоре.
  4. Используя характеристики всех интервалов на всех процессорах, вычисляются их средние значения, а также максимальные и минимальные значения с указанием соответствующего номера процессора.

4.2. Основные характеристики и их компоненты

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

  1. Время выполнения (Execution_time) полагается равным максимальному значению среди времен выполнения данного интервала на каждом процессоре.
  2. Потерянное время (Lost_time) и его составляющие (Insufficient_parallelism, Communication, Idle) со всеми своим компонентами вычисляются путем суммирования одноименных характеристик на всех процессорах.
  3. Аналогичным образом вычисляются характеристики время ввода-вывода (I/O_time), разбалансировка (Load_Imbalance), а также характеристики синхронизация (Synchronization), разброс времен (Time_variation), время перекрытия (Overlap) и все их компоненты.
  4. Число используемых процессоров (Processors) устанавливается равным значению одноименной характеристики, вычисленной для каждого процессора. Если они различаются для некоторых процессоров, то данная характеристика считается неопределенной.
  5. Общее время использования процессоров (Total_time) есть произведение времени выполнения (Execution_time) на число используемых процессоров (Processors).
  6. Полезное процессорное время (Productive_CPU_time) вычисляется как разность между общим процессорным временем (CPU_time) и процессорным временем, потерянным из-за дублирования вычислений на нескольких процессорах (Insufficient_parallelism).
  7. Полезное время (Productive_time) есть сумма двух составляющих – полезного процессорного времени (Productive_CPU_time) и времени ввода-вывода (I/O_time).
  8. Коэффициент эффективности (Efficiency) равен отношению полезного времени к общему времени использования процессоров.

5. Форма выдачи характеристик

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

При выдаче характеристик их компоненты располагаются в той же строке (справа в скобках), либо в следующей строке (справа от символов “*” или “-”).

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

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

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

Ниже приводится пример выдачи характеристик выполнения на 16-ти процессорной ЭВМ МВС-100 программы Jacobi, написанной на языке C-DVM и приведенной в работе [2]. Размер (L) массивов А и В равен 3000, а число итераций равно 20. Запись результатов (массива В) в файл исключена из программы.

Характеристики (Main characteristics и Comparative characteristics) приведены только для интервала нулевого уровня.

INTERVAL ( LINE= 24 SOURCE= Jacobi.cdv ) LEVEL=0 COMB EXE_COUNT=1

--- Main characteristics ---

Efficiency 0.919949  
Execution_time 48.049984  
Processors 16  
Total_time 768.799744  
* Productive_time 707.256508 (Productive_CPU_time 707.080316, I/O_time 0.176192)
* Lost_time 61.543236  
- Insufficient_parallelism 29.595780 (Seq 29.595780, Par 0.000000)
- Communication 29.950592  
- Idle 1.996864  
Synchronization 10.322752  
Time_variation 8.137856  
Overlap 0.413760  
Load_Imbalance 2.333376  

 

  Nop Communication Synchronization Variation Overlap
Start_reduction 20 4.280256 4.302848 0.386112 0.202624
Wait_reduction 20 1.766848 0.362688 0.097024
Start_shadow 20 12.063936 0.139264 2.080576 0.211136
Wait_shadow 20 11.839552 2.067072 2.234944
Remote_access          
Redistribution          
I/O 21   3.450880 3.339200  

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

--- Comparative characteristics ---

  T min Npr T max Npr T mid
Lost_time 3.704516 2 5.809572 16 3.846452
* Insufficient_parallelism 1.681380 16 1.958340 2 1.849736
- Insufficient_parallelism_Seq 1.681380 16 1.958340 2 1.849736
- Insufficient_parallelism_Par          
* Communication 1.718784 10 3.848128 16 1.871912
* Idle 0.000000 2 0.280064 16 0.121144
Execution_time 47.769920 16 48.049984 2 47.925180
* CPU_time 43.917760 16 46.299776 2 46.042256
- CPU_time_Seq 1.793472 16 2.088896 2 1.973052
- CPU_time_Par 42.124288 16 44.215040 6 44.069204
* I/O_time 0.000142 3 0.175481 1 0.011012
Communication 1.718784 9 3.848128 16 1.871912
Synchronization 0.102208 2 4.226048 16 0.645172
Time_variation 0.098368 2 2.120256 16 0.508616
Overlap 0.023488 16 0.029312 10 0.025860
Load_Imbalance 0.000000 2 2.382016 16 0.162280
Processors 16 1 16 1 16
Parallel loop iteration 1613284 16 1691248 2 1686001

 

 

Communication

Synchronization

Variation

Overlap

Start_reduction 0.019840
2
2.453824
16
0.267516
0.001344
3
2.445440
16
0.268928
0.000128           3
0.056768           9
0.024132
0.010944             16
0.016000               8
0.012664
Wait_reduction 0.092416
2
0.149056
10
0.110428
0.000320
3
0.055808
9
0.022668
0.000576            9
0.021504           1
0.006064
 
Start_shadow 0.500608
16
0.899776
2
0.753996
0.000000
10
0.024448
2
0.008704
0.000000            2
0.396608            1
0.130036
0.012352              2
0.014400              7
0.013196
Wait_shadow 0.628032
1
0.862464
3
0.739972
0.000000
2
0.395328
1
0.129192
0.000000            3
0.517760            1
0.139684
 
Remote_access        
Redistribution        
I/O   0.000000
3
1.379712
16
0.215680
0.000000           3
1.379712         16
0.208700
 

 

Литература

  1. N.A.Konovalov, V.A.Krukov, S.N.Mihailov and A.A.Pogrebtsov. “Fortran-DVM language for portable parallel programs development”, Proceedings of Software For Multiprocessors & Supercomputers: Theory, Practice, Experience (SMS-TPE 94), Inst. for System Programming RAS, Moscow, Sept. 1994.
  2. Н.А.Коновалов, В.А.Крюков, А.А.Погребцов, Ю.Л.Сазанов. “C-DVM – язык разработки мобильных параллельных программ.” Препринт ИПМ им. М.В.Келдыша РАН, №86, Москва, 1997 г.
  3. V.I.Arzhanov, A.V.Voronkov, A.S.Golubev, N.A.Konovalov, V.A.Krukov, and E.P.Sychugova. “Development of Portable Program System for Modeling Neutron-Physical Processes in Nuclear Reactor on Parallel Computers.” Proceedings of the Joint International Conference on Mathematical Methods and Supercomputing for Nuclear Applications, vol. 2, 1454-1466 (Saratoga Springs, New York October 5-9, 1997).