Основные параметры процессоров (Часть 3)

Основные параметры процессоров (Часть 3)

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

4. Функции процессоров и расширения.

     4.1. Суперскалярность. Первое, о чем стоит поговорить в данной подтеме – это суперскалярность. Это заумное слово, я думаю, у многих вызовет ассоциации с суперкомпьютерами и супервычислениями. В общем, со многими компьютерными терминами с приставкой «супер». В какой-то мере это верно, т.к. именно эта технология позволила сделать прорыв в скорости вычислений и в разы повысить параметр IPC (Instructions per clock – количество инструкций, исполняемых за такт).

Чтобы разобраться в суперскалярности, необходимо четко себе представлять понятие конвейера (разбирался в первой части), декодера и мопов.

Напомню, конвейер – это разделение выполнения команды на этапы.

Декодер команд – это физические блоки в процессоре, преобразующие команды в мопы.

Мопы (mop) – это простейшие команды, используемые процессором. Простая команда процессора, построенного на CISC (Complex Instruction Set Computer — компьютер с комплексным набором команд) архитектуре, является одним мопом, пригодным для исполнения процессором. Сложные команды CISC процессоров представляются в виде нескольких мопов. В RISC (Reduced Instruction Set Computer — компьютер с упрощённым набором команд) процессорах любая команда представляется в виде одного мопа, поэтому декодер в них не нужен (все команды простые). Мы рассматриваем обыкновенные десктопные процессоры. Все они CISC архитектуры, поэтому декодер команд в них присутствует всегда.

Декодер команд состоит из трансляторов и микросеквенсера.

Трансляторы – это блоки декодера, которые собственно преобразуют команды в мопы со скоростью 1-4 мопа/такт, а микросеквенсер устанавливает порядок, в котором эти мопы будут исполняться на процессоре.

Современные процессоры используют несколько конвейеров с большим количеством вычислительных блоков, благодаря чему команды обрабатываются быстрее. Первым процессором, в котором появилась суперскалярность (если не брать во внимание процессоры IBM и некоторых других фирм 60-80х гг.) является Intel Pentium, появившийся в 1993 году.

Суперскалярность – это использование процессором несколько декодеров команд и вычислительных блоков. Т.е. попросту говоря, используется несколько конвейеров. В случае Pentium – 2. В итоге процессор выполняет несколько команд за один такт. Из памяти (ОП или кэша) берется столько команд, сколько конвейеров в процессоре. Для успешного одновременного исполнения нескольких команд они (команды) должны работать с разными регистрами и не зависеть от результатов работы друг друга в один момент времени (команды не должны конфликтовать друг с другом). Если команды не могут работать параллельно друг с другом, то одна команда выполняется со следующей совместимой, а для несовместимой находится пара (тройка, четверка – в зависимости от количества конвейеров) в следующем такте.

Рассмотрим пример суперскалярности на классическом примере Pentium и проанализируем данную схему:

Пример суперскалярности на примере процессора Pentium

Здесь мы наблюдаем 2 конвейера. Каждый состоит из 5 этапов. Блок выборки команд вызывает первых две команды из памяти (кэша или, не дай Бог, оперативной памяти, что случается крайне редко). Блок декодирования декодирует две первые вызванные команды (преобразует в мопы и устанавливает порядок, в котором они будут выполняться), в это же время вызываются вторые две команды. Для первых команд вызываются операнды из памяти (данные, необходимые для работы этих команд), вторые команды декодируются и вызываются третьи две команды (блоком выборки). Первые команды выполняются вычислительными блоками, для вторых команд выбираются операнды, третьи команды декодируются и вызываются четвертые две команды. Результат первых команд записывается в регистр, вторые команды исполняются, для третьих вызываются операнды, четвертые декодируются и вызывается пятая пара команд. Ну и т.д. … Собственно, название говорит само за себя – команды обрабатываются как по конвейеру.

    4.2. Hyper-Threading (Гиперпоточность). Итак, суперскалярность работает и повышает производительность в какое-то количество раз. Но число вычислительных блоков (блоков выполнения команд) нельзя увеличивать до бесконечности из-за размера чипа, энергопотребления, тепловыделения, стоимости наконец, ну и т.д. Поэтому в процессорах Pentium 4  (не во всех) организована поддержка Hyper-Threading (HT). Там она была реализована неполноценно, в процессорах серии Core 2 ее не было, но позже к ней вернулись в процессорах Core i7 микроархитектур Nehalem, Sandy Bridge и Sandy Bridge-E. Аналога от AMD нет.

