Профилирование – ключ к спасению

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

Появление новых процессоров

Значительные изменения происходят в мире процессоров в данный момент. Последние примерно 15 лет и мир HPC, и корпоративный мир делали выбор, по большей части, в пользу x86 в качестве процессорной технологии. Однако и другие процессорные технологии, например, архитектура POWER IBM, используются до сих пор, но в меньшей степени по сравнению с x86.

В последние годы наблюдается развитие таких акселераторов, как GPU (графические процессоры); специализированных процессоров, которые используют множество классических ядер x86, например, Intel Xeon Phi; FPGA (программируемые пользователем матрицы логических элементов); и DSP (цифровые сигнальные процессоры). Эти акселераторы обеспечивают гораздо более высокую производительность в программных приложениях и алгоритмах, которые могут использовать их преимущества по сравнению с обычными процессорами. Кроме того, производительность на ватт этих акселераторов привлекает ряд классов приложений.

Из всех альтернатив x86 самой известной является ARM, которая разработала такие технологии, как Raspberry Pi , а также некоторые из серверных продуктов, которые рассмотрели Dell, HP и Boston Limited. Даже AMD объявила о создании 64-разрядного процессора ARM на основе своих процессоров Opteron. Эти процессоры ориентированы на очень экономичные вычисления, то есть на выполнение больших объемов вычислений при очень низких уровнях мощности. Интеграторы приняли ARM процессоры и создали системы на кристалле (SoCs), сочетающие в себе процессор и вспомогательные чипы и интерфейсы в очень компактном корпусе, который использует, как правило, меньше, чем 15Вт под нагрузкой.

 

Китайское правительство также инвестирует в некоторые новые процессоры, которые используют определение MIPS64. Процессоры семейства Loongson разрабатывались в течение нескольких лет. В начале 2013 года разработчики Института Вычислительных Технологий (ICT) при Китайской Академии Наук представит последнюю разработку под названием Godson-3B. Этот процессор имеет восемь ядер, работающих на 1.35GHz, достигающий теоретического максимума 172.8GFLOPS но использующий только 40Вт мощности.

Другие интересные новые чипы представляют собой классический процессор с акселератором на одном кристалле, например, линия AMD Fusion product под названием APU (ускоренное обрабатывающее устройство). Он сочетает в себе процессор с GPU на одном кристалле. Например, недавно представленный AMD A10-5800K имеет следующие технические характеристики:

  • 4 ядра 3.8 ГГц (турбо до 4.2ГГц)
  • кэш 4 Мб L2
  • 384 Radeon ядра
  • тактовая частота GPU 800 МГц
  • DDR3 1866МГц памяти
  • 100Вт

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

Texas Instruments также совсем недавно представила комбинацию процессоров ARM и TI DSP. Она сочетает в себе процессор ARM Cortex A15 (четыре ядра), Texas Instrument Keystone DSP, контроллер разделяемой памяти, интегрированную библиотеку и интерфейс ввода / вывода. Интегрированная библиотека соединяет процессор ARM, DSP и контроллер памяти.

С появлением такого большого количества изменений - акселераторов, альтернатив x86 процессоров и сочетаний процессоров и акселераторов - как можно решить, какой процессор лучше или какие из них хорошо работают с определёнными приложением или алгоритмом? На мой взгляд, ответ дан в цитатах в начале статьи, но адаптирован для HPC - «знай своё приложение». А чтобы знать ваше приложение, нужно выяснить его профиль.

Профилирование и трассировка

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

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

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

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

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

Приложения для средств профилирования

Первый класс инструментов, который я рассмотрю в этой статье – приложения для средств профилирования. Практически любой комплиятор распространяется совместно с инструментом профилирования. Компиляторы GNU распространяются совместно с базовым профайлером GProf. Для подготовки приложения к профилированию при создании кода с GNU комплияторами, вы используете опцию -pg. Когда вы запускаете приложение, оно создаёт выходной файл с именем gmon.out или progname.gmon. Затем вы можете использовать GProf для анализа этого файла, производя два набора данных:  информацию о синхронизации, которая состоит из времени выполнения, проведенное в каждой функции и процент, эквивалентный общему времени работы, и  графу вызовов, которая показывает, кто вызывает каждую функцию в программе.

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

