Другие репортажи с московского IDF’2003:
Intel Developers Forum в Москве: первый день
Intel Developers Forum в Москве: второй день
Intel Developers Forum в Москве: советы по оптимизации ПК
Секция “Программное обеспечение” на Форуме Intel для разработчиков
Наш следующий репортаж посвящён обзору докладов, прозвучавших на потоке “Программное обеспечение” на Форуме Intel для разработчиков. В статье отражены новые возможности программных продуктов для разработчиков ПО.
Поток состоял из 8 семинаров, по четыре каждый день:
- Услуги Intel для производителей программного обеспечения;
- Анализатор производительности VTune 7.0;
- Применение технологии Hyper-Threading;
- Реальные примеры параллелизации приложений;
- Intel Integrated Performance Primitives – инструмент для разработки не только мультимедиа-приложений;
- Программирование приложений для работы в условиях периодических потерь контакта с локальной сетью: что нужно знать разработчику;
- Как добиться высокой производительности и качества ПО?
- Компания Microsoft: будущее платформы Microsoft для разработчиков.
С докладами выступили как российские, так и зарубежные представители компании Intel. Доклады были посвящены новым разработкам компании Intel.
Услуги Intel для производителей программного обеспечения
Первым выступил Дмитрий Ильин с докладом о группе поддержки независимых разработчиков программного обеспечения. В докладе была представлена программа Intel Developer Services.
Что же такое Intel Developer Services? Это и семинары для разработчиков, и онлайновые тренинги, и программные продукты Intel для разработчиков программного обеспечения (включая компиляторы, библиотеки, средства оптимизации, средства анализа производительности), информационная поддержка, использование ресурсов лаборатории Intel Solutions Services, это доступ к базам данных (содержат ответы на наиболее распространённые вопросы), форумы для разработчиков, возможность оценки общей стоимости владения, а также оценки от вложения капитала в программный продукт, и, кроме того, специальные скидки на оборудование на базе платформы Intel и маркетинговая поддержка со стороны Intel.
Одной из замечательных возможностей, предоставляемых компанией Intel, является программа Early Access Problem (EAP). EAP предоставляет ресурсы для повышения производительности приложений и подготовки приложений для использования на новейших платформах Intel с применением передовых технологий Intel. Адрес подписки здесь.
Кроме этого, корпорация Intel обеспечивает разработчиков программными продуктами на всех этапах разработки программного обеспечения.
Во-первых, это компиляторы Intel (С++, Fortran), обеспечивающие доступ к новейшим возможностям процессоров Intel без изменения программного кода и оптимизацию приложений на платформе Intel.
Во-вторых, анализатор производительности – Intel VTune Performance Analyzer, оптимизирующий приложение за счёт экономии времени и ресурсов разработчика с помощью определения и анализа проблемных мест приложения, а также нахождения и исправления ошибок. Версия Intel VTune Enterprize Analyzer обеспечивает анализ и диагностику производительности распределённых web-приложений.
Для диагностики ошибок в многопоточных приложениях разработчикам предлагается пакет Intel Threading Tools. Он состоит из двух частей. Thread Checker обеспечивает определение ошибок не синхронизированного доступа к данным двумя и более потоками, а Thread Profiler – получение картины дисбаланса потоков для OpenMP-распределённых приложений.
И, наконец, библиотеки Intel Performance Libraries обеспечивают определение типа процессора во время загрузки приложения и загрузку наилучшего кода для данного типа процессора, а также сокращают необходимость написания процессор-ориентированного кода.
Представленные программные продукты доступны для операционных систем Windows и Linux на всех платформах Intel
Анализатор производительности VTune 7.0
Обо всех этих продуктах и шла, в разной степени, речь в докладах этого потока. Евгений Харченко очень подробно осветил возможности анализатора VTune, причём все эти возможности были продемонстрированы на реальных приложениях.
Процесс оптимизации приложения представлен на следующей иллюстрации.
Для оптимизации приложения Intel предлагает использовать и Intel VTune Performance Analyzer for Linux 2.0.
Intel VTune Performance Analyzer собирает, систематизирует и отображает данные о производительности ПО, начиная с общесистемного уровня и до уровня конкретного модуля, функции, строки программного кода.
Intel VTune Performance Analyzer 7.0 поддерживает платформы семейств Intel, Itanium, XScale; операционные системы Windows и Linux; Java и .Net; локальный и удалённый сбор данных; интерфейс командной строки; до 64 процессов. Кроме того, интегрируется в Visual Studio 7, обеспечивает различные функциональные возможности.
Первая функциональная возможность – это Sampling. Во время работы исследуемого приложения VTune собирает информацию о временных затратах и событиях процессора, ассоциированных с модулем, функцией и строкой кода.
Используется для тестирования 32- и 64-битных приложений Windows, 32- и 64-битных динамических библиотек, библиотек COM+, Java-приложений, приложений .NET и ASP.NET.
При использовании Sampling не надо специально модифицировать код, достаточно скомпилироваться/слинковаться с отладочной информацией, используя релизную конфигурацию с включённой оптимизацией. При этом технология Sampling распространяется на всю систему, что приводит к отображению результатов не только на тестируемое приложение, но и на все работающие в ОС модули.
VTune предоставляет возможность построения графа вызовов функций. Call-graph собирает данные о иерархии и количестве вызовов, временных затратах по каждой функции (собственное время – время используемое функцией, общее время – собственное время с вызываемыми из нее функциями; общее время ожидания, время ожидания), и отображает данные в виде графа и таблиц.
Call-graph-технологии позволяют анализировать алгоритмические проблемы, предоставляя данные о иерархии вызовов и критическом пути исполнения (обратите внимание, на рисунке широкое ребро графа указывает критический путь исполнения).
Инструментарий производится автоматически, без вмешательства пользователя, достаточно только скомпилироваться/слинковаться с отладочной информацией.
Отличие от технологии Sampling заключается в том, что в данном случае профилируется только тестируемый модуль.
Технологию call-graph можно применять также для тестирования 32- и 64-битных приложений Windows, 32- и 64-битных динамических библиотек, библиотек COM+, Java-приложений, приложений .NET и ASP.NET.
Таким образом, Sampling и Call-graph дополняют друг друга, предоставляя в совокупности целостную картину
Кроме этих двух технологий, VTune отслеживает производительность системы путём сбора данных о производительности аппаратных и программных средств, отображает их в режиме реального времени и интегрально по окончании сессии, сопоставляет эти данные с данными Sampling. Эта функциональность возложена на Counter monitor.
С помощью системных счётчиков можно определить, насколько эффективно работает система: как используются аппаратные средства (в частности, процессор), память, достаточна ли пропускная способность, или какие системные ресурсы наиболее критичны.
Следующая часть VTune – это Intel Tuning Assistant, база знаний, способная идентифицировать проблему и предоставить советы по оптимизации приложения на основе собранных данных о производительности. Для получения справочной информации достаточно щёлкнуть мышкой по существующей спрогнозированной проблеме.
Обработка данных позволяет сравнить результаты версий, предоставляет целостную картину работы приложения из нескольких запусков, покрывающих лишь отдельные ветки исполнения, а также обеспечивает возможность выполнить упаковку и перенос проекта на другую машину, экспорт данных, а также Sampling-распределение событий процессора по времени.
Второй анализатор – это Intel for Linux 2.0. Его функциональные возможности несколько ограничены и включают Sampling-технологию (причём она ограничена только сбором информации о событиях процессора), Call-graph, Source code, обработку данных, обеспечивающую возможность переноса проекта с одной машины на другую, дополняет данную версию дополнение Man-страницы и HTML-руководство.
Одновременно с VTune Performance Analyzer 7.1 и VTune Performance Analyzer for Linux поставляется VTune Performance Analyzer Driver Kit. Эта программа позволяет собрать драйвер для VTune для специфического ядра системы. Содержит GPL код драйвера, инсталляционные скрипты, документацию и бинарники для поддерживаемых ядер. Доступна по следующему адресу.
В заключение Евгений Харченко дал несколько довольно-таки прозрачных советов по оптимизации приложения, которые можно свести к нижеследующим.
Правильный выбор алгоритма является безусловным приоритетом при работе над производительностью, причём алгоритмы имеют определённые требования к структурированию памяти и могут иметь проблемы с зависимостью по данным.
Использование специфики данных приложения обеспечивает возможность улучшить алгоритм, т.е. иногда эффективнее будет работать разработанный алгоритм, нежели взятый в библиотеке.
Использование системных и библиотечных функций увеличивает производительность приложения.
Зависимость по данным приводит к непредсказуемым ошибкам.
Использование потоков улучшает производительность, а знание специфики процессора позволяет минимизировать количество непредсказуемых условных переходов.
Обратите внимание на использование кэша – используйте меньше памяти для сокращения загрузки кэша; выровняйте данные и храните их в памяти в соответствии с порядком доступа; используйте память блоками, меньшими размера кэша.
При работе с плавающей точкой избегайте исключений и выходов за предельные значения; используйте минимально возможную точность данных и вычислений; избегайте конвертаций типов с плавающей точкой в целочисленные.
Следующие несколько слайдов иллюстрируют советы Евгения Харченко.
Разделение переменных и возможность параллелизации увеличивают скорость вычисления значений переменных
Выделить память один раз гораздо быстрее, чем по частям
Использование встроенных функций и функций библиотек оптимизирует программный код.
Применение технологии Hyper-Threading и реальные примеры параллелизации приложений
Следующие два доклада потока “Программное обеспечение” были посвящены использованию технологии Hyper-Threading при разработке программного обеспечения.
Оба доклада начинались с объяснения технологии Hyper-Threading и возможностей параллелизма при создании эффективного программного обеспечения. Далее первый доклад (Фритц Гернет) был посвящён стандарту OpenMP и инструментальным средствам Intel Threading Tools, а во втором докладе (Алекс Климовицкий) были раскрыты проблемы синхронизации данных и пути их решения.
Если в первом докладе основное внимание уделялось строгому описанию основных понятий, связанных с многопотоковыми приложениями, то второй докладчик всё это конкретизировал и проиллюстрировал на конкретных мультимедийных игровых приложениях. Таким образом, второй доклад являлся продолжением и завершением первого. Следует отметить, что первый доклад, презентация и изложение были представлены на английском языке, а качество предложенного перевода оставляло желать лучшего, в результате чего не все слушатели полностью поняли доклад. К сожалению, квалифицированных переводчиков, разбирающихся в компьютерной тематике, можно пересчитать по пальцам, и слушателям этого доклада не повезло.
О чём же шла речь в докладах?
Преимущества технологии HT иллюстрируются следующим слайдом:
Преимущества технологии HT, прозрачной для ОС и приложений, проявляются при многозадачности и многопотоковости.
При разработке многопоточных приложений используются две модели разработки: использование параллелизма на уровне задач и использование параллелизма на уровне данных.
Во-первых, это использование параллелизма на уровне задач. Эта модель сводится к разделению рабочих задач на независимые задачи, с тем, чтобы они могли выполняться одновременно. Для разработки трёхмерных игр и трёхмерных моделей может быть использовано ПО Virtools Dev 2.1, которое применяет метод разбиения по функциям:
Рабочие потоки обрабатывают частичные системы, при этом визуализация ожидает события окончания.
Использование параллелизма на уровне задач обеспечивает ограниченный прирост (до 13% на однопроцессорной машине с технологией HT) производительности по причине неравномерного распределения нагрузки.
И вторая модель – это использование параллелизма на уровне данных. В этом случае параллелизм сводится к разделению данных на непересекающиеся наборы, с тем, чтобы потоки могли обрабатывать эти наборы данных раздельно (одновременно).
Для реализации этой модели многопотоковости в трёхмерном игровом приложении предлагается использовать ПО Karma компании MathEngine.
Вычислительное устройство рассчитывает действующие силы (контактные силы, силы трения и силы взаимодействия).
Интегрирующее устройство вычисляет новые координаты объектов, исходя из равнодействующей всех сил.
Для разбиения по областям используются два подхода.
Динамическое распределение. Два рабочих потока, каждый с отдельным вычислительным устройством, при этом обрабатывается сначала один сегмент, затем осуществляется переход к обработке следующего. Этот подход обеспечивает до 5% прироста производительности. Недостаток – большая степень дробления и необходимость синхронизации.
Статическое распределение. Также два рабочих потока, но число сегментов делится пополам, и каждый поток получает на обработку половину сегментов. Данный способ обеспечивает повышение производительности, так как снижается количество излишних операций синхронизации.
Как показали тесты, использование параллелизма на уровне данных обеспечивает увеличение производительности до 30% на однопроцессорной машине с технологией HT.
Для реализации многопотоковости предлагается использовать следующие средства: интерфейсы прикладного программного программирования/библиотеки (Win 32 threading API, P-threads, MPI), средства языков программирования (Java, C#) и расширение языков программирования, в частности OpenMP.
OpenMP – это расширение компилятора для упрощения процесса реализации многопотоковости без внесения изменения в код C/C++. OpenMP включает три компонента: директивы компилятора (#pragma), интерфейс прикладного программирования и Run-time-библиотеки.
Использует модель параллелилизма Fork-Join (разветвление-соединение), в которой основной поток порождает группу дополнительных потоков, объединяющихся в конце области параллельного исполнения.
Список директив OpenMP:
omp parallel – главная директива, она порождает группу потоков
omp sections и omp for, директивы распределения работы
private, shared, reduction определяют область действия переменных
schedule определяет способ распределения работы
omp critical и omp barrier являются директивами синхронизации.
Пример 1.
void func()
{
int a, b, c, d;
#pragma omp parallel sections
{
#pragma omp section
a=a+b
#pragma omp section
c=c+d
}
}
Директива parallel порождает группу из N потоков, всё, что находится внутри, выполняется N раз, при этом вся память является общей.
Директива sections определяет задачи без итерации, соответственно, оператор a=a+b будет выполняться в первом потоке, а оператор c=c+d – во втором. Таким образом, директива sections реализует параллелизм на уровне задач.
Пример 2.
void func()
{
int a[N], sum=0;
#pragma omp parallel for
for (int i=0; i<n;
{
sum+=a[i]
}
}
Директива for реализует параллелизм на уровне данных, распределяя итерации цикла по потокам.
Перейдём к проблемам синхронизации.
Синхронизация неизбежна при распределении данных или ресурсов между потоками.
– #pragma omp single (выполнение следующего оператора одним потоком)
– #pragma omp barrier (в данной точке потоки дожидаются всех остальных)
– #pragma omp atomic (выполняет следующую операцию доступа к памяти неделимо)
– #pragma omp critical (разрешает только одному потоку в один момент выполнять следующую операцию)
Для синхронизации всех обращений к одному общему сумматору можно воспользоваться редукцией:
void func()
{
int a[N], sum=0;
#pragma omp parallel for reduction(+: sum)
for (int i=0; i<n;
{
sum+=a[i]
}
}
В этом случае переменная sum будет локальной в каждом потоке, но по завершении всех потоков выполнится операция редукции (в данном случае сложение) по переменной sum.
Итак, OpenMP предоставляет широкие возможности по разработке многопотоковых приложений. Это и усовершенствованное определение области действия переменной, и инициализация, и усовершенствованные директивы синхронизации, возможность использования интерфейса прикладного программирования OpenMP и переменных окружения (контроль числа потоков, низкоуровневая ручная синхронизация:), а также распределение работы с использованием модели очередей задач (использование нестандартизированных директив Intel). OpenMP обеспечивает совместимость со стандартами Win32 и P-threads.
В заключение были приведены некоторые методы использования потоков.
Исключение ошибок при использовании разделяемой памяти, которые приводят к снижению производительности при выполнении приложений на системах HT и на двухпроцессорных системах.
Устранение ошибок наложения адресов кэш-памяти (по умолчанию размер стека потока равен 1Мб, поэтому обращение к стекам может привести к наложению адресов, что может значительно снизить масштабируемость с применением технологии HT).
Для повышения производительности необходимо отключить функции printf.
Особенность приложений ОС Win32 заключается в возможности посылки сообщений только в основной поток положения, для увеличения производительности приложения необходимо использовать главный поток как рабочий.
Использование одного вычислительного потока на один логический процессор сокращает нагрузку на ОС по распределению потоков и синхронизации.
Оба доклада были содержательны и предлагали огромное количество полезных советов, реализуемых при разработке программного обеспечения.
Первый день секции “Программное обеспечение” на этом завершил свою работу. Он был насыщен полезной информацией, поэтому мы ожидали, что доклады следующего дня будут такими же полезными.
Intel Integrated Performance Primitives – инструмент для разработки не только мультимедиа-приложений
Второй день потока “Программное обеспечение” начала Ася Нежданова с доклада о инструменте Intel Integrated Performance Primitives.
В докладе очень последовательно и не спеша изложено о месте Intel Integrated Performance Primitives (IPP) в линейке программных продуктов Intel, выделены преимущества и необходимость использования IPP. Особое внимание было уделено новым функциям IPP, связанным с криптографией и обработкой строк.
IPP – это библиотека низкоуровневых блоков (примитивов), необходимых для многих областей, единый кроссплатформенный API, оптимизация для всей линейки процессоров Intel, экономичное и быстрое решение для написания высокопроизводительных приложений. Библиотека поддерживает 32-битные Linux и Windows на Intel IA-32 (Pentium II, Pentium III, Pentium 4, Intel Xeon), 64-битные Linux и Windows на Intel Itanium, Linux и WinCE на Intel Personal Internet Client Architecture.
Преимущества, которые даёт IPP, – сокращение времени выпуска и уменьшение стоимости разработки программных продуктов; использование всех возможностей новейших процессоров Intel; а также высокая степень переносимости приложений.
IPP 4.0. является единым кроссплатформенным продуктом, в который добавлены функции криптографии и обработки строк, а также новые функции для обработки аудио, видео, обработки сигналов, изображений, для кодирования и распознавания речи, обработки JPEG. Все функции оптимизированы для новых процессоров Intel. IPP обеспечивает богатый набор примеров использования функций IPP (добавлено 52 примера) и обладает расширенным набором поддерживаемых интерфейсов C#, Delphi, Visual Basic.
Таким образом, в IPP содержатся около 2,7 тысячи функций, работающих с различными типами и в различных режимах, что в результате дает около 10 тысяч различных функций.
В библиотеку IPP Cripto входит широкий спектр криптографических функций (симметричные шифры, хэш-функции, криптография с открытым ключом), оптимизированных для Intel IA-32, Itanium, XScale:
Одно из достоинств IPP Cripto – соответствие международным стандартам в области криптографии.
Следует подчеркнуть, что использование функции IPP для процессоров Intel значительно увеличивает производительность. В частности, по данным докладчика, использование функции IPP в протоколе OpenSSL для Intel IA32 увеличивает производительность на 50%.
Перейдём к обработке строк. Создание функций по обработке строк связано, во-первых, с широкой областью их применения (текстовые процессоры, компиляторы и т.д.), кроме того, на процессорах Intel возможно обеспечить более высокую производительность по их обработке.
Строка представляется как указатель на строку с указанием длины строки.
Что позволяют выполнять функции IPP по обработке строк? Сравнение, поиск вхождений строки, удаление ненужных символов по краям, соединение и разбиение строк, замена, удаление фрагментов, преобразование символов к нижнему и верхнему регистру.
Все функции оптимизированы для Intel Pentium 4 и идеально подходят для реализации .NET C# класса String.
IPP String Processing даёт при использовании такие преимущества, как производительность, локализация в функциях изменения Case, кроме того, в следующей версии будут предложены функции регулярных выражений.
Доклад, как и предполагалось, был предназначен для ознакомления разработчиков с новыми возможностями IPP, что докладчику удалость выполнить в полном объеме.
Как добиться высокой производительности и качества ПО?
Следующий доклад Евгения Харченко назывался “Как добиться высокой производительности и качества ПО?”. Несмотря на то, что в аннотации доклада была сделана заявка на обзор возможностей компилятора С/С++ Intel, на самом деле план состоял из следующих пунктов:
- компиляторы Intel
- анализаторы производительности
- Intel VTune Performance Analyzer
- Intel Threading Tools
и, соответственно, большая часть доклада была посвящена обзору возможностей анализаторов производительности, то есть являлась повторением доклада, прозвучавшего днём раньше.
Итак, относительно компиляторов: они полностью совместимы по коду с двоичными файлами Microsoft и, в основном, по исходному коду – с GNU Compiler Collection. Используют последние возможности процессоров Intel.
Были выделены некоторые факторы повышения производительности ПО.
SIMD-методика Netbur Single Instruction (упакованные данные до 128 бит в длину обеспечивают параллельную обработку данных, позволяют использовать функции С, а векторизация определяет, какие операции могут быть выполнены параллельно).
Использование программной конвейеризации и предварительной выборки данных.
Межпроцедурная оптимизация обеспечивает возможность перемещения отдельных кусков кода по файлу или совокупности файлов для получения максимальной эффективности, а также использование оптимизации по профилированию. Для этого используются специальные директивы (-Qip и др.), с которыми можно ознакомиться в справочной системе.
Использование высокооптимизированных библиотек стандарта C, а также диспетчеризации ЦП, которая позволяет выбирать программный код в период выполнения, в зависимости от фактического типа процессора.
Эффективность разработки многопотоковых приложений обеспечивается использованием OpenMp и автопараллелизатором компилятора Intel (-Qparallel).
А дальше, как уже говорилось, речь шла об анализаторах производительности. Доклад был очень ёмким по содержанию, обо всём говорилось очень быстро и кратко.
Компания Microsoft: будущее платформы Microsoft для разработчиков
Последний доклад потока “Программное обеспечение” был посвящен обзору направлений развития платформы Microsoft для разработчиков. Докладчик – представитель компании Microsoft в Москве Алексей Фёдоров – размеренно, подробно доводил до сведения слушателей информацию о таких готовящихся к выпуску продуктах, как Microsoft Windows “Longhorn,” SQL Server “Yukon,” Visual Studio “Whidbey” и других.
Ко второму дню IDF уже все устали, чувствовалась “ленца” как у докладчиков, так и у участников Форума.
Заключение
В завершение статьи хотелось бы высказать некоторые пожелания организаторам Форума. Во-первых, в замечательном большом зале Российской академии наук, несмотря на хорошую акустику, вопросы, задаваемые участниками, было плохо слышно как докладчику, так и слушателям – неплохо было бы на время вопросов дать микрофон. Далее, изображения (скриншоты) плохо воспринимались, самые важные элементы были практически не видны – возможно, целесообразнее было бы использовать больший экран.
В целом же, с информативной точки зрения, Форум был очень полезен.