Компиляторы Интел для высокопроизводительных вычислений 2009 Упрощенная модель процессора Шина ввода-вывода Оперативная память (RAM) Внешняя память Устройство взаимодействия с внешней памятью Процессор Системная шина Команды Данные Вычислительное устройство (ALU) Управляющее устройство (CU) Регистры Упрощенная модель процессора Со времен изобретения микросхемы в мире было разработано большое число разных процессоров, но в любом процессоре можно выделить: устройство управления (Control Unit, CU) арифметико-логическое устройство (Arithmetic and Logic Unit,ALU) системные регистры Чтобы превратить все это в вычислительную систему необходимо как минимум добавить системную шину (Front Side Bus, FSB) память периферийные устройства Устройство управления (CU): проводит дешифрацию инструкций, поступающих из памяти компьютера. управляет ALU. осуществляет пересылку данных между регистрами ЦП, памятью, периферийными устройствами. и т.д. o Арифметико-логическое устройство состоит из различных микросхем, позволяющих производить арифметические и логические операции над системными регистрами. o Системные регистры – это определенный участок памяти внутри ЦП, используемый для промежуточного хранения информации, обрабатываемой процессором. o Системная шина используется для пересылки данных между ЦП и памятью, а также между ЦП и периферийными устройствами. В современных компьютерах ЦП через шину связывается с системным контроллером ПК, а он уже управляет периферийными устройствами. Высокая производительность МП Высокая производительность МП –один из ключевых факторов в конкурентной борьбе производителей процессоров. Интуитивно понятно, что производительность процессора напрямую связана с количеством работы, вычислений, которые он может выполнить за единицу времени. Очень условно: Производительность = Кол-во инструкций / Время Мы будем беседовать о производительности на базе IA32 и IA32e архитектур. (IA32 with EM64T). Факторы влияющие на производительность процессора: Тактовая частота процессора Объем адресуемой памяти и скорость доступа к внешней памяти Скорость выполнения инструкций и полнота базового набора инструкций Использование внутренней памяти, распределение регистров Уровень конвейеризации Качество предсказания переходов Качество упреждающей выборки Суперскалярность Параллелизация и многоядерность Тактовая частота: Поскольку процессор состоит из разных микросхем, и каждая работает разное время, то в процессоре существует таймер, который отвечает за синхронизацию работы микросхем, посылая периодический синхроимпульс. Его частота и называется тактовой частотой процессора. Объем адресуемой памяти и скорость доступа к памяти: 8086 мог одновременно работать всего с 4 сегментами по 64 КБ каждый и всего мог адресовать 1МБ памяти. 80286 – добавились новые системные регистры и новый режим работы с памятью в котором процессор мог адресовать 16МБ памяти. 80386 – первый 32-битный процессор, позволяет адресовать 4ГБ памяти технология EM64T (Extended Memory 64 Technology) – сняла и это ограничение. Скорость выполнения инструкций и полнота базового набора инструкций: (качество ALU ?) Производительность зависит от того, насколько качественно реализованы инструкции, насколько полно базовый набор инструкций покрывает все возможные задачи. CISC,RISC (complex, reduced instruction set computing) Современные Интел процессоры представляют собой гибрид CISC и RISC процессоров, перед исполнением преобразуют CISC инструкции в более простой набор RISC инструкций. В Pentium III новая технология SSE (Streaming SIMD Extensions), которая добавила в МП 8 128 битных регистра (XMM0-XMM7) и 70 новых инструкций в том числе для работы с вещественными числами. SSE2,SSE3,SSEE3,SSE4 – последующие расширения этой идеи. Использование внутренней памяти, распределение регистров: Скорость доступа к внешней памяти значительно ниже скорости вычислений. Cоздание на процессоре кэш-памяти. Блоки оперативной памяти отображаются на быстрый кэш. «Попадание» и «промах» (cash miss). Различные виды кэш-памяти. полностью ассоциативная кэш-память (каждый блок может отображаться в любое место кэша) память с прямым отображением (каждый блок может отображаться в одно место) различные гибридные варианты (секторная память, память с множественноассоциативным доступом) Множественно-ассоциативный доступ – по младшим разрядам определяется строка кэша, где может отображаться данная память, но в этой строке может находиться несколько слов основной памяти, выбор из которых проводится на ассоциативной основе. Работа с регистрами: Технология EM64T – добавлены дополнительные системные регистры. Регистры – самая быстрая память процессора. Чем больше регистров, тем больше временных данных может быть размещено для вычислений в ALU. Конвейер 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 Качество работы командного устройства (CU) Качество конвейеризации, уровень параллелизма инструкций Конвейеризация предполагает, что последовательные инструкции будут перекрываться при выполнении. Выполнение типичной команды можно разделить на следующие этапы: • выборка команды – IF; • декодирование команды / выборка операндов из регистров - ID; • выполнение операции / вычисление эффективного адреса памяти - EX; • обращение к памяти - MEM; • запоминание результата - WB. Конвейеризация улучшает пропускную способность процессора, но если инструкции зависят от результата предыдущих инструкций, то возникают задержки. Т.е. польза от конвейеризации определяется уровнем параллелизма инструкций. Качество предсказания переходов: Инструкции могут быть зависимыми по данным и по управляющей логике программы. (Data dependence and control flow dependence). Эффективность конвейерных механизмов ограничивается различными условными переходами внутри программы. Механизм предсказания переходов (branch prediction). МП выбирает один из возможных направлений потока управления и продолжает выбирать инструкции и нагружать конвейеры МП работой. Ошибка предсказания (branch misprediction) вызывает большую задержку при выполнении программы, поскольку вызывают необходимость заново заполнить конвейеры МП. Существует также механизм предсказания цели ветвления (branch target prediction), который предсказывает безусловные переходы. Качество упреждающей выборки: Поскольку программы часто работают с протяженными данными (структурами, массивами), то кэш оказывается неэффективным из-за большого количества промахов. Для преодоления этой проблемы был разработан механизм упреждающей выборки данных (data prefetching). МП, заметив тенденцию в обращении к памяти, пытается заранее закачать требуемую память в кэш. Помимо процессорного механизма упреждающей выборки есть программный механизм упреждающей выборки. Суперскалярность: Суперскалярный процессор – это процессор способный выполнять несколько операций за один такт. Несколько исполнительных устройств в ALU (execution unit) Основными компонентами суперскалярного процессора являются устройства для интерпретации команд, снабженные логикой, позволяющей определить, являются ли команды независимыми, и достаточное число исполняющих устройств. В исполняющих устройствах могут быть конвейеры. Первым суперскалярным процессором x86 архитектуры был Pentium. В нем исполнительный блок был реализован в виде двух параллельных конвейеров (U и V). U мог исполнять все инструкции, в то время как V – простейшие наиболее часто выполняемые инструкции. Выигрыш от суперскалярности также определяется уровнем параллелизма инструкций. Т.е. насколько последующая инструкция зависит от результатов выполнения предыдущей. Упрощенная модель процессора Шина ввода-вывода Оперативная память (RAM) Внешняя память Устройство взаимодействия с внешней памятью Суперскалярность Вычислительное устройство Вычислительное (ALU) устройство (ALU) Система кэшей Управляющее устройство (CU) Регистры Регистры Упреждающая выборка Конвейеризация, предсказание переходов Параллелизация и многоядерность: Многозадачность, многопоточность. Одновременно выполняющиеся потоки конкурируют за ресурсы микропроцессора. Ммногоядерные МП (multi-core). Это процессор, который содержит несколько ядер (более или менее независимых процессоров) в одном пакете. Эти ядра содержат всю функциональность обычного процессора, но совместно используют системную шину и кэши. Также для увеличения производительности используются многопроцессорные решения. Современные системы имеют по паре двух, а то и четырехядерных МП. Основные характеристики влияющие на производительность МП Эффективность работы с кэшпамятью. Правильное предсказание переходов. Эффективность использования векторных инструкций. Эффективность параллелизации. Уровень параллелилизма. Измерение производительности Потребителям необходимы критерии определения производительности вычислительной системы. Репрезентативная выборка типичных задач. Универсальная схема тестирования Независимость от производителей МП Spec.org (Standart Performance Evaluated Corporation) – некоммерческая организация для подготовки, поддержки и сопровождения стандартного набора тестов для сравнения производительности различных вычислительных систем. Эта организация разрабатывает стандартные сюиты и публикует результаты измерений. CPU2006 – разработана для измерения производительности. Может быть использована для сравнения работы программ выполняемых на различных вычислительных системах. CINT2006 для целочисленных вычислений. CFP2006 для сравнения производительности работы с вещественными числами. OMP2001 – измеряет производительность тестов использующих OpenMP стандарт для параллельных вычислений с совместно используемой памятью (sharedmemory parallel processing). Место и роль компилятора. Компиля́ тор — транслятор, который осуществляет перевод всей исходной программы в эквивалентную ей результирующую программу на языке машинных команд или на языке ассемблера. Играет ли компилятор какую-либо роль в борьбе за производительность МП? Компилятор используется во время тестирования и отладки функциональности новых МП. Только с помощью компилятора можно показать рост производительности МП связанный с новыми командами, увеличением количества регистров и т.п. Компилятор способен скрыть неудачи архитекторов. Программа должна быть: Легко читаемой и модифицируемой Легко отлаживаемой Быстро исполняемой Cовременный компилятор должен уметь: создавать исполняемый модуль под любую архитектуру варьировать уровни отладки и быстродействия. Чтобы использовать умело средства компилятора, программист должен как минимум: иметь представления о архитектуре, на которой будет использоваться его программа. ознакомиться с флагами компилятора. ознакомиться с основными техниками улучшения производительности, которые использует компилятор. ознакомиться с основными проблемами вызывающими замедление работы программы. знать примерные данные, с которыми будет работать программа. уметь пользоваться инструментами для анализа производительности программы. Мы обсуждали факторы влияющие на производительность. В каких случаях компилятор способен помочь МП достичь наилучшей производительности? Тактовая частота процессора Объем адресуемой памяти и скорость доступа к внешней памяти Скорость выполнения инструкций и полнота базового набора инструкций Использование внутренней памяти, распределение регистров Уровень конвейеризации Качество предсказания переходов Качество упреждающей выборки Суперскалярность Параллелизация и многоядерность Скорость выполнения инструкций и полнота базового набора инструкций. В общем случае, одни и те же конструкции языка высокого уровня могут быть по разному реализованы в машинных кодах. Скалярные оптимизации Цикловые оптимизации Векторизация Межпроцедурный анализ … - все эти оптимизации призваны создать оптимальный набор машинных инструкций соответствующих коду программы. Использование внутренней памяти, распределение регистров. Трансформация данных Оптимизации циклов (Перестановка циклов, объединение циклов // Loop interchange, loop fusion) Уровень конвейеризации За счет улучшения инструкционного параллелизма. Оптимизации циклов (Объединение циклов) Качество предсказания переходов Статический и динамический профилировщик Оптимизации циклов Межпроцедурный анализ, инлайнинг функций Качество упреждающей выборки Программная упреждающая выборка (Software prefetch) Суперскалярность Улучшение параллелизма инструкций Параллелизация и многоядерность Автоматическая параллелизация Интеловские компиляторы Интел имеет С/C++ и Фортран для операционных платформ Windows, Linux и Mac OS. Для Windows INTEL компилятор сделан как настройка к Microsoft Visual Studio. Главной целью корпорации является высокая производительность компиляторов и совместимость с Microsoft Visual Studio на Windows платформе и gcc на Linux и Mac OS. www.intel.com/software/products Оптимизации: 1.) Скалярные оптимизации Свертка констант, протяжка констант, протяжка копий (Constant folding, constant propagation, copy propagation) Удаление общих подвыражений (Common subexpression elimination) Удаление мертвого кода (Dead code elimination) 2.) Цикловые оптимизации Вынесение инвариантов цикла (Loop invariant code motion) Вынесение условных переходов (Loop unswitching) Развертка цикла (Loop unrolling) Перестановка циклов (Loop interchange) Разбиение, объединение циклов (Loop distribution, loop fusion) Помимо этих оптимизаций существуют и другие, порой очень разнообразные: Strength reduction Scalar expansion Loop tiling Loop skewing Loop coalescing Loop collapsing и многие другие. Одна из основных проблем и задач компилятора – доказательство правомерности тех или иных оптимизаций и оценка их выгодности. 3.) Векторизация Векторизация, в компьютерной науке, это процесс конвертации программы из скалярного вида, который выполняет операции с парой операндов в векторизованную программу в которой каждая инструкция выполняется с парой векторных операндов. DO I=1,100 A(I)=B(I) END DO Векторизация DO I=1,25 A(I:I+4)=B(I:I+4) END DO Влияние выравнивания (alignment) на производительность. Компилятор выполняет векторизацию, условную векторизацию. 4.)Автоматическая параллелизация Автоматическая параллелизация – это процесс автоматического преобразования последовательного программного кода в многопоточный (multi-threaded) код для того чтобы использовать несколько вычислительных устройств одновременно. Актуально для современных многопроцессорных и многоядерных машин. OpenMP (Open Multi-Processing) – это программный интерфейс, который поддерживает многоплатформенное многопроцессорное программирование с общей памятью на C/C++ и Фортране на многих архитектурах. 5.)Оптимизация вызовов функций, межпроцедурный анализ. Инлайнинг – эта оптимизация вставляет код функции вместо вызова функции. Частичный инлайнинг (partial inlining) – инлайнинг части вызываемой функции внутрь вызывающей. Протяжка аттрибутов функций. Протяжка аттрибутов переменных. Изменение области видимости переменных. LPT анализ Анализ потока данных Функции, используемые только в одной программе получают атрибут static. Удаление неиспользуемых глобальных переменных. Удаление мертвого кода. Протяжка информации о выравнивании аргументов. Быстрый анализ типов. (Rapid type analysis) Статический и динамический профилировщики. Подсчет «весовых» характеристик – вероятность перехода, вес базового блока. Используется при многих оптимизациях (трансформация данных). Статический профилировщик вычисляет характеристики анализируя исходный код программы. Динамический профилировщик работает в два прохода: создает инструментированную версию программы и прогоняет ее с неким репрезентативным набором данных, использует собранную динамическую информацию для оптимизации программы. Некоторые оптимизации работают только при наличии динамической информации (трансформация данных). Зависимость основных характеристик компиляции. Производительность программы Время компиляции Размер кода Отладка, надежность Пошаговый алгоритм отладки/улучшения производительности программы 1.) Проверка корректности (/Od, -O0) Версия 11.0 по умолчанию включает векторизатор. Для того чтобы выполнять программу на старых процессорах “-mia32” 2.) Отладка. -g или –debug [keyword] (all,full,minimal) 3.) Используйте стандартные опции оптимизации –O1, -O2, -O3 4.) Использование процессорно специфических опций -xSSE3, -xSSSE3, -xSSE4.2 Можно так-же использовать –xhost и в этом случае компилятор будет использовать наиболее продвинутые опции процессора на котором выполняется компиляция. 5.) Использование VTune Performance Analyzer. Нахождение горячих функций и мест, где тратиться наибольшее процессорное время. Инструменты и методы используемые для оптимизации производительности программы. Intel VTune Performance Analyzer – это инструмент предназначенный для анализа производительности программ. Он позволяет легко найти проблемные узкие места и проанализировать их. Для этого нужен только исполняемый файл. Желательно, чтобы он содержал информацию о строках кода. 6.) Добавление межпроцедурных оптимизаций –ipo 7.) Использование динамического профилировщика. построение программы с опцией -prof-gen (программа с инструментированием) прогон с представительным набором данных (несколькими наборами) построение программы с опцией –prof-use 8.) использование автоматической параллелизации – parallel для автоматической распараллелизации циклов. 9.) использовать OPENMP директивы и опцию –openmp для генерации многопоточного кода