Следует помнить, что GProf – это инструмент, который является "образцом", основанным на профиле. Он использует систему прерываний для получения снимков работы приложения, поэтому он не точно измеряет временные интервалы, а использует вместо этого статистическую выборку для измерения времени.

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

Другим часто используемым инструментом профилирования является Valgrind – основа для проведения анализа приложений, а также для обнаружения памяти и многопоточных ошибок, но мне он интересен из-за возможности профилирования приложений. Valgrind использует "динамический бинарный инструментарий", который позволяет ему работать с заранее собранными программами, поэтому вам не придется повторно компилировать свои приложения. Valgrind оснащён шестью инструментами:

  • Обнаружение ошибок памяти
  • Детекторы двухпоточных ошибок
  • Профайлер кэша и прогнозирования ветвлений (cachegrind)
  • Профайлер кэша генерирующей графы вызовов и прогнозирования ветвлений (callgrind)
  • Хип профайлер
  • Три экспериментальных инструмента
  • Детектор хип/стек /перерасхода глобального массива
  • Второй хип профайлер, который анализирует, как используются хип блоки
  • Основной блок векторного генератора  SimPoint

Средствами профилирования в Valgrind являются cachegrind и callgrind. Cachegrind главным образом моделирует взаимодействие приложения с иерархией кэш-памяти системы. Он взаимодействует как с инструкцией (I), так и с данными (D) кэша L1 типичных процессоров. Если процессор имеет три уровня кэшей, как большинство процессоров, то cachegrind будет моделировать уровень кэша, поскольку он имеет наибольшее влияние на время выполнения. Таким образом, в Valgrind мы имеем дело с I1, D1, и LL (последний уровень) кэшами.

Статистика кэша, которую собирает cachegrind:

  • Считывание данных I кэша
  • Промахи считывания данных I кэша
  • Промахи считывания команд кэша LL
  • Считывание данных D кэша
  • Промахи считывания данных D кэша
  • Промахие считывания данных кэша LL
  • Промахи выдачи данных D кэша
  • Промахи выдачи данных кэша LL
  • Выполненные условные переходы
  • Непредсказанные условные переходы
  • Выполненные косвенные ответвления
  • Непредсказанные косвенные ответвления

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

Трассировка процессора

Второй полезный инструмент для анализа приложений выполняет "трассировку". Эти инструменты захватывают "события процессора" в то время как приложение работает над созданием временных диаграмм. Большинство современных процессоров способны выявлять определенные события процессора, такие как число различных промахов кэша, промахи TLB, непредсказанные условные переходы, выполненные команды, память нагрузок / блоков памяти, операций с плавающей точкой в секунду, и так далее. Модули ядра Linux могут захватить эти события и сделать их общедоступными пользовательскому пространству, и тогда пользовательское приложение может захватить данные,  манипулировать ими и использовать их для анализа и профилирования приложения. Однако эти события или счетчики варьируются от процессора к процессору, и то, что нам на самом деле нужно, - это стандартный набор инструментов для захвата общего набора счетчиков, которые помогут в трассировке приложения. К счастью, такая вещь  - PAPI – существует.

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

PAPI использует так называемый Linux-perfctr или  "счетчики производительности" Linux, которые должны иметь все ядра после 2.6.32, однако, если ядро уже довольно старое, то всегда можете скачать PAPI и добавить его к ядру. Только некоторые дистрибутивы включают Perfctr в их ядра по умолчанию, так что вам, возможно, придется пересобрать ядро.

Инстументы, которые использует PAPI:

  • HPCView
  • TAU
  • Scalasca
  • HPCToolkit
  • IPM
  • Open|SpeedShop
  • PerfSuite
  • SCALEA
  • Titanium
  • Vampir

