Архитектура микропроцессора Intel и основные факторы, влияющие на его производительность
Приведу две схемы из Intel® 64 and IA-32 Architectures Software Developer’s Manual. Они дают примерное представление о архитектуре процессора.
Из этой схемы видно, что FE микропроцессора (пред)выбирает инструкции из памяти и декодирует их в микроинструкции. Эти микроинструкции заполняют Trace Cache. Из Trace Cache микроинструкции передаются для выполнения в Execution Out-Of-Order Core. После выполнения микроинструкции дожидаются решения о своей валидности в Retirement секции.
Параллельные вычисления
- Многозадачность.
- Многопоточность.
- Гиперпоточность (Hyper-threading Pentium 4 – Core i7)
- Многоядерность
- Многопроцессорные решения
Наличие нескольких вычислительных ядер дает возможность достижения высокой производительности приложения распределением вычислений между этими вычислительными ядрами.
На ранних компьютерах, когда какая-либо задача требовала доступа к периферийным устройствам, МП вынужден был простаивать, ожидая пока периферийное устройство обработает данные. Поэтому возникла простая идея: на время этого ожидания сохранить контекст программы и начать исполнять другую задачу. Возникла концепция многозадачных операционных систем. Были продуманы и реализованы разные подходы к решению этой проблемы. Как правило многозадачные системы реализовывают и многопоточность, т.е. одна задача может выполняться более чем в одном потоке, что позволяет вынести работу с периферийными устройствами в отдельный поток.
Ну и последняя возможность существенно повлиять на производительность — это параллелизация и многоядерность. Вы представляете, что все современные вычислительные системы, как правило, реализуют многозадачность и многопоточность. Многозадачность — это когда одновременно могут выполняться несколько задач, многопоточность — когда одна задача может работать в несколько потоков, то есть одновременно делать несколько разных дел.
Есть еще такая технология Hyper-threading, которая когда-то появлялась и теперь возродилась. Это означает, что существует один конвейер, на который, тем не менее, поступают инструкции двух разных задач, что позволяет иметь больше независимых инструкций в буфере конвейера и более плотно нагрузить этот конвейер. Операционная система в этом случае видит два виртуальных ядра.
Многоядерность — это когда в нашем процессоре несколько ядер. По аналогии с промышленным предприятием мы имеем два цеха с конвейером по сборке машин вместо одного , но при этом железнодорожная станция, на которую приходят компоненты и которая осуществляет отправку готовой продукции формально одна.
Существуют также многопроцессорные решения. Сейчас это уже стандарт: например, двухпроцессорная вычислительная система, и каждый процессор еще имеет 4 ядра. Наличие нескольких вычислительных ядер дает возможность достижения высокой производительности благодаря распределениям вычислений между этими ядрами.
Основные характеристики приложения, влияющие на его производительность
- Эффективность вычислений
- Эффективность работы с памятью
- Правильное предсказание переходов
- Эффективность использования векторных инструкций
- Эффективность параллелизации
- Уровень инструкционного параллелизма
Теперь, плавно переходя от факторов влияющих на производительность процессора к факторам влияющим на производительность приложения, сформулируем какие характеристики приложения влияют на его производительность.
Основные характеристики приложения, влияющие на его производительность:
Эффективность вычислений |
Эффективность работы с памятью |
Правильное предсказание переходов |
Эффективность использования векторных инструкций |
Эффективность параллелизации |
Уровень инструкционного параллелизма. |
Эффективность выполнения. Я подразумеваю, что мы не делаем какую-то ненужную работу: все, что можно было посчитать по время компиляции, мы посчитали. Мы не делаем повторных вычислений там, где была возможность вычислить один результат и сохранить его во временной переменной и т.п. Эффективность вычислений — это качество кода, которое определяетя компилятором. Когда мы говорили про работу микропроцессора, то этот фактор не упоминался, но его необходимо упомянуть, когда мы начинаем говорить уже о приложениях.
Правильное предсказание переходов. Мы можем повлиять на этот фактор, удалив лишние переходы, правильно if’ы и else’ы расставить, чтобы у нас статический предсказатель реже ошибался.
Уровень инструкционного параллелизма — если в приложении существуют какие-то взаимосвязанные цепочки вычислений, то такой код трудно выполнить оптимальным образом из-за наличия большого количества зависимых вычислений. Иногда можно менять порядок вычислений и влиять на этот фактор.
Измерение производительности
От каких факторов зависит производительность конкретной программы?
- качество работы оптимизирующего компилятора
- работа МП
Потребителям необходимы критерии определения производительности вычислительной системы
- Репрезентативная выборка типичных задач
- Универсальная схема тестирования
- Независимость от производителей МП
Spec.org (Standart Performance Evaluated Corporation) – некоммерческая организация для подготовки, поддержки и сопровождения стандартного набора тестов для сравнения производительности различных вычислительных систем. Эта организация разрабатывает стандартные пакеты и публикует результаты измерений.
CPU2006 – разработана для измерения производительности. Может быть использована для сравнения работы программ, выполняемых на различных вычислительных системах. CINT2006 для целочисленных вычислений. CFP2006 для сравнения производительности работы с вещественными числами.
OMP2001 – измеряет производительность на тестах с использованием OpenMP (это библиотека для параллельных вычислений с общей памятью (shared-memory parallel processing)).
Место и роль компилятора.
Компилятор — транслятор, который осуществляет перевод всей исходной программы в эквивалентную ей результирующую программу на языке машинных команд или на языке ассемблера.
Играет ли компилятор какую-либо роль в борьбе за производительность МП?
- Компилятор используется во время тестирования и отладки функциональности новых МП.
- Только с помощью компилятора можно показать рост производительности МП связанный с новыми командами, увеличением количества регистров и т.п.
- Компилятор способен скрыть неудачи архитекторов.
Измерение производительности – довольно сложная тема. Как вы должны были догадаться из предыдущих рассуждений производительность зависит от двух факторов: от непосредственной качественной работы микропроцессора (МП) и от качества работы оптимизирующего компилятора. То есть качество работы оптимизирующего компилятора влияет непосредственно на результаты измерения производительности. Есть специальная организация – Standard Performance Evaluated Corporation — некоммерческая организация, которая делает аудиторскую независимую оценку производительности разных вычислительных систем. Она занимается сбором типичных задач, предоставляет своим пользователям некую универсальную систему тестирования и гарантирует независимое мнение о производительности микропроцессоров.
Соответственно, если вас интересует вопрос о производительности, вы можете зайти на сайт этой организации, заплатить небольшие деньги и скачать оттуда пакет для измерения производительности, получить доступ к двум различным вычислительным системам, взять этот пакет, инсталлировать его. Пакет позволяет построить и прогнать специальные программы, получить цифры и сказать: "с использованием представительной выборки задач из сюиты такой-то мы получили результат, что вот эта система в таких-то задачах эту систему превосходит, а на таких задачах немного проигрывает". В мире существуют аналитики, которые на этом зарабатывают деньги. Перед публикацией в научных компьютерных журналах своих отчетов, они используют этот пакет. Есть различные пакеты CPU2006, OMP2001 и так далее для тестирования различных аспектов производительности. Поскольку производительность зависит от микропроцессора и от компилятора, то компилятор — это важная часть в борьбе за признание высокой производительностей изделий. Если появляется новый микропроцессор, которые реализует какие-то новые команды, трудно показать улучшение его производительности из-за этих команд если не будет компилятора способного использовать эти команды в исполняемой программе. Другой фактор влияния компилятора на производительность связан с тем, что если в процессе эксплуатации процессора обнаружены какие-то инструкции, которые на процессоре почему-либо выполняются медленно, то с помощью компилятора мы можем каким-то образом заменить плохие инструкции на хорошие. Компилятор также активно используется при тестировании и разработке новых архитектур.
Т.е. с точки зрения разработки и продвижения процессоров компилятор очень важный инструмент.
Можно провести некую аналогию на использование компилятора. Например, выполнение какой-то расчетной задачи мы можем сравнить с прохождением человеком некоего маршрута по пересеченной местности из точки А в точку В. Примерную схему маршрута и контрольные точки определил разработчик, написавший алгоритм и запрашивающий результаты рассчетов. Процессор в данном случае будет отвечать за физические кондиции того человека, который пойдет через лес. То есть он может быть очень сильный и может идти по ровной местности со скоростью 6 км/ч. Другой процессор может идти со скоростью 5 км/ч. А дальше вопрос стоит в выборе маршрута. Умный компилятор найдет места, где мы можем срезать путь и пойти более короткой дорогой. Формально, может случиться так, что процессор, который обеспечивает меньшую скорость, за счет компилятора данную задачу по перемещению из точки А в точку В выполнит быстрее.