Введение в оптимизацию приложений с использованием инструментов Intel® Андрей Ануфриенко Intel Compiler Group Ренат Идрисов 1 Из материалов курса вы узнаете: • о проблемах, влияющих на производительность процессора. • о техниках улучшения производительности приложения • об инструментах Intel® для анализа производительности приложения • об оптимизирующем компиляторе Intel®, его основных компонентах и ключах компиляции • о теоретических основах некоторых основных оптимизаций После изучения курса вы сможете: • описать главные проблемы, влияющие на производительность процессора • исследовать приложение с помощью VTune™ Performance Analyzer и найти проблемные места • идентифицировать главные проблемы анализируемого приложения • разработать стратегию улучшения производительности приложения • описать главные компоненты компилятора, их основные функции • управлять уровнем оптимизации с помощью ключей компилятора План • Архитектура микропроцессора Intel® и основные факторы влияющие на его производительность. • Использование VTune™. • Роль компилятора в улучшении производительности приложения. • Граф управления, анализ потока данных. • Перестановочные оптимизации и их применимость. • Векторизация. • Распараллеливание при помощи директив OpenMP, распараллеливание в автоматическом режиме. • Основные компоненты компилятора, их задачи и взаимосвязь. Архитектура микропроцессора Intel® и основные факторы влияющие на его производительность. Упрощенная модель процессора Шина ввода-вывода Оперативная память (RAM) Внешняя память Устройство взаимодействия с внешней памятью Процессор Системная шина Команды Данные Вычислительное устройство (ALU) Управляющее устройство (CU) Регистры Упрощенная модель процессора • • • • • • • • • • • • устройство управления (Control Unit, CU) арифметико-логическое устройство (Arithmetic and Logic Unit, ALU) системные регистры системная шина (Front Side Bus, FSB) память периферийные устройства Устройство управления (CU): выполняет дешифрацию инструкций, поступающих из памяти компьютера. управляет ALU. осуществляет пересылку данных между регистрами ЦП, памятью, периферийными устройствами. Арифметико-логическое устройство: позволяет производить арифметические и логические операции над системными регистрами. Системные регистры: определенный участок памяти внутри ЦП, используемый для промежуточного хранения информации, обрабатываемой процессором. Системная шина: используется для пересылки данных между ЦП и памятью, а также между ЦП и периферийными устройствами. Высокая производительность МП –один из ключевых факторов в конкурентной борьбе производителей процессоров. Производительность процессора напрямую связана с количеством работы, вычислений, которые он может выполнить за единицу времени. Очень условно: Производительность = Кол-во инструкций / Время Мы будем рассматривать производительность процессоров на базе IA32 и IA32e архитектур. (IA32 with EM64T). Факторы влияющие на производительность процессора: • Тактовая частота процессора. • Объем адресуемой памяти и скорость доступа к внешней памяти. • Скорость выполнения и набор инструкций. • Использование внутренней памяти, регистров. • Качество конвейеризации. • Качество предсказания переходов. • Качество упреждающей выборки. • Суперскалярность. • Наличие векторных инструкций. • Многоядерность. Тактовая частота Процессор состоит из компонент, срабатывающих в разное время и в нём существует таймер, который обеспечивает синхронизацию, посылая периодические импульсы. Его частота и называется тактовой частотой процессора. Объем адресуемой памяти 8086 – 1МБ. 80286 – 16МБ (новые системные регистры и новый режим работы с памятью). 80386 – 4ГБ (первый 32-битный процессор технология EM64T – ~264Б) Скорость выполнения и набор инструкций Производительность зависит от того, насколько качественно реализованы инструкции, насколько полно базовый набор инструкций покрывает все возможные задачи. CISC,RISC (complex, reduced instruction set computing) Современные процессоры Intel® представляют собой гибрид CISC и RISC процессоров, перед исполнением преобразуют CISC инструкции в более простой набор RISC инструкций. Использование регистров и оперативной памяти Время доступа к регистрам наименьшее, поэтому кол-во доступных регистров влияет на производительность микропроцессора. Вытеснение регистров (register spilling) – из-за недостаточного кол-ва регистров велик обмен между регистрами и стеком приложения. Ia32 Технология EM64T – добавлены дополнительные системные регистры С ростом производительности процессоров возникла проблема, связанная с тем, что скорость доступа к внешней памяти стала ниже скорости вычислений. Существуют две характеристики для описания свойств памяти: • Время отклика (latency) – число циклов процессора необходимых для передачи единицы данных из памяти. • Пропускная способность (bandwidth) – количество элементов данных которые могут быть отправлены процессору из памяти за один цикл. Две возможные стратегии для ускорения быстродействия– уменьшение времени отклика или упреждающий запрос нужной памяти. Кэширование Кэш-память служит для уменьшения времени доступа к данным. Для этого блоки оперативной памяти отображаются в более быструю кэш-память. Если адрес памяти находится в кэше – происходит «попадание» и скорость получения данных значительно увеличивается. В противном случае – «промах» (cash miss) В этом случае блок оперативной памяти считывается в кэш-память за один или несколько циклов шины, называемых заполнением строки кэш-памяти. Можно выделить следующие виды кэш-памяти: • полностью ассоциативная кэш-память (каждый блок может отображаться в любое место кэша) • память с прямым отображением (каждый блок может отображаться в одно место) • гибридные варианты (секторная память, память с множественно-ассоциативным доступом) Множественно-ассоциативный доступ – по младшим разрядам определяется строка кэша, куда может отображаться данная память, но в этой строке может находиться только несколько слов основной памяти, выбор из которых проводится на ассоциативной основе. Качество использования кэша – ключевое условие быстродействия. Характерные времена отклика при обращении к кэш памяти для Nehalem i7: • L1 - latency 4 • L2 - latency 11 • L3 - latency 38 Время отклика для оперативной памяти > 100 Упреждающий механизм доступа к памяти реализован при помощи механизма упреждающей выборки (hardware prefetching). Есть специальный набор инструкций, позволяющий побудить процессор загрузить в кэш память расположенную по определенному адресу (software prefetching). Принцип локальности. Качество упреждающей выборки. Локальность ссылки (locality of reference) – повторное использование переменных или взаимосвязанных данных. Различают временную локальность (temporal locality) – когда речь идёт об одних и тех же данных и пространственную локальность (spatial locality) – использование различных данных, имеющих относительно близкие области хранения. Механизм кэширования использует принцип временной локальности. (Стремится сохранять в кэше наиболее часто используемые данные). Механизм упреждающей выборки использует принцип пространственной локальности. (Стремится определить закономерность в доступе к памяти, чтобы заранее подгружать в кэш необходимую память). При этом, чем выше пространственная локальность (элементы расположены ближе в памяти), тем меньше данных требуется загружать в кэш и меньше нагрузка на системную шину. Кэш aliasing – из-за неудачного расположения в памяти различных объектов, участвующих в вычислении, происходит вытеснению из кэш памяти одних адресов другими. Конвейер tick Instruction fetch Register fetch Instruction decode Execution Data fetch Write back 0 instr. 1 - - - - - 1 instr. 2 instr. 1 - - - - 2 instr. 3 instr. 2 instr. 1 - - - 3 instr. 4 instr. 3 instr. 2 instr. 1 - - 4 instr. 5 instr. 4 instr. 3 instr. 2 instr. 1 - 5 instr. 6 instr. 5 instr. 4 instr. 3 instr. 2 instr. 1 6 instr. 7 instr. 6 instr. 5 instr. 4 instr. 3 instr. 2 Качество конвейеризации, уровень параллелизма инструкций Конвейеризация предполагает, что последовательные инструкции будут перекрываться при выполнении. Выполнение типичной команды можно разделить на следующие этапы: • выборка команды – IF; • декодирование команды / выборка операндов из регистров - ID; • выполнение операции / вычисление эффективного адреса памяти - EX; • обращение к памяти - MEM; • запоминание результата - WB. Конвейеризация улучшает пропускную способность процессора, но если инструкции зависят от результатов выполнения предыдущих инструкций, то возникают задержки. Таким образом, польза от конвейеризации определяется уровнем инструкционного параллелизма. Качество предсказания переходов Инструкции могут быть зависимыми по данным и по управляющей логике программы. (Data dependence and control flow dependence). Эффективность суперскалярных и конвейерных механизмов во многом ограничивается различными условными переходами внутри программы. Существует специальный механизм предсказания переходов (branch prediction). МПП выбирает один из возможных путей и продолжает выбирать инструкции и нагружать конвейеры МП работой. В момент, когда условие перехода вычислено, определяется, не ошибся ли предсказатель. Ошибка предсказателя (branch misprediction) - все уже выполненные или еще находящиеся в обработке инструкции удаляются, и МП заново заполняет конвейеры. Можно выделить статический и динамический предсказатель. Динамический предсказатель отличается тем, что собирает статистику на каждое ветвление и делает предсказание на основании собранной статистики. Тривиальное предсказание – переход не будет выполнен в случае если осуществляется переход вперед и будет выполнен – если происходит переход назад. Существует также механизм предсказания цели ветвления (branch target prediction), который предсказывает безусловные переходы. Суперскалярность Суперскалярный процессор – процессор, способный выполнять несколько операций за один такт. Как следствие, для такого типа процессора обязательно наличие нескольких исполнительных блоков (execution unit). Основными компонентами суперскалярного процессора являются устройства для интерпретации команд, снабженные логикой, позволяющей определить, являются ли команды независимыми, и достаточное число исполняющих устройств. Pentium - первый суперскалярный процессор архитектуры x86. Выигрыш от суперскалярности определяется уровнем параллелизма инструкций. «Разнообразие» поступающих на конвейер инструкций позволяет более полно нагружать исполняемые устройства. Упрощенная модель процессора Шина ввода-вывода Оперативная память (RAM) Внешняя память Устройство взаимодействия с внешней памятью Суперскалярность Вычислительное устройство Вычислительное (ALU) устройство (ALU) Система кэшей Управляющее устройство (CU) Регистры Регистры Упреждающая выборка Конвейеризация, предсказание переходов Использование векторных инструкций, векторизация Типичная векторная инструкция выполняет элементарную операцию над двумя векторными последовательностями в памяти или векторными регистрами фиксированной длины. C(1:n) = A(1:n) +B(1:n) Векторизация – процесс конвертации компьютерной программы из скалярного представления, в котором одна операция выполняется над парой операндов, в векторное представление, в котором одна операция выполняется над парой векторных операндов. В Pentium III новая технология SSE (Streaming SIMD Extensions), которая добавила в МП 8 128 битных регистра (XMM0-XMM7) и 70 новых инструкций в том числе для работы с вещественными числами. SSE2,SSE3,SSEE3,SSE4,SSE4.2,AVX – последующие расширения этой идеи. Опережающий просмотр потока инструкций Для того, чтобы эффективно использовать несколько АЛУ и конвейер, современные микропроцессоры используют опережающий просмотр потока инструкций. Это позволяет определить те инструкции, которые могут вычисляться параллельно. Также возможно исполнение с изменением последовательности операций (out-of-order execution). Но технологии опережающего просмотра инструкций (lookahead) не могут решить проблему простоя АЛУ и конвейера в случае низкого уровня инструкционного параллелизма. Параллельные вычисления • • • • • Многозадачность. Многопоточность. Гиперпоточность (Hyper-threading Pentium 4 – Core i7) Многоядерность Многопроцессорные решения Наличие нескольких вычислительных ядер дает возможность достижения высокой производительности приложения распределением вычислений между этими вычислительными ядрами. Основные характеристики приложения, влияющие на его производительность • • • • • • Эффективность вычислений Эффективность работы с памятью Правильное предсказание переходов Эффективность использования векторных инструкций Эффективность параллелизации Уровень инструкционного параллелилизма Измерение производительности От каких факторов зависит производительность конкретной программы? • качество работы оптимизирующего компилятора • работа МП Потребителям необходимы критерии определения производительности вычислительной системы • Репрезентативная выборка типичных задач • Универсальная схема тестирования • Независимость от производителей МП Spec.org (Standart Performance Evaluated Corporation) – некоммерческая организация для подготовки, поддержки и сопровождения стандартного набора тестов для сравнения производительности различных вычислительных систем. Эта организация разрабатывает стандартные пакеты и публикует результаты измерений. CPU2006 – разработана для измерения производительности. Может быть использована для сравнения работы программ, выполняемых на различных вычислительных системах. CINT2006 для целочисленных вычислений. CFP2006 для сравнения производительности работы с вещественными числами. OMP2001 – измеряет производительность на тестах с использованием OpenMP (это библиотека для параллельных вычислений с общей памятью (shared-memory parallel processing)). Место и роль компилятора. Компилятор — транслятор, который осуществляет перевод всей исходной программы в эквивалентную ей результирующую программу на языке машинных команд или на языке ассемблера. Играет ли компилятор какую-либо роль в борьбе за производительность МП? • • • Компилятор используется во время тестирования и отладки функциональности новых МП. Только с помощью компилятора можно показать рост производительности МП связанный с новыми командами, увеличением количества регистров и т.п. Компилятор способен скрыть неудачи архитекторов. Литература 1. Randy Allen & Ken Kennedy “Optimizing compilers for modern architectures” 2. David F. Bacon, Susan L. Graham and Oliver J.Sharp “Compiler transformations for High-Performance Computing” 3. Aart J.C. Bik “The Software Vectorization Handbook” 4. Richard Gerber, Aart J.C. Bik, Kevin B.Smith, Xinmin Tian “The Software Optimization Cookbook” 5. Intel® 64 and IA-32 Intel Architecture Software Developer's Manual 6. Intel® 64 and IA-32 Architectures Optimization Reference Manual 7. Agner Fog “Optimizing software in C++: An optimization guide for Windows, Linux and Mac platforms” http://www.agner.org/optimize/ Спасибо за внимание!