Отладка
эффективности параллельных
программ |
DVM-система (на русском) |
Документация |
- дата последнего обновления 18.10.10 -
Оглавление
2 Характеристики производительности
2.1 Основные характеристики производительности
2.2 Компоненты основных характеристик
2.3 Характеристики выполнения программы на каждом процессоре
3 Методология отладки эффективности
3.1 Представление программы в виде иерархии интервалов
3.2 Рекомендации по анализу характеристик
4 Запуск на выполнение со сбором статистики
5 Запуск анализатора производительности
Приложение 1. Перечень выдаваемых характеристик
Приложение 2. Перечень параметров запуска
Приложение 3. Список сообщений об ошибках
Приложение 4. Матрица расхода времени
Эффективность выполнения параллельных программ на многопроцессорных ЭВМ с распределенной памятью определяется следующими основными факторами:
степенью распараллеливания программы - долей параллельных вычислений в общем объеме вычислений;
равномерностью загрузки процессоров во время выполнения параллельных вычислений;
временем, необходимым для выполнения межпроцессорных обменов;
степенью совмещения межпроцессорных обменов с вычислениями.
Методы и средства отладки производительности параллельной программы существенно зависят от той модели, в рамках которой разрабатывается параллельная программа.
Существенным достоинством DVM-модели является то, что в любой момент выполнения программы на любом процессоре всегда известно, какой участок программы выполняется - последовательный или параллельный. Кроме того, известны все точки программы, в которых выполняются операции, требующие синхронизации процессоров. Поэтому имеется возможность количественно оценить влияние на эффективность выполнения программы каждого из четырех перечисленных выше факторов, определяющих эффективность выполнения параллельной программы.
Для анализа и отладки эффективности выполнения DVM-программ созданы инструментальные средства, функционирующие следующим образом. Система поддержки выполнения DVM-программ во время выполнения программы на многопроцессорной ЭВМ (или однородной сети ЭВМ) накапливает информацию с временными характеристиками в оперативной памяти процессоров. При завершении выполнения программы она записывает эту информацию в файл, который затем обрабатывается на рабочих станциях в среде Windows 95/NT или UNIX специальным инструментом - визуализатором производительности.
С помощью визуализатора производительности пользователь имеет возможность получить временные характеристики выполнения его программы с различной степенью подробности.
Возможность различать последовательные и параллельные участки программы позволяет при ее выполнении на многопроцессорной ЭВМ спрогнозировать и выдать время, которое потребуется для выполнения этой программы на однопроцессорной ЭВМ. Это время называется полезным временем (Productive time). Тем самым появляется возможность вычислить главную характеристику эффективности параллельного выполнения - коэффициент эффективности (Parallelization efficiency). Он равен отношению полезного времени к общему времени (Total time) использования процессоров, которое в свою очередь равно произведению времени выполнения (Execution time) программы на многопроцессорной ЭВМ (максимальное значение среди времен выполнения программы на всех используемых ею процессорах) на число используемых процессоров (Processors). Разница между общим временем использования процессоров и полезным временем представляет собой потерянное время (Lost time). Если программист не удовлетворен коэффициентом эффективности выполнения своей программы, то он должен проанализировать составляющие части потерянного времени и причины их возникновения.
Существуют следующие составляющие потерянного времени:
потери из-за недостатка параллелизма, приводящего к дублированию вычислений на нескольких процессорах - недостаточный параллелизм (Insufficient parallelism). Дублирование вычислений осуществляется в двух случаях. Во-первых, последовательные участки программы выполняются всеми процессорами. Во-вторых, витки некоторых параллельных циклов могут быть по указанию программиста полностью или частично размножены.
потери из-за выполнения межпроцессорных обменов - коммуникации (Communication).
потери из-за простоев тех процессоров, на которых выполнение программы завершилось раньше, чем на остальных - простои ( Idle time)
Время выполнения межпроцессорных обменов, помимо времени пересылки данных с одного процессора на другой, может включать в себя и время, которое тратится из-за того, что операция приема сообщения на одном процессоре выдана раньше соответствующей операции посылки сообщения на другом процессоре, это время и составляет потери из-за рассинхронизации (Communication). Поскольку разработчик DVM-программы не оперирует такими низкоуровневыми понятиями, как передача сообщений, то ему должна быть предоставлена информация о рассинхронизации и в других, понятных ему терминах.
При выполнении DVM-программы обмен сообщениями между процессорами производится для осуществления следующих коллективных операций:
глобальная редукция (редукционная операция над локальными значениями редукционных переменных, вычисленными на разных процессорах);
обновление теневых элементов;
загрузка буферов для доступа к удаленным данным;
перераспределение данных;
операции ввода-вывода (осуществляются через один специально выделенный процессор, который принимает данные от других процессоров или рассылает им данные).
Коллективные операции могут выполняться в двух режимах - синхронном и асинхронном. Для выполнения коллективных операций в асинхронном режиме, при котором обеспечивается совмещение межпроцессорных обменов с вычислениями, служат функции запуска операции и ожидания ее завершения. Если коллективная операция запущена (в синхронном или асинхронном режимах) разными процессорами не одновременно, то при ее выполнении могут возникнуть потери из-за рассинхронизации процессоров. Для оценки величины таких потерь для каждой коллективной операции вычисляются потенциальные потери из-за ее неодновременного запуска - время, которое было бы потрачено всеми процессорами на синхронизацию, если бы выполнение любой коллективной операции начиналось бы с синхронизации процессоров (накладные расходы на пересылку синхронизационных сообщений при этом игнорируются).
Для оценки суммарных потенциальных потерь, которые могут возникнуть из-за неодновременного запуска коллективных операций на разных процессорах, служит специальная характеристика – синхронизация (Synchronization).
Основная причина потерь из-за рассинхронизации, на устранение которой должен быть нацелен программист – разбалансировка загрузки процессоров. Разбалансировка может возникать из-за того, что выполняющиеся в параллельном цикле вычисления распределены между процессорами неравномерно.
Если бы при входе в каждый параллельный цикл и при выходе из него производилась бы синхронизация процессоров (межпроцессорный обмен), то разбалансировка загрузки процессоров обязательно приводила бы к потерям из-за рассинхронизации. Однако, поскольку такая синхронизация осуществляется не для всех циклов, то разбалансировка на разных участках программы может компенсироваться и реальные потери могут быть незначительными или вообще отсутствовать. Для оценки возможных потерь из-за разбалансировки программисту выдается некоторая обобщенная характеристика - разбалансировка (Load Imbalance). С целью снижения накладных расходов при вычислении этой характеристики делается предположение, что синхронизация процессоров будет производиться только один раз - при завершении выполнении программы. Поэтому сначала для каждого процессора определяется его суммарная вычислительная загрузка, а затем прогнозируется вызываемая разбалансировкой величина потерь из-за рассинхронизации. Однако, поскольку в реальной программе синхронизация процессоров осуществляется не только при завершении программы, а гораздо чаще, то реальные потери будут превосходить эту величину. Реальные потери из-за рассинхронизации будут еще более превосходить величину разбалансировки в том случае, когда вычислительная загрузка процессоров сильно изменяется при многократном выполнении одного и того же параллельного цикла.
Рассинхронизация может возникать не только из-за разбалансировки, но также из-за различий во временах завершения выполнения на разных процессорах одной и той же коллективной операции, вызванных особенностями ее реализации на конкретной параллельной ЭВМ. Для оценки величины такой потенциальной рассинхронизации программисту выдается специальная характеристика – разброс времен (Time variation) завершения коллективных операций. Как и время разбалансировки, эта характеристика является интегральной. Она достаточно точно отражает возможные потери из-за рассинхронизации в том случае, когда различия времен выполнения коллективных операций не являются случайными, а определяются, например, топологией коммуникационной сети или функциональной специализацией процессоров (процессор ввода-вывода, процессор-исполнитель редукционных операций, и т.п.).
Важной характеристикой, отражающей потенциальное сокращение коммуникационных расходов за счет совмещения межпроцессорных обменов с вычислениями, является время перекрытия (Overlap) обменов вычислениями.
Основные характеристики эффективности являются интегральными характеристиками, позволяющими оценить степень распараллеливания программы и основные резервы ее повышения. Однако для исследования эффективности сложных программ одних интегральных характеристик может оказаться недостаточно. В таком случае программист может получить более подробную информацию о выполнении своей программы и ее отдельных частей.
Некоторые из описанных выше основных характеристик состоят из нескольких компонент, значения которых могут быть выданы программисту.
Полезное время состоит из полезного процессорного времени, системного процессорного времени и времени выполнения операций ввода-вывода (без учета обменов сообщениями в них).
Потери из-за недостаточного параллелизма состоят из двух компонент, позволяющих различать потери в программе пользователя и соответствующие системные расходы.
Время коммуникаций включает в себя время потерь из-за рассинхронизации и время, которое тратится на запуск коллективных операций в асинхронном режиме и которое при нормальном функционировании коммуникационных библиотек (MPI, PVM) должно быть пренебрежимо мало по сравнению с временем коммуникаций.
Для уточнения времени коммуникаций оно разлагается на следующие составляющие:
время операций редукции;
время операций обновления теневых элементов;
время загрузки буферов для доступа к удаленным данным;
время перераспределения данных;
время обмена сообщениями при выполнении операций ввода-вывода.
Реальные и потенциальные потери из-за рассинхронизации, а также потенциальные потери из-за разброса времен завершения выполнения коллективных операций, разлагаются на компоненты аналогичным образом.
Время перекрытия обменов вычислениями вычисляется для всех коллективных операций, выполняемых в асинхронном режиме.
Основой для расчета описанных выше основных характеристик и их компонент являются характеристики выполнения программы на каждом процессоре. Эти характеристики могут быть полезны для более глубокого анализа эффективности выполнения параллельной программы. Помимо значений этих характеристик выдаются также их средние значения, а также максимальные и минимальные значения с указанием соответствующего номера процессора.
Для анализа эффективности выполнения сложных параллельных программ недостаточно иметь характеристики выполнения всей программы целиком, а требуется уметь детализировать эти характеристики применительно к отдельным частям программы. Ниже описываются соответствующие средства, которые позволяют представить выполнение DVM-программы в виде иерархии интервалов, а также приводятся рекомендации по анализу характеристик.
Выполнение всей программы целиком рассматривается как интервал самого высокого (нулевого) уровня. Этот интервал может включать в себя несколько интервалов следующего (первого) уровня. Такими интервалами могут быть параллельные циклы, последовательные циклы, а также любые отмеченные программистом последовательности операторов, выполнение которых всегда начинается с выполнения первого оператора, а заканчивается выполнением последнего, отмеченные программистом интервалы называются пользовательскими. Кроме того, пользовательские интервалы могут быть автоматически разбиты на промежуточные интервалы. Промежуточный интервал в динамике образуется от начала выполнения одной коллективной операции или от начала пользовательского интервала до начала выполнения другой или до конца пользовательского интервала соответственно. Операция ввода/вывода, хотя и является коллективной операцией, в данном случае не ведет к порождению промежуточного интервала. Интервалы первого уровня могут в свою очередь включать в себя интервалы второго уровня, и т.д. Промежуточные интервалы не включают в себя интервалы более низкого уровня, они все одноуровневые. В пользовательском интервале, в котором образуются промежуточные, все остальные интервалы игнорируются.
Все описанные выше характеристики вычисляются не только для всей программы, но и для каждого ее интервала. При этом многократное выполнение интервала может рассматриваться (с некоторой долей условности) как выполнение на тех же процессорах отдельной программы, состоящей из развернутой последовательности тех операторов интервала, которые были выполнены при реальном прохождении параллельной программы. Фактически же, характеристики таких многократно выполняемых интервалов накапливаются при каждом их выполнении. При этом интервалы, входящие в состав одного и того же интервала более высокого уровня, идентифицируются именем файла с исходным текстом программы и номером строки в нем, соответствующим началу интервала, а также, возможно, некоторым приписанным ему программистом целочисленным номером.
Разбиением программы на интервалы пользователь управляет при ее компиляции. Он может задать следующие режимы:
режим, при котором интервалами будут все параллельные циклы и охватывающие их последовательные циклы (опция –e1);
режим, при котором интервалами будут все отмеченные пользователем в программе последовательности операторов (опция –e2);
объединение предыдущих двух режимов (опция –e3);
режим, когда интервалами будут все параллельные и последовательные циклы, а также отмеченные пользователем последовательности операторов (опция –e4).
Для выделения последовательности операторов в качестве интервалов служат специальные конструкции в языках C-DVM и FORTRAN-DVM.
В языке C-DVM интервал задается следующим образом:
DVM (INTERVAL [целочисленное выражение]) <оператор>,
а в языке FORTRAN-DVM:
CDVM$ INTERVAL[целочисленное
выражение]
. . .
CDVM$ END INTERVAL
Выделив, например, тело цикла как интервал и задав в качестве целочисленного выражения индексную переменную цикла, можно оформить каждый виток цикла отдельным интервалом. Подобным образом можно получить характеристики четных и нечетных витков цикла, либо характеристики выполнения процедуры при заданных значениях ее параметров.
При разработке параллельной программы пользователь, как правило, преследует одну из двух возможных целей – обеспечить решение задачи в приемлемые сроки, либо создать программу, способную эффективно решать на различных параллельных ЭВМ задачи определенного класса.
В первом случае, если время выполнения (Execution time) программы удовлетворяет пользователя, то другие характеристики его могут уже не интересовать. Во втором случае главным критерием для пользователя является коэффициент эффективности распараллеливания. Если время выполнения или коэффициент эффективности (Parallelization efficiency) не удовлетворяют пользователя, то ему необходимо анализировать потерянное время (Lost time) и его компоненты.
Прежде чем перейти к рекомендациям по анализу потерянного времени, сделаем ряд замечаний.
Во-первых, потерянное время (как и коэффициент эффективности распараллеливания) вычисляется, опираясь не на реальное время выполнения программы на одном процессоре, а на прогнозируемое время, оно называется полезным временем (Productive time). Этот прогноз может отличаться от реального времени и в ту, и в другую сторону.
Реальное время может быть больше прогнозируемого из-за того, что при выполнении программы на одном процессоре одни и те же вычисления могут осуществляться медленнее, чем при выполнении на нескольких процессорах. Это объясняется тем, что при изменении объема используемых при вычислениях данных меняется скорость доступа к ним через кэш-память. Поскольку производительность современных процессоров сильно зависит от эффективности использования кэш-памяти, то реальное время может заметно превысить прогнозируемое.
Реальное время может быть меньше прогнозируемого, поскольку при прогнозе учитываются не все накладные расходы на поддержку выполнения параллельной программы. Эти неучтенные расходы, например, поиск информации в системных таблицах при выполнении некоторых часто используемых функций (замерять время выполнения которых невозможно без внесения неприемлемых искажений в выполнение программы), могут значительно сократиться при уменьшении количества процессоров до одного.
В результате влияния эффективности использования кэш-памяти и системных накладных расходов при выполнении программы на разных конфигурациях параллельной ЭВМ будут выдаваться различные значения полезного времени. Поэтому, если есть возможность выполнить программу на одном процессоре (а она может требовать гораздо больше оперативной памяти, чем имеется на одном процессоре), то желательно это сделать для получения представления об отличиях прогнозируемых времен от реального времени.
Во-вторых, время выполнения параллельной DVM-программы на одном процессоре может значительно отличаться от времени ее выполнения как последовательной программы. Это может быть следствием следующих причин:
Доступ к распределенным данным в параллельной программе отличается от доступа к ним в последовательной программе. Дополнительные накладные расходы, появляющиеся в параллельной программе, могут увеличить время ее выполнения на 10-30 процентов. Однако в параллельной программе может быть проведена такая оптимизация доступа к данным, которая для некоторых программ приведет к ускорению их выполнения по сравнению с последовательным случаем.
Трансформация DVM-программы в программу на стандартных языках Фортран 77 или Си может привести к различиям в оптимизации программ стандартными компиляторами. В результате, параллельная программа может выполняться либо медленнее, либо быстрее. Особенности оптимизации программ современными компиляторами существенно (десятки и сотни процентов) определяют эффективность их выполнения.
Некоторые накладные расходы на поддержку выполнения параллельной программы могут значительно замедлить ее выполнение (например, операции запроса и освобождения памяти в последовательной программе могут превратиться в параллельной программе в гораздо более сложные операции создания и уничтожения распределенного массива).
Поэтому, если есть возможность выполнить программу как обычную последовательную программу на одном процессоре (если это нельзя сделать на параллельной ЭВМ, то может быть это окажется возможным на рабочей станции), то желательно это сделать.
В случае заметного расхождения времен параллельного и последовательного выполнения программы, можно воспользоваться следующими возможностями DVM-системы.
DVM-программа может быть скомпилирована в специальном режиме, в котором она отличается от последовательной программы очень незначительно, тем не менее, влияние этих отличий на время выполнения надо тоже проверять. Она содержит средства накопления временных характеристик на различных интервалах своего выполнения. Можно получить эти характеристики при последовательном выполнении и сравнить их с соответствующими характеристиками при параллельном выполнении на одном процессоре.
Описанные выше замечания пользователь должен иметь в виду, приступая к анализу потерянного времени и его компонент.
Сначала следует оценить три компоненты потерянного времени для интервала нулевого уровня (всей программы). Наиболее вероятно, что основная доля потерянного времени приходится на одну из первых двух компонент: недостаточный параллелизм (Insufficient parallelism ) или коммуникации (Communication).
В случае если причиной оказался недостаточный параллелизм, необходимо уточнить, на каких участках он обнаружен – последовательных или параллельных. В последнем случае причина может быть очень простой – неверное задание матрицы процессоров при запуске программы или неверное распределение данных и вычислений. Если же недостаточный параллелизм обнаружен на последовательных участках, то причиной этого, скорее всего, является наличие последовательного цикла, выполняющего большой объем вычислений. Устранение этой причины может потребовать больших усилий.
В том же случае, если основной причиной потерь являются коммуникации, то необходимо, прежде всего, обратить внимание на характеристику потери из-за рассинхронизации . Если ее значение близко к размерам потерь из-за коммуникаций, то необходимо рассмотреть характеристику разбалансировка (Load Imbalance), поскольку именно разбалансировка вычислений в параллельном цикле является наиболее вероятной причиной рассинхронизации и больших потерь на коммуникациях. Если величина разбалансировки намного меньше величины синхронизации, то необходимо обратить внимание на величину разброса времен (Time variation) коллективных операций. Если рассинхронизация не является следствием разброса времен завершения коллективных операций, то ее возможной причиной могут быть разбалансировки некоторых параллельных циклов, которые на рассматриваемом интервале выполнения программы могли взаимно компенсироваться. Поэтому имеет смысл перейти к рассмотрению характеристик разбалансировки на интервалах более низкого уровня и в этом случае лучше воспользоваться возможностью разбиения пользовательского интервала на промежуточные, поскольку они образуются в динамике и более точно покажут была ли разбалансировка на параллельных циклах, выполнявшихся до коллективной операции.
Второй вероятной причиной больших потерь из-за рассинхронизации может быть рассинхронизация процессоров, которая возникает при выдаче операций ввода-вывода. Это происходит из-за того, что основная работа (обращение к функциям ввода-вывода операционной системы) производится на процессоре ввода-вывода, а остальные процессоры в это время ждут получения от него данных или информации о завершении коллективной операции. Эту причину потерь легко обнаружить, обратив внимание на соответствующую компоненту характеристики коммуникации – потери из-за коммуникаций при вводе-выводе.
Еще одной причиной больших потерь из-за коммуникаций могут оказаться задержки при запуске коллективных операций в асинхронном режиме. В этом случае надо обращаться к лицам, сопровождающим коммуникационную библиотеку, используемую DVM-системой.
Основной причиной потерь из-за коммуникаций может быть и просто большое количество операций редукции или загрузки требуемых данных с других процессоров (обновление теневых граней или удаленный доступ). В этом случае может помочь реорганизация программы с целью объединения разрозненных операций редукции или обновления теневых граней в групповые операции.
Возможен и другой подход к анализу характеристик, когда сначала анализируются коэффициенты эффективности и потерянное время на различных интервалах первого уровня, затем второго уровня, и т.д. В результате определяется критический участок программы, на анализ характеристик которого и направляются основные усилия. При этом необходимо иметь в виду, что причиной потерь на данном интервале из-за рассинхронизации и простоев могут быть разбалансировки и разбросы времен не только на этом интервале, но и на других, выполнявшихся до него интервалах. Для устранения влияния разбалансировки и разброса времен на предыдущих интервалах используется барьерная синхронизация процессоров.
При отладке производительности программы пользователь не обязательно должен запускать ее с тем большим объемом вычислений, который будет характерен для использования программы при решении реальных задач. Он может ограничить, например, количество регулярно повторяющихся внешних итераций до одной-двух итераций. При этом коэффициент эффективности программы, существенно зависящий от потерь на тех участках программы, которые выполняются до начала первой итерации или после окончания последней итерации, может значительно снизиться. Однако пользователь может оформить выполнение внешних итераций в виде отдельного интервала и отлаживать его производительность по той же методике, которая была описана выше применительно к программе целиком.
Для сбора информации о производительности DVM-программы при ее запуске на многопроцессорной ЭВМ или сети рабочих станций параметр Is_DVM_STAT (признак сбора статистики) должен быть равен 1.
После окончания счета должен создаться файл, имя которого задается параметром StatFileName, как правило это sts. Этот файл запакован, уровень сжатия задается параметром StatCompressLevel, схема сжатия задается параметром StatCompressScheme. В том случае, когда задается уровень упаковки (0-9), то в зависимости от схемы сжатия (0 или 1) к имени файла добавится расширение .gz или .gz+. Чтобы получить не запакованный файл со статистической информацией, надо задать уровень сжатия равным -1 (StatCompressLevel =-1), в этом случае расширение к имени файла не добавится. На вычислительных машинах, на которых используется система очередей, к названию файла со статистикой добавляется имя задачи, которое в свою очередь формируется из имени программы, числа процессоров и номера запуска.
Таким образом имя файла со статистикой формируется следующим образом:
<statistics file name>:= [<task_name.>]<file name>[.gz[+]]
<task_name>:=<program_name>.<number of processors>.<execute number>
С помощью параметров можно изменять длину буфера статистики (StatBufLength), в котором накапливаются характеристики выполнения каждого интервала, и максимальный уровень вложенности интервалов (MaxIntervalLevel). Уменьшение уровня вложенности интервалов позволяет уменьшить количество интервалов, для которых будет собираться статистика, и сократить тем самым объем статистики.
Если параметр IsTimeVariation равен единице, то буфер статистики используется также для накопления информации о временах запуска и завершения всех коллективных операций. Эти времена используются визуализатором производительности для вычисления потенциальных потерь из-за рассинхронизации и разброса времен, а также для определения потенциального сокращения коммуникационных расходов из-за совмещения обменов с вычислениями. Для подсчета реальных потерь из-за рассинхронизации следует задать параметр IsSynchrTime. Если объема буфера недостаточно для накопления информации обо всех выполненных коллективных операциях, то об этом выдается предупреждающее сообщение. При этом надо учитывать, что визуализатор производительности, при вычислении выше перечисленных характеристик будет использовать неполную информацию.
Параметр IntervalBarrier используется для барьерной синхронизации процессоров в начале каждого интервала.Для создания промежуточных интервалов внутри пользовательского интервала следует установить признак IntermediateIntervalsLevel на 1 большим чем уровень пользовательского интервала. Начало каждой коллективной операции приведет к возникновению промежуточного интервала типа коллективной операции, а также появится интервал типа PREFIX, в котором будут храниться времена от начала выполнения пользовательского интервала до начала выполнения первой коллективной операции. Поскольку информация о коллективных операциях накапливается только при задании параметра IsTimeVariation, то следует не забыть его установить.
Параметры запуска, их предназначение и их возможные значения приведены в Приложении 2. Значения этих параметров устанавливаются по умолчанию в базовом и пользовательском (usr.par) наборе и изменять их следует в пользовательском наборе.
Если при сборе данных были обнаружены ошибки, то файл все равно может создаться, а сообщение об ошибке будет выведено на экран или в файл.
Список сообщений приведен в Приложении 3.
Для получения временных характеристик по интервалам следует выполнить команду:
dvm pa <statistics file name> <file name> [-l <level>] [-n <list>]
[-c <compression level>]
<statistics file name> |
– |
имя файла со статистической информацией, как оно формируется описано в п. 4. |
<file name> |
– |
имя файла вывода, |
<level> |
– |
номер уровня вложенности интервалов, |
<list> |
– |
список номеров процессоров, 0 – без характеристик по процессорам, |
<compression level> |
– |
уровень упаковки файла вывода (0-9), -1 – без упаковки. |
Параметры могут задаваться в произвольном порядке, только имя файла со статистикой должно предшествовать имени файла вывода. Ограничить размер файла вывода можно с помощью необязательных параметров, если этот способ не подходит, то уменьшить размер файла можно с помощью увеличения уровня упаковки файла вывода. Есть еще параметр для выдачи матрицы расхода времени, но он редко используется, поэтому его описание вынесено в Приложение 4.
Запуск команды
dvm pa –h
выдаст описание параметров команды.
Пример команды запуска анализатора производительности:
dvm pa sts jac.pa -n 1-5,7 -l 2
после выполнения этой команды в файл jac.pa будут выведены только характеристики выполнения программы на процессорах с номерами: 1,2,3,4,5,7 для всех интервалов с уровнем вложенности 2 и меньше.
Все характеристики записываются в текстовом виде в файл, имя которого пользователь задает при вызове анализатора производительности. Для каждого интервала выдается следующая информация:
имя файла с исходным текстом DVM-программы и номер первого оператора интервала в нем (SOURCE, LINE);
тип интервала – вся программа, параллельный цикл (PAR), последовательный цикл (SEQ) или выделенная пользователем последовательность операторов (USER);
номер уровня вложенности (LEVEL);
количество входов (и выходов) в интервал (EXE_COUNT);
значение выражения, заданного при описании интервала средствами языка (EXPR);
основные характеристики выполнения и их компоненты (Main characteristics);
минимальные, максимальные и средние значения характеристик выполнения программы на каждом процессоре (Comparative characteristics);
характеристики выполнения программы на каждом процессоре (Execution characteristics on processors).
При выдаче характеристик их компоненты располагаются в той же строке (справа в скобках), либо в следующей строке (справа от символов “*” или “-”).
Компоненты некоторых характеристик, связанных с выполнением коллективных операций, выдаются в виде столбцов таблицы, где строки соответствуют типу коллективной операции, а столбцы - характеристикам. Один из столбцов (Nop) этой таблицы содержит количества операций каждого типа, которые являются характеристиками, не зависящими от числа процессоров, используемых для выполнения программы.
Информация о минимальных, максимальных и средних значениях таких характеристик оформлена в таблицу аналогичным образом.
Можно уменьшить объем выдаваемой информации, задав параметр –n 0, т.е. отказаться от выдачи характеристик по процессорам. Кроме того, можно ограничить количество интервалов, для которых будут выдаваться все характеристики, указав максимальный номер их уровня вложенности. Можно задать список номеров процессоров, ограничив тем самым объем информации с характеристиками выполнения программы на каждом процессоре. Некоторые характеристики вообще не выдаются в том случае, если их значения равны нулю.
В самом начале файла выдается информация о процессорной решетке, имя платформы и номер версии, где считалась задача и собиралась статистика, а также номер версии и имя платформы, где статистика выводилась в файл. В конце файла выдаются логические имена, номера процессоров и их производительность, а также имена и номера процессоров, на которых производительность достигала минимального и максимального уровня.
Ниже приводится пример выдачи характеристик выполнения на кластере из 4-х рабочих станций SGI O2 программы Jacobi, написанной на языке Fortran-DVM. Размер (L) массивов А и В равен 1200, а число итераций равно 4. Запись результатов (массива В) в файл исключена из программы.
Характеристики (Main characteristics и Comparative characteristics) приведены только для интервала нулевого уровня.
PROGRAM JACOB
PARAMETER (L=1200, ITMAX=4)
REAL A(L,L), EPS, MAXEPS, B(L,L)
CDVM$ PROCESSORS P(2,2)
CDVM$ DISTRIBUTE A ( BLOCK, BLOCK) ONTO P
CDVM$ ALIGN B( I, J ) WITH A( I, J )
C arrays A and B with block distribution
PRINT *, '********** TEST_JACOBI **********'
MAXEPS = 0.5E - 7
CDVM$ PARALLEL (J,I) ON A(I, J)
C nest of two parallel loops, iteration (i,j) will be executed on
C processor, which is owner of element A(i,j)
DO 1 J = 1, L
DO 1 I = 1, L
A(I, J) = 0.
IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L) THEN
B(I, J) = 0.
ELSE
B(I, J) = ( 1. + I + J )
ENDIF
1 CONTINUE
DO 2 IT = 1, ITMAX
EPS = 0.
CDVM$ PARALLEL (J, I) ON A(I, J), REDUCTION ( MAX( EPS ))
C variable EPS is used for calculation of maximum value
DO 21 J = 2, L-1
DO 21 I = 2, L-1
EPS = MAX ( EPS, ABS( B( I, J) - A( I, J)))
A(I, J) = B(I, J)
21 CONTINUE
CDVM$ PARALLEL (J, I) ON B(I, J), SHADOW_RENEW (A)
C Copying shadow elements of array A from
C neighboring processors before loop execution
DO 22 J = 2, L-1
DO 22 I = 2, L-1
B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J)+
* A( I, J+1 )) / 4
22 CONTINUE
PRINT *, 'IT = ', IT, ' EPS = ', EPS
IF ( EPS . LT . MAXEPS ) GO TO 3
2 CONTINUE
3 CONTINUE
C OPEN (3, FILE='JACOBI.DAT', FORM='FORMATTED')
C WRITE (3,*) B
C CLOSE (3)
END
INTERVAL (NLINE=8 SOURCE=jac.fdv ) LEVEL=0 EXE_COUNT=1
--- Main characteristics ---
Parallelization efficiency |
0.4952 |
|
Execution time |
3.2723 |
|
Processors |
4 |
|
Total time |
13.0891 |
|
¨Productive time |
6.4814 |
( CPU= 6.1880 Sys= 0.2897 I/O= 0.0037 ) |
¨ Lost time |
6.6077 |
|
- Insufficient parallelism |
1.0294 |
( User= 0.1491 Sys= 0.8803 ) |
- Communication |
3.2100 |
( Real_sync= 3.1443 Starts= 0.0267 ) |
- Idle time |
2.3683 |
|
Load imbalance |
0.1131 |
|
Synchronization |
6.1627 |
|
Time variation |
3.0460 |
|
Overlap |
0.0004 |
|
|
Nop |
Communic |
Real_sync |
Synchro |
Variation |
Overlap |
I/O |
5 |
0.0000 |
0.0000 |
3.0368 |
3.0358 |
0.0000 |
Reduction |
4 |
3.0644 |
3.0413 |
3.0130 |
3.0130 |
0.0001 |
Shadow |
4 |
0.1189 |
0.1030 |
0.1129 |
0.0054 |
0.0003 |
Замечание. Отсутствие потерь из-за коммуникаций при вводе-выводе объясняется тем, что в программе имеются только операторы печати нераспределенных данных. Поскольку такие данные имеют одинаковые значения на всех процессорах, то операторы печати выполняются процессором ввода-вывода без обмена сообщениями с другими процессорами.
--- Comparative characteristics ---
|
T min |
Npr |
T max |
Npr |
T mid |
Lost time |
1.6245 |
1 |
1.6636 |
2 |
1.6519 |
¨User insufficient par. |
0.0324 |
2 |
0.0408 |
3 |
0.0373 |
¨Sys insufficient par. |
0.2061 |
4 |
0.2346 |
3 |
0.2201 |
¨Idle time |
0.0000 |
1 |
0.0409 |
2 |
0.5921 |
¨Communication |
0.0781 |
4 |
1.3733 |
1 |
0.8025 |
Real synchronization |
0.8025 |
4 |
1.3563 |
1 |
0.7861 |
Synchronization |
0.0715 |
4 |
2.7026 |
1 |
1.5407 |
Variation |
0.0104 |
4 |
1.3528 |
1 |
0.7615 |
Overlap |
0.0000 |
2 |
0.0003 |
3 |
0.0001 |
Load imbalance |
0.0000 |
1 |
0.0409 |
2 |
0.0283 |
Execution time |
1.9373 |
4 |
3.2723 |
1 |
2.6802 |
User CPU time |
1.5315 |
3 |
1.5768 |
1 |
1.5470 |
Sys CPU time |
0.0678 |
4 |
0.0775 |
3 |
0.0724 |
I/O time |
0.0001 |
1 |
0.0019 |
2 |
0.0009 |
Start operation |
0.0036 |
4 |
0.0089 |
2 |
0.0067 |
Processors |
4 |
1 |
4 |
4 |
4 |
|
Communic |
Real_sync |
Synchro |
Variation |
Overlap |
I/O Tmin I/O Tmax I/O Tmid |
0.0000 1 0.0000 4 0.0000 |
0.0000 1 0.0000 4 0.0000 |
0.0058 4 1.3496 1 0.7592 |
0.0066 4 1.3494 1 0.7589 |
0.0000 1 0.0000 4 0.0000 |
Reduction Tmin Reduction Tmax Reduction Tmid |
0.0303 4 1.2990 1 0.7661 |
0.0212 4 1.2920 1 0.7603 |
0.0231 4 1.2849 1 0.7532 |
0.0000 3 0.0025 4 0.0012 |
0.0000 2 0.0001 1 0.0000 |
Shadow Tmin Shadow Tmax Shadow Tmid |
0.0029 3 0.0687 1 0.0297 |
0.0000 2 0.0643 1 0.0257 |
0.0000 3 0.0681 1 0.0282 |
0.0000 3 0.0022 2 0.0013 |
0.0000 1 0.0003 3 0.0001 |
Основные характеристики и их компоненты
Коэффициент эффективности (Parallelization efficiency) равен отношению полезного времени к общему времени использования процессоров.
Время выполнения (Execution time).
Число используемых процессоров (Processors).
Общее время использования процессоров (Total time) - произведение времени выполнения (Execution time) на число используемых процессоров (Processors).
Полезное время (Productive time) - сумма трех составляющих – полезного процессорного времени (CPU), времени ввода-вывода (I/O) и полезного системного времени (Sys).
Потерянное время (Lost_time).
Недостаточный параллелизм (Insufficient_par) и его компоненты
Коммуникации (Communication) и все компоненты.
Простои (Idle time).
Разбалансировка (Load_Imbalance).
Потенциальные потери из-за синхронизации (Synchronization) и все компоненты.
Потенциальные потери из-за разброса времен (Time_variation) и все компоненты.
Время перекрытия (Overlap) и его компоненты.
Характеристики выполнения программы на каждом процессоре
Потерянное время (Lost time) - сумма его составляющих – потерь из-за недостаточного параллелизма (User insufficient_par), системных потерь из-за недостаточного параллелизма (Sys insufficient_par), коммуникаций (Communication) и простоев (Idle time).
Потери из-за недостаточного параллелизма (User insufficient_par).
Системные потери из-за недостаточного параллелизма (Sys insufficient_par).
Простои на данном процессоре (Idle time) - разность между максимальным временем выполнения интервала (на каком-то процессоре) и временем его выполнения на данном процессоре.
Общее время коммуникаций (Communication).
Реальные потери из-за рассинхронизации (Real synchronization).
Потенциальные потери из-за рассинхронизации (Synchronization).
Потенциальные потери из-за разброса времен (Variation).
Время перекрытия асинхронных операций (Overlap).
Разбалансировка (Load_imbalance) вычисляется как разность между максимальным процессорным временем (CPU+Sys) и соответствующим временем на данном процессоре.
Время выполнения интервала (Execution_time).
Полезное процессорное время (User CPU_time).
Полезное системное время (Sys CPU_time).
Время ввода-вывода (I/O_time).
Время запусков коллективных операций (Start operation).
Число используемых процессоров для данного интервала (Processors).
Времена коммуникаций для всех типов коллективных операций (Reduction, Shadow, Remote_access, Redistribution и I/O), за исключением времен их запусков.
Реальные потери из-за рассинхронизации для всех типов коллективных операций.
Потенциальные потери из-за рассинхронизации для всех типов коллективных операций.
Потенциальные потери из-за разброса времен для всех типов коллективных операций.
Время перекрытия для всех типов коллективных операций.
Параметр |
Действие |
Значения |
Is_DVM_STAT -
|
Собирать или не собирать статистику |
1 или 0 (1) |
StatFileName
|
Имя файла статистики |
Любое имя (sts) |
StatCompressLevel
|
Уровень сжатия файла со статистикой |
-1 не паковать 0-9 – уровень упаковки (0) |
StatCompressScheme
|
Запаковывать файл со статистикой на каждом процессоре или на процессоре ввода/вывода |
0 – запаковывать на процессоре ввода-вывода,1 – нет (1) |
StatBufLength
|
Длина буфера статистики |
Любое положительное число (100000) |
MaxIntervalLevel
|
Уровень вложенности интервалов |
Любое положительное число (3) |
IsSynchrTime
|
Накапливать или нет реальные времена синхронизации |
1 или 0 (0) |
IsTimeVariation
|
Накапливать или нет времена коллективных операций |
1 или 0 (0) |
IntermediateIntervalsLevel
|
Уровень промежуточных интервалов |
Любое положительное число (0) |
IntervalBarrier
|
Барьерная синхронизация процессоров в начале интервала |
1 или 0 (0) |
Statistics: not enough memory for interval, data were not wrote to the file.
Не хватает памяти, следует уменьшить количество интервалов.
Statistics: number of ends of intervals > number of begins of intervals, data were not wrote to the file.
Количество концов интервалов больше количества начал, нарушение списка интервалов, следует обращаться к разработчикам.
Statistics: end of interval nline = <N>, name = <name>, no end nline = <N> name =<name>, data were not wrote to the file.
Завершение не текущего интервала, возникает при выходе из интервала не по последнему оператору, например внутри интервала есть оператор break.
Statistics: StatBufLength=<length>, increase buffer's size by <N> bytes, data were not wrote to the file.
Мал буфер статистики, его следует увеличить на указанное число байт.
Statistics: StatBufLength=<length>, not enough memory for times of collective operations, increase buffer's size by <N> bytes, only part of times of collective operations and all intervals were wrote to the file.
Буфера статистики не хватает для записи информации о коллективных операциях, увеличить размер буфера на указанное количество байт.
Statistics warning:In the interval used return or goto, times may be incorrect, name=<name> nline=<N>.
Выход из последнего интервала не по последнему оператору, но это выход из всей программы.
Все характеристики вычисляются из времен, накопленных в файле со статистикой, в этом файле для каждого интервала содержится матрица расхода времени. Она имеет вид
IM[NGrp][NGrp][NTime]
NGrp – число групп, равно 18
NTime – Lost time, Product time, Call count
и описана в документе «Система поддержки параллельных программ. Детальный дизайн».
Для самого детального просмотра информации используется выдача значений матрицы расхода времени, но эта информация нужна скорее разработчикам системы, чем ее пользователям. Она выдается в виде таблицы, где крайний левый столбец - значение индекса (константа имени группы), а остальные столбцы содержат число операций / число процессоров (Call count), полезное время (Product time) и потерянное время (Lost time).
dvm pa <statistics file name> <file name> [-m <matrix>]
Первые два параметра описаны ранее в п. 5.
<matrix > – <i[:<group name>]>|<j[:<group name>]>
i - вывод
значений элементов строки матрицы расхода времени (суммируются все элементы
2-ого измерения матрицы).
j - вывод значений элементов столбца матрицы расхода
времени (суммируются все элементы 1-ого измерения матрицы).
<group name> – значение индекса (имя группы) строки или столбца матрицы расхода времени интервала, задается только для поэлементной выдачи матрицы для заданной группы
Имена групп :
UserGrp|MsgPasGrp|StartRedGrp|WaitRedGrp|RedGrp|StartShdGrp|WaitShdGrp|
ShdGrp|DistrGrp|ReDistrGrp|MapPLGrp|DoPLGrp|ProgBlockGrp|IOGrp|
RemAccessGrp|UserDebGrp|StatistGrp|SystemGrp
Пример команды запуска анализатора производительности:
dvm pa sts jac.pa –m i
dvm pa sts jacug.pa –m i:UserGrp
После выполнения первой команды в файле jac.pa появится информация для всех процессоров о потерянном и полезном времени и количестве вызовов операций для всех групп. Все значения просуммированы по 2-ому измерению. А после выполнения второй команды в файле jacug.pa появится информация о значениях элементов группы UserGrp, т.е. будут показаны значения матрицы IM[UserGrp][j][NTime], где 0<j<NGrp. Таким образом можно посмотреть из суммы каких элементов получились значения для данной группы в 1-ом случае.