Назад в библиотеку

Эффективное программирование и оптимизация параллельных приложений для кластерных систем

Автор: Ullrich Becker-Lemgau
Автор перевода: А.Г. Юсков
Источник (англ.): Computational Methods in Science and Technology Special Issue 2006, pages 7-11
Оригинальная статья (англ.): Источник оригинальной статьи

Аннотация

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

Ключевые слова

средства разработки, Intel Cluster Toolkit, кластерная система, библиотека MPI, анализ производительности, оптимизация производительности, HPC

Введение

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

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

Для кластерных приложений необходим другой способ распараллеливания, поскольку кластер состоит из независимых систем (часто называемых узлами). Особое внимание требует память кластера, распределенная между узлами, и очень часто доступ к ней осуществляется только при помощи определенных узлов. Соединение между узлами очень часто реализовывается по технологии Ethernet. Но более высокоскоростные сети как Infiniband, Myrinet, Quadrics или подобные используются для большей пропускной способности и меньшей задержки.

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

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

Много технических приложений использует MPI в качестве программной параллельной модели. Среди них приложения как Fluent, Star-CD, Pam-Crash, LS-Dyna, Eclipse, MSC.Marc, и т.д. Поскольку кластерный рынок развивается, и уже достиг 50% рынка серверов, потребность в эффективных и масштабируемых параллельных приложениях также развивается.

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

С Intel Cluster Toolkit 2 в его последней версии 3.0 Intel предлагает интегрированный набор средств разработки, который упрощает программирование и оптимизацию параллельных приложений основанных на MPI. Помимо библиотек для генерации кода он содержит инструменты для анализа и оптимизации производительности параллельных приложений и систем.

Библиотека MPI

Основной компонент Intel Cluster Toolkit – это библиотека Intel MPI в его последней версии 3.0. Intel MPI библиотека – это реализация стандарта MPI, включающая полную функциональность MPI-1.2 и основные аспекты стандарта MPI-2, такие как односторонняя коммуникация и параллельный ввод-вывод. Поддерживаются все распространенные типы высокоскоростных сетей, что позволяет пользователям использовать одну и ту же библиотеку MPI для различных приложений в различных кластерных системах и различных высокоскоростных сетях (см. рис. 1).

i1

Рисунок 1 – Библиотека Intel MPI

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

При запуске приложения пользователь определяет, какая сеть должна использоваться. Например, команда

mpiexec –n 2 –env I_MPI_DEVICE sock a.out

запускает приложение с передачей по TCP-IP на Ethernet. Командой

mpiexec –n 2 –env I_MPI_DEVICE rdma a.out

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

Библиотека Intel MPI использует различные устройства, чтобы поддерживать различные сети. В новой версии 3.0 все устройства интегрированы в одно логическое устройство, которое включает поддержку TCP/IP, коммуникации с разделяемой памятью и высокоскоростных сетей через интерфейс DAPL. Интерфейс DAPL обеспечивает преимущество, заключающееся в том, что библиотека Intel MPI будет отделена от базового стека программного обеспечения. Таким образом, обновления могут быть выполнены независимо от библиотеки Intel MPI. Даже новые типы сети могут представляться без изменения приложения или библиотеки Intel MPI.

Библиотека Intel MPI также поддерживает гибридный подход к коммуникации. Пользователь может использовать коммуникацию с разделяемой памятью на уровне узла и высокоскоростной сети между узлами, чтобы получить лучшее из обеих моделей. Это становится более важным, если узлы содержат большое количество процессоров как, например, узлы серии SGI Altix. С библиотекой Intel MPI пользователю не нужно пересобирать приложение или получать новую версию от независимого поставщика программного обеспечения, потому что библиотека Intel MPI поддерживает этот гибридный режим в логическом устройстве.

Математическая библиотека

Другой стандартный блок для создания высокопроизводительных приложений – кластерная версия библиотеки Intel Math Kernel Library (MKL). Эта кластерная версия включает в себя полную функциональность последовательной библиотеки MKL: BLAS, LAPACK, решатели разреженных матриц и FFTs. Дополнительно кластерная версия обеспечивает реализацию функций SCALAPACK для распределенных параллельных приложений. Таким образом, известная превосходная производительность MKL также доступна для кластерных систем и приложений MPI.