На практике это выглядит следующим образом. В диспетчере задач ОС видны все логические ядра (т.е. в случае поддержки процессором HT их будет в 2 раза больше, чем физических). У каждого логического ядра свои регистры, а все остальные вычислительные ресурсы общие (в пределах одного физического ядра). Это позволило ненамного увеличить размер ядра (в пределах 5-10%). Во время работы процессора выполняется 2 потока команд (каждая в регистрах своего логического ядра). Объем регистров ядра очень мал и составляет несколько сотен байт. По сути процессорные регистры являются иерархической структурой «ОП-кэш L3-кэш L2-кэш L1-процессорные регистры». В отличие от кэша у регистров нет задержек логических устройств, определяющих попадания и промахи (как в кэше), т.к. туда загружаются только 100% необходимые команды и данные. Вернемся к потокам: при прерывании одного потока (из-за промаха кэша, ошибки предсказания ветвлений или предвыборки данных) начинает выполняться другой поток, это уменьшает задержки.

Что это за блоки предсказания ветвлений и предвыборки данных, ухудшающие производительность? Если бы их не было и у кэша были 100% или 99% попадания, то технология Hyper-Threading не имела бы смысла. Какой второй поток команд исполнять, если не будет задержек и все процессорное время будет принадлежать одному процессу? Правильно, никакой.

Блок предсказания ветвлений занимается анализом того, куда произойдет переход и какие команды понадобятся в дальнейшем – какие из них вызывать из кэша. В каждой программе есть условный переход. Рассматриваемый блок пытается понять, какие команды понадобятся по типу команды, направлению (вперед/назад), сверяется со своей статистической таблицей (в которую заносится поведение предыдущих переходов, переходов в зависимости от типа данных, местоположения в программе и т.д.). Процент попадания блока предсказывания от 95 до 99%.

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

Т.к. суммарный КПД равен произведению КПД каждого звена (а в данном случае процент попаданий вполне можно рассматривать как КПД), то в худшем случае грубо КПД=0.95*0.95*0.95=0.86. С учетом усредненного процента промаха кэша, но без учета его латентности. Т.е. в худшем случае 14% процессорного времени (когда первый поток застопорился) будет выполняться второй поток. Предполагаю, что в программах, использующих большое количество переходов (особенно, когда их много, но небольших) HT будет полезен, если программа изначально распараллелена. Когда второму потоку не будет хватать инструкций и/или данных (а во время его исполнения подгрузятся команды и/или данные для первого потока), исполнение опять переключится на первый поток. Эта цифра (86%) примерно показывает прирост производительности от использования HT в распараллеленных задачах. Т.е. от 2-3% до 20-30%. Иногда бывает даже уменьшение производительности на несколько процентов, когда логические ядра используют перегруженные общие ресурсы.

  4.3.Многоядерность и многопроцессорность. Как можно кардинально увеличить производительность, когда одновременно декодируются и выбираются операнды для нескольких команд (пресловутая суперскалярность), эффективно используется процессорное время, когда возникают задержки (Hyper-Threading). Можно увеличить количество вычислительных блоков, но увеличатся затраты процессорного времени на синхронизацию выполнения команд в разных блоках (и в рамках одного теплопакета это возможно только при уменьшении техпроцесса). Теплопакет определяет мощность, вырабатываемую процессором при максимальной нагрузке в ваттах, которую необходимо эффективно рассеивать. Можно улучшать проценты попаданий блоков предсказания ветвлений и предвыборки данных, кэша, уменьшать латентность кэша, добавлять расширения команд … Однако все это не даст кардинального прироста производительности.

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

В 2005-2006 гг. появляются первые двухъядерные процессоры (два ядра на одном кристалле), потом Core 2 Quad соответственно четырехъядерный. Сейчас у Intel максимальное количество ядер в десктопном сегменте – 6, а у AMD – 8 (хотя и не совсем полноценных). AMD первая выпустила 6-ядерные модели. В серверном сегменте у Intel максимум 10 ядер, у AMD – 16.

Отсюда можно заключить, что AMD делает ставку на мультиядерность, а Intel налегает на параметр IPC (количество инструкций, выполняемых за такт).

Для тех, кому не хватает существующего количества ядер в современных процессорах, мультипроцессорные материнские платы никто не отменял. Цена их все равно остается завышенной и также, как и раньше используется оперативная память с ECC (Error-Correcting Code – с кодом коррекции ошибок), что в принципе актуально для серверов, работающих в режиме 24/7.

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

Процессоры с количеством ядер 4-8 (т.е. настольные) обеспечивают стабильную одновременную работу нескольких приложений и обеспечивают прирост, стремящийся к линейному в хорошо распараллеливающихся приложениях. К ярким примерам таких можно отнести рендеринг в 3D MAX, Maya, финальный просчет в монтажных программах типа Premiere. Для эффективного получения коэффициента цена/производительность используется такое понятие как сетевой рендер. Несколько компьютеров объединяются в сеть и работают вместе над своими участками. Например, в 3D MAX’e каждое ядро рендерит свой участок картинки. Т.к. следующие операции не зависят от результата предыдущих, то и задача распараллеливается отлично, а следовательно прирост будет стремиться к линейному. Однако тут могут возникать другие проблемы. При монтаже 4К видео в сетевом рендере узким местом будет дисковая подсистема. Поэтому важно собрать сбалансированную конфигурацию. Однако, домашнему пользователю все это мало интересно. А в огромной домашней сфере применения – компьютерных играх 4 быстрые ядра пока что быстрее, чем 6 медленных. А по коэффициенту цена/производительность в этой сфере им вообще нет равных.

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

   4.4.Функциональные устройства (основные) делятся на:

  • ALU (Arithmetic Logic Unit) — арифметико-логическое устройство;
  • FPU (Floating-Point Unit) – блок вычислений с плавающей точкой;
  • SIMD (Single Instruction, Multiple Data) – блок векторной обработки;

