Проектирование процессора для обеспечения высокой производительности - это гораздо больше, чем просто увеличение тактовой частоты. Существует множество других способов повысить производительность, реализованных по закону Мура и способствующих разработке современных процессоров.
Тарифы не могут увеличиваться бесконечно.
На первый взгляд может показаться, что процессор просто выполняет поток инструкций один за другим, причем повышение производительности достигается за счет более высоких тактовых частот. Однако одного только увеличения тактовой частоты недостаточно. Потребляемая мощность и тепловая мощность увеличиваются с повышением тактовой частоты.
При очень высоких тактовых частотах необходимо значительно увеличить напряжение ядра процессора . Поскольку TDP увеличивается с квадратом V- ядра , мы в конечном итоге достигаем точки, когда чрезмерное энергопотребление, тепловая мощность и требования к охлаждению препятствуют дальнейшему увеличению тактовой частоты. Этот предел был достигнут в 2004 году, во времена Pentium 4 Prescott . Хотя недавние улучшения в энергоэффективности помогли, существенное увеличение тактовой частоты уже невозможно. Смотрите: Почему производители процессоров перестали увеличивать тактовые частоты своих процессоров?
График стандартных тактовых частот в современных ПК для энтузиастов за прошедшие годы. Источник изображения
- Благодаря закону Мура , наблюдение , которое гласит , что число транзисторов на интегральной схеме , удваивается каждые 18 до 24 месяцев, в основном в результате умирают психотерапевтов , разнообразие методов , которые были реализованы увеличение производительности. Эти методы были усовершенствованы и усовершенствованы на протяжении многих лет, что позволяет выполнять больше инструкций в течение определенного периода времени. Эти методы обсуждаются ниже.
Кажущиеся последовательными потоки команд часто могут быть распараллелены.
- Хотя программа может просто состоять из серии инструкций для выполнения одна за другой, эти инструкции или их части могут очень часто выполняться одновременно. Это называется параллелизмом на уровне команд (ILP) . Использование ILP жизненно важно для достижения высокой производительности, и современные процессоры используют для этого многочисленные методы.
Конвейер разбивает инструкции на более мелкие части, которые могут выполняться параллельно.
Каждая инструкция может быть разбита на последовательность шагов, каждый из которых выполняется отдельной частью процессора. Конвейерная обработка инструкций позволяет нескольким инструкциям проходить эти шаги один за другим, не дожидаясь полного завершения каждой инструкции. Конвейерная передача обеспечивает более высокую тактовую частоту: при выполнении одного шага каждой инструкции в каждом тактовом цикле потребуется меньше времени для каждого цикла, чем если бы все инструкции выполнялись по одной за раз.
Классический трубопровод RISC содержит пять этапов: FETCH инструкции, инструкция декодирование, выполнение инструкций, доступ к памяти и обратной запись. Современные процессоры разбивают выполнение на гораздо больше этапов, создавая более глубокий конвейер с большим количеством этапов (и увеличивая достижимые тактовые частоты, поскольку каждый этап меньше и занимает меньше времени), но эта модель должна дать базовое понимание того, как работает конвейерная обработка.
Источник изображения
Однако конвейерная обработка может создавать опасности, которые необходимо устранить для обеспечения правильного выполнения программы.
Поскольку разные части каждой инструкции выполняются одновременно, возможно возникновение конфликтов, которые мешают правильному выполнению. Это так называемые опасности . Существует три типа опасностей: данные, структура и контроль.
Опасность данных возникает, когда инструкции читают и изменяют одни и те же данные одновременно или в неправильном порядке, что может привести к неверным результатам. Структурные риски возникают, когда нескольким инструкциям необходимо одновременно использовать определенную часть процессора. Опасности управления возникают, когда встречается инструкция условного перехода.
Эти опасности могут быть решены различными способами. Самое простое решение - просто остановить конвейер, временно приостановив выполнение одной или инструкций в конвейере для обеспечения правильных результатов. Этого по возможности избегают, поскольку это снижает производительность. В случае опасности данных используются такие методы, как переадресация операнда , чтобы уменьшить задержки. Опасности управления обрабатываются с помощью прогнозирования ветвлений , который требует особого подхода и рассматривается в следующем разделе.
Прогноз ветвления используется для устранения опасностей, которые могут нарушить весь трубопровод.
Контрольные опасности, возникающие при возникновении условного перехода , особенно серьезны. Ветви предоставляют возможность продолжения выполнения в другом месте программы, а не просто следующей команды в потоке команд, в зависимости от того, является ли конкретное условие истинным или ложным.
Поскольку следующая команда для выполнения не может быть определена до тех пор, пока не будет оценено условие ветвления, невозможно вставить какие-либо инструкции в конвейер после ветвления в отсутствии. Следовательно, трубопровод опорожняется ( промывается ), что может привести к потере почти столько же тактовых циклов, сколько этапов в трубопроводе. В программах часто возникают ветвления, поэтому угрозы управления могут серьезно повлиять на производительность процессора.
Предсказание ветвлений решает эту проблему, угадывая, будет ли взята ветвь. Самый простой способ сделать это - просто предположить, что ветки всегда взяты или никогда не взяты. Однако современные процессоры используют гораздо более сложные методы для более высокой точности прогнозирования. По сути, процессор отслеживает предыдущие ветви и использует эту информацию любым из нескольких способов, чтобы предсказать следующую команду для выполнения. Затем конвейер может быть снабжен инструкциями из правильного местоположения на основе прогноза.
Конечно, если прогноз неверен, любые инструкции, которые были введены через конвейер после ветвления, должны быть отброшены, тем самым сбрасывая конвейер. В результате точность предсказателя ветвления становится все более критичной, так как конвейеры становятся все длиннее и длиннее. Конкретные методы прогнозирования ветвления выходят за рамки этого ответа.
Кэши используются для ускорения доступа к памяти.
Современные процессоры могут выполнять инструкции и обрабатывать данные гораздо быстрее, чем они могут быть доступны в основной памяти. Когда процессор должен получить доступ к ОЗУ, выполнение может приостановиться на длительные периоды времени, пока данные не станут доступны. Чтобы смягчить этот эффект, в процессор включены небольшие области высокоскоростной памяти, называемые кэшами .
Из-за ограниченного пространства, доступного на кристалле процессора, кэши имеют очень ограниченный размер. Чтобы максимально использовать эту ограниченную емкость, кэши хранят только самые последние или часто используемые данные ( временная локальность ). Поскольку доступ к памяти, как правило, кластеризован в определенных областях ( пространственная локальность ), блоки данных, близкие к тому, к которому недавно осуществлялся доступ, также сохраняются в кэше. Смотрите: Местонахождение ссылки
Кэши также организованы на нескольких уровнях различного размера для оптимизации производительности, поскольку большие кэши, как правило, медленнее, чем меньшие. Например, процессор может иметь кэш 1-го уровня (L1) размером всего 32 КБ, а кэш-память 3-го уровня (L3) может иметь размер несколько мегабайт. Размер кеша, а также ассоциативность кеша, которые влияют на то, как процессор управляет заменой данных в полном кеше, существенно влияют на прирост производительности, который получается через кеш.
Внеочередное выполнение сокращает задержки из-за опасностей, позволяя первым выполнять независимые инструкции.
Не каждая инструкция в потоке команд зависит друг от друга. Например, хотя a + b = c
должны быть выполнены до c + d = e
, a + b = c
и d + e = f
являются независимыми и могут быть выполнены в то же время.
Внеочередное выполнение использует этот факт, чтобы позволить другим независимым инструкциям выполняться, пока одна команда остановлена. Вместо того, чтобы требовать, чтобы инструкции выполнялись одна за другой в режиме блокировки,добавляется оборудование планирования, позволяющее выполнять независимые инструкции в любом порядке. Инструкции отправляются в очередь инструкций и выдаются соответствующей части процессора, когда требуемые данные становятся доступными. Таким образом, инструкции, которые застряли в ожидании данных из более ранней инструкции, не связывают более поздние инструкции, которые являются независимыми.
Источник изображения
- Несколько новых и расширенных структур данных необходимы для выполнения внеочередного выполнения. Вышеупомянутая очередь команд, станция резервирования , используется для хранения команд до тех пор, пока не станут доступны данные, необходимые для выполнения. Буфер повторного заказа (БОР) используются для отслеживания состояния команд в прогрессе, в том порядке , в котором они были получены, так что инструкции будут завершены в правильном порядке. Регистровый файл , который выходит за пределы количества регистров , предусмотренных архитектурой сам необходим для регистра переименования , который помогает предотвратить иначе независимые инструкции стать зависимыми в связи с необходимостью совместного использования ограниченного набора регистров , предусмотренных архитектурой.
Суперскалярные архитектуры позволяют выполнять несколько команд в потоке команд одновременно.
Методы, обсужденные выше, только увеличивают производительность конвейера команд. Одни только эти методы не позволяют выполнять более одной инструкции за такт. Тем не менее, часто можно выполнять отдельные инструкции в потоке команд параллельно, например, когда они не зависят друг от друга (как обсуждалось в разделе выполнения вне порядка) выше.
Суперскалярные архитектуры используют преимущества параллелизма на уровне команд, позволяя отправлять инструкции нескольким функциональным блокам одновременно. Процессор может иметь несколько функциональных блоков определенного типа (таких как целочисленные ALU) и / или различных типов функциональных блоков (таких как целочисленные и целочисленные блоки), на которые могут одновременно отправляться инструкции.
В суперскалярном процессоре инструкции планируются как в неупорядоченном дизайне, но теперь имеется несколько портов выдачи , позволяющих одновременно выполнять и выполнять разные инструкции. Расширенная схема декодирования команд позволяет процессору одновременно считывать несколько команд в каждом тактовом цикле и определять отношения между ними. Современный высокопроизводительный процессор может планировать до восьми команд за такт, в зависимости от того, что делает каждая команда. Так процессоры могут выполнять несколько инструкций за такт. Смотрите: Движок исполнения Haswell на AnandTech
Источник изображения
- Однако суперскалярные архитектуры очень сложно спроектировать и оптимизировать. Проверка зависимостей между инструкциями требует очень сложной логики, размер которой может экспоненциально увеличиваться по мере увеличения количества одновременных инструкций. Кроме того, в зависимости от приложения, в каждом потоке команд может быть только ограниченное количество инструкций, которые могут выполняться одновременно, поэтому усилия по использованию большего преимущества ILP страдают от уменьшения отдачи.
Добавлены более сложные инструкции, которые выполняют сложные операции за меньшее время.
По мере увеличения бюджетов транзисторов становится возможным реализовать более сложные инструкции, которые позволяют выполнять сложные операции за долю времени, которое они в противном случае занимали бы. Примеры включают в себя наборы векторных инструкций, такие как SSE и AVX, которые выполняют вычисления для нескольких фрагментов данных одновременно, и набор инструкций AES, который ускоряет шифрование и дешифрование данных.
Для выполнения этих сложных операций современные процессоры используют микрооперации (мопы) . Сложные инструкции декодируются в последовательности мопов, которые хранятся в выделенном буфере и планируются для выполнения индивидуально (в той степени, которая допускается зависимостями данных). Это дает процессору больше возможностей для использования ILP. Для дальнейшего повышения производительности можно использовать специальный кэш мопов для хранения недавно декодированных мопов, чтобы можно было быстро найти мопы для недавно выполненных команд.
Однако добавление этих инструкций не повышает производительность автоматически. Новые инструкции могут повысить производительность, только если приложение написано для их использования. Принятию этих инструкций препятствует тот факт, что приложения, использующие их, не будут работать на старых процессорах, которые их не поддерживают.
Так как же эти методы улучшают производительность процессора с течением времени?
С течением времени конвейеры стали длиннее, что сокращает время, необходимое для завершения каждого этапа, и, следовательно, обеспечивает более высокую тактовую частоту. Однако, среди прочего, более длинные конвейеры увеличивают штраф за неправильный прогноз ветвления, поэтому конвейер не может быть слишком длинным. Пытаясь достичь очень высоких тактовых частот, процессор Pentium 4 использовал очень длинные конвейеры, до 31 ступени в Prescott . Чтобы уменьшить дефицит производительности, процессор будет пытаться выполнить инструкции, даже если они могут потерпеть неудачу, и продолжит попытки, пока они не преуспеют . Это привело к очень высокому энергопотреблению и уменьшило производительность, получаемую от гиперпоточности . Более новые процессоры больше не используют конвейеры так долго, тем более что масштабирование тактовой частоты достигло предела;Haswell использует конвейер длиной от 14 до 19 этапов, а архитектуры с низким энергопотреблением используют более короткие конвейеры (Intel Atom Silvermont имеет от 12 до 14 этапов).
Точность прогнозирования ветвлений повысилась благодаря более продвинутым архитектурам, уменьшающим частоту сбрасываний конвейера, вызванным неправильным прогнозированием, и позволяющим одновременно выполнять больше команд. Учитывая длину конвейеров в современных процессорах, это имеет решающее значение для поддержания высокой производительности.
С увеличением бюджетов транзисторов в процессор могут быть встроены более крупные и эффективные кэши, что сокращает задержки из-за доступа к памяти. Для доступа к памяти может потребоваться более 200 циклов в современных системах, поэтому важно максимально сократить потребность в доступе к основной памяти.
Более новые процессоры могут лучше использовать преимущества ILP благодаря более продвинутой логике суперскалярного выполнения и «более широким» конструкциям, которые позволяют одновременно декодировать и выполнять больше команд. Архитектура Haswell может декодировать четыре инструкции и отправлять 8 микроопераций за такт. Увеличение бюджетов транзисторов позволяет включать в ядро процессора больше функциональных блоков, таких как целочисленные ALU. Ключевые структуры данных, используемые при неупорядоченном и суперскалярном выполнении, такие как станция резервирования, буфер переупорядочения и файл регистров, расширены в новых разработках, что позволяет процессору искать более широкое окно инструкций для использования их ILP. Это основная движущая сила повышения производительности современных процессоров.
Более сложные инструкции включены в более новые процессоры, и все большее число приложений используют эти инструкции для повышения производительности. Достижения в технологии компиляции, включая улучшения в выборе команд и автоматической векторизации , позволяют более эффективно использовать эти инструкции.
В дополнение к вышесказанному, более широкая интеграция компонентов, ранее внешних по отношению к ЦП, таких как северный мост, контроллер памяти и линии PCIe, уменьшает ввод-вывод и задержку памяти. Это увеличивает пропускную способность за счет уменьшения задержек, вызванных задержками в доступе к данным с других устройств.