Анализ производительности

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

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

Здесь на помощь приходит Intel Trace Analyzer and Collector 7.06, который позволяет проводить фундаментальный анализ параллельного приложения и его коммуникационной структуры. Как указывает название, Intel Trace Analyzer and Collector состоит из двух отдельных компонентов. Intel Trace Collector – это библиотека, которая должна быть скомпонована с параллельным приложением. Если приложение, скомпонованное таким образом, будет запущено, Intel Trace Collector запишет все события MPI, такие как вызовы функций MPI и зарегистрирует их вместе с меткой времени в файле трассировки. На втором шаге – при последующем анализе – этот файл считывается Intel Trace Analyzer, и может быть проанализированным разработчиком в графической и цифровой форме.

Как все другие инструменты из Intel Cluster Toolkit, Intel Trace Analyzer and Collector доступны для систем Linux, в то время как Intel Trace Analyzer может также быть запущен в системе Windows. Таким образом, анализ производительности может произвести даже на собственном ноутбуке с системой Windows. Версия Windows всех других инструментов кластера Intel находится в подготовке.

Intel Trace Analyzer and Collector предлагает широкий спектр различных методов для графического анализа собранных данных. Основной инструмент – временная шкала события: для каждого процесса временная шкала события показывает в строке, процесс какой функции запущен в определенное время. Тем самым временная шкала различает время функций MPI (красные) и приложения (синее), см. рис. 2. Черное пятно показывает сообщения. Просто идентифицировать, какой процесс отправил это сообщение, и в какое время, и какой процесс, и в какой время получает его. Коллективные операции для глобальной связи и синхронизации показываются как синие строки.

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

i2

Рисунок 2 – Intel Trace Analyzer – временная шкала события

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

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

i3

Рисунок 3 – Intel Trace Analyzer – количественная временная шкала

Качественная временная шкала (см. рис. 4) выводит на экран различные атрибуты функций, сообщений или коллективных операций.

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

i4

Рисунок 4 – Intel Trace Analyzer – качественная временная шкала

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

Intel Trace Analyzer не только выводит на экран информацию о коммуникации MPI. В случае если приложение создано с использованием API Intel Trace Collector, могут быть отображены вызовы функций в параллельном приложении.

Intel Trace Analyzer показывает, какой процесс запускает данную функцию приложения и в какое время. Разработчик при помощи инструментария определяет уровень детализации данных приложения, которые будут зарегистрированы в трассировочном файле. На 32-разрядных и 64-разрядных системах Pentium и Xeon дополнительная информация может также быть зарегистрирована при помощи двоичного инструментария исполнимой программы.

В следующей версии Intel Trace Analyzer and Collector 7.0 появятся некоторые очень интересные улучшения для анализа приложений MPI. Одно из основных преимуществ – новая диаграмма сравнения, которая позволяет разработчику сравнить два файла трассировки и перемещаться по данным синхронизированным способом. При этом разработчик в состоянии видеть влияние изменений, внесенных в коммуникационную структуру и сделать сравнения до-после.

Intel Trace Collector 7.0 будет также включать новый функциональный элемент Intel Message Checker. Intel Message Checker обнаруживает наиболее распространенные ошибки MPI, такие как возможные мертвые блокировки. Даже если приложение работает гладко, приложение MPI может содержать ошибки, которые только влияют на выполнение или результат при определенной рабочей нагрузке. Intel MPI Checker улучшает качество, устойчивость и правильность кода.

Intel Cluster Toolkit включает также Intel MPI Benchmarks в качестве исходного кода. Этот набор функций позволяет измерять производительности реализаций MPI и кластерных систем.

Резюме

В текущей версии 3.0 Intel Cluster Toolkit, Intel предлагает очень ценный комплект инструментальных средств для эффективной разработки, анализа и оптимизации приложения MPI. Комплект инструментальных средств содержит библиотеки для генерации кода, такие как библиотека Intel MPI и MKL Library Cluster Edition. Для обеспечения эффективности и масштабируемости параллельного приложения и возможности простой разработки/оптимизации/обслуживания используются такие инструменты как Intel Trace Analyzer and Collector и Intel MPI Benchmarks. Новая функциональная возможность Intel Message Checker добавит проверку правильности для улучшения качества и надежности приложений MPI.