В современных процессорах обычно 3 ALU, FPU – 2-4, SIMD также 2-4.

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

Блоки FPU отвечают за те же операции с числами с плавающей точкой. За ними также закреплены специальные расширения команд, отвечающие за конкретные логические функции типа MMX, SSE.

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

Займемся более подробным рассмотрением расширений блоков FPU.

 4.5. Расширения блоков FPU (дополнительные инструкции). Самые распространенные:

  • MMX (Multimedia Extensions – мультимедийные расширения)
  • SSE (SSE, SSE2, SSE3, SSE4, SSE4a, SSE4.1, SSE4.2) (Streaming SIMD Extensions — потоковое SIMD-расширение процессора)
  • x86-64
  • 3D Now!
  • AMD-V
  • Intel-VT
  • AES (Advanced Encryption Standard – расширение системы команд или симметричный алгоритм блочного шифрования)
  • SMM (System Management Mode – режим системного управления)

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

MMX содержится во всех современных процессорах. Представляет собой дополнение, ускоряющее работу со звуком, фото- и видеоданными. Впервые был введен в Pentium MMX. Предполагает работу с 64-разрядными словами (1 слово – 16 бит). Поэтому за один такт обрабатывается одно квадрослово (меньшие данные объединяются). В принципе это тоже самое, что и работа 64-битного процессора в 64-битной ОС. MMX активно использовалась в играх и мультимедийных программах (сейчас также активно вытесняется SSE), но как таковой прирост составляет 5-30%.

SSE является продолжателем MMX, дополняет и расширяет MMX. В SSE регистры 128-битные и используются ресурсы сопроцессоров (блоков вычислений разных типов). SSE помогают в совершении однотипных операций над различными данными (как над скалярными, так и над векторными). В SSE2, SSE3, SSE4, SSE4.1, SSE4.2 добавляются новые функции. SSE4a – расширение, включающее SSE, SSE2, SSE3, SSE4, SSE4.1, SSE4.2 для AMD.

x86-64 – расширение стандартной 32-битной архитектуры. Регистры общего назначения стали 64-битными (ALU) и их количество увеличилось вдвое. FPU как были 80-битными, так и остались, SIMD по аналогии остались 128-битными. Последнее бутылочное горлышко в виде маленьких регистров было преодолено и процессоры стали полностью 64-битными. Т.е. от этого расширения была получена возможность использования 64-битного ПО, адресация памяти увеличилась до 1Тб. Последняя версия Windows 7 Ultimate 64-битная может адресовать 192 Гб. Точнее, адресует, потому что может адресовать гораздо больше, но разработчики просто не хотят тестировать систему на больших объемах.

3D Now! – расширение инструкций MMX, использующееся в процессорах AMD. Уже устарело, т.к. основные функции включены в SSE.

AMD-V и Intel-VT – это расширения, включающие наборы логических функций для аппаратной виртуализации. Виртуализация позволяет запускать несколько ОС на одном компьютере и представлять их работу так, как будто они работают на разных компьютерах. Отличие аппаратной виртуализации от программной в том, что программно этой задачей занимаются общие вычислительные блоки, а аппаратно – специальные. Переключение систем друг между другом происходит быстрее и участки памяти более защищены от перезаписи разными ОС. Ранее виртуализация использовалась в основном тестировщиками ПО, а сейчас в Windows 7 для запуска старых 32-битных программ необходима аппаратная виртуализация. Эти расширения встроены во все современные процессоры.

AES используется для защиты данных преимущественно в облачных вычислениях. Поддерживается процессорами Intel микроархитектур Gulftown, Sandy Bridge, Sandy Bridge-E, AMD – Bulldozer.

SMM – расширение, используемое всеми современными процессорами, используемое для обработки низкоуровневых прерываний, причем приостанавливается выполнение команд не только приложений, но и ОС. В эти прерывания входят обработки ошибок памяти (если память не ECC, управление энергосбережением, выключение процессоров при перегреве, управление питанием VRM (Voltage Regulator Module – модуль регулятора напряжения)) – используется для подачи необходимого напряжения на процессорное ядро, физически располагается на материнской плате недалеко от процессора и сильно греется).

Часть 1. Разрядность. Тактовая частота.

Часть 2. Кэш-память.

Часть 3. Функции процессоров и расширения

Часть 4. Техпроцесс, сокет.

Ваш комментарий

Ваш e-mail не будет опубликован.

*


*


Твитнуть