Другой инструмент, который использует Linux-perfctr называется просто perf. Некоторое время он не обновлялся, и я не уверен, где можно получить код, но он, кажется, входит в состав некоторых дистрибутивов Linux. Хороший учебник на wiki также объясняет, как им пользоваться.

Система профилирования

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

Пожалуй, наиболее распространенный инструмент профилирования системы – OProfile. OProfile собирает статистику системы с помощью методов выборки (по аналогии с GProf и другими инструментами профилирования) в течение определенного периода времени. Она собирает информацию о процессоре, полученную с помощью Linux-perfctr наряду с другими данными, а затем вы можете создавать отчеты, независимо от собранных данных для анализа. Использовать OProfile довольно легко. Начните с запуска OProfile (opcontrol), затем запустите приложение (желательно на тихой системе,  чтобы другие выполняющиеся приложения не оказали никакого влияния). После того,  как приложение будет выполнено, создайте отчет для обобщения информации, в которой вы заинтересованы. Пошаговое использование описано в шпаргалке онлайн.

Для получения справки об использовании OProfile, можете посмотреть учебник GitHub, Red Hat или учебник IBM. Кроме того, приятный графический интерфейс для работы с OProfile, Visual OProfile, распространяются совместно с STLinux, но я не могу сказать, имеет ли он открытый исходный код  (об этом можно найти немного информации).

Системная трассировка

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

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

  • sar
  • sadf
  • mpstat
  • iostat
  • nfsiostat
  • cifsiostat
  • pidstat
  • sa, включающая в себя  sadc, sa1, and sa2

Некоторые очень хорошие учебники по использованию инструментов Sysstat, в частности, sar, можно найти на странице Sysstat, на сайте The Geek Stuff, IBM developerWorks, HowtoForge (в котором также говорится о графическом инструменте, ksar, который графически изображает данные sar), Linux.com(включает в себя обсуждение использования MySQL для хранения данных sar) и на сайте Make Tech Easier (довольно простой учебник).

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

Ещё один инструмент, который может быть весьма полезным для системной трассировки – collectl, довольно полный пакет, более ориентированный на HPC, так как он имеет спсобность трассировать компоненты InfiniBand и Lustre. Я писал о collectl ранее на сайте ADMIN HPC, поэтому я не буду рассматривать его здесь.

Профилирование и трассировка MPI

Для HPC было бы целесообразно обсудить, как профилировать и трассировать приложения MPI (Интерфейс Передачи Сообщений). Некоторые инструменты профилирования MPI доступны, но вы должны убедиться, что они будут работать с библиотекой MPI, которой вы пользуетесь. Примерами инструментов для трассировки могут служить MPE , который взаимодействует с MPICH, но работает с другими реализациями MPI, TAU (упомянутый в «Трассировке процессора») и Paraver. Remember, трассировка действительно относится к сбору историй событий, поэтому вы можете получить представление о том, как показатели или события развиваются с течением времени. Хотя такие MPI инструменты профилирования, как mpiP, FPMPI-2, and IPM сосреточены больше на  объединении статистических данных во время выполнения для получения итоговых, а не временных историй, некоторые из этих инструментов также выполняют и трассировку.

Scalasca (см. «Системная трассировка»)  - это нечто большее, чем просто инструмент профилирования и трассировки для приложений MPI, потому что он выходит за рамки обычного набора инструментов, указывая на проблемы производительности.

Вывод

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

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

Я надеюсь, эта статья дала вам некоторые отправные точки для поиска инструментов и методов для того, чтобы узнать больше о вашем приложении. Я советую не перегружать себя различными вариантами, а выбрать один или два инструмента и пользоваться ими. Как только вы научитесь ими пользоваться,вы узнаете больше о приложении и начнёте пользоваться другими для дальнейшего развития профиля поведения. И это действительно будет стоить усилий.

Джефф Лэйтон

Версия для печатиВерсия для печати

Рубрики: 

  • 1
  • 2
  • 3
  • 4
  • 5
Всего голосов: 0
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Читайте также