Проектирование процессора для обеспечения высокой производительности - это гораздо больше, чем просто увеличение тактовой частоты. Существует множество других способов повысить производительность, реализованных по закону Мура и способствующих разработке современных процессоров.
Тарифы не могут увеличиваться бесконечно.
На первый взгляд может показаться, что процессор просто выполняет поток инструкций один за другим, причем повышение производительности достигается за счет более высоких тактовых частот. Однако одного только увеличения тактовой частоты недостаточно. Потребляемая мощность и тепловая мощность увеличиваются с повышением тактовой частоты.
При очень высоких тактовых частотах необходимо значительно увеличить напряжение ядра процессора . Поскольку TDP увеличивается с квадратом V- ядра, мы в конечном итоге достигаем точки, когда чрезмерное энергопотребление, тепловая мощность и требования к охлаждению препятствуют дальнейшему увеличению тактовой частоты. Этот предел был достигнут в 2004 году, во времена Pentium 4 Prescott . Хотя недавние улучшения в энергоэффективности помогли, значительное увеличение тактовой частоты уже невозможно. Смотрите: Почему производители процессоров перестали увеличивать тактовые частоты своих процессоров?
График стандартных тактовых частот в современных ПК для энтузиастов за прошедшие годы. Источник изображения
- Согласно закону Мура, наблюдение гласит, что число транзисторов в интегральной схеме удваивается каждые 18–24 месяца, главным образом в результате усадки матрицы, были реализованы различные методы, повышающие производительность. Эти методы были усовершенствованы и усовершенствованы на протяжении многих лет, что позволяет выполнять больше инструкций в течение определенного периода времени. Эти методы обсуждаются ниже.
Кажущиеся последовательными потоки команд часто могут быть распараллелены.
- Хотя программа может просто состоять из серии инструкций для выполнения одна за другой, эти инструкции или их части могут очень часто выполняться одновременно. Это называется параллелизмом на уровне команд (ILP). Использование ILP жизненно важно для достижения высокой производительности, и современные процессоры используют для этого множество технологий.
Конвейерная обработка разбивает инструкции на более мелкие части, которые могут выполняться параллельно.
Каждая инструкция может быть разбита на последовательность шагов, каждый из которых выполняется отдельной частью процессора. Конвейерная обработка инструкций позволяет нескольким инструкциям проходить эти шаги один за другим, не дожидаясь полного завершения каждой инструкции. Конвейерная передача обеспечивает более высокую тактовую частоту: при выполнении одного шага каждой инструкции в каждом тактовом цикле потребуется меньше времени для каждого цикла, чем если бы все инструкции выполнялись по одной за раз.
Классический конвейер RISC содержит пять этапов: выбор инструкций, декодирование инструкций, выполнение инструкций, доступ к памяти и обратная запись. Современные процессоры разбивают выполнение на гораздо большее количество этапов, создавая более глубокий конвейер с большим количеством этапов (и увеличивая достижимые тактовые частоты, поскольку каждый этап меньше и занимает меньше времени), но эта модель должна дать базовое понимание того, как работает конвейерная обработка.
Источник изображения
Однако конвейерная обработка может привести к опасностям, которые необходимо устранить, чтобы обеспечить правильное выполнение программы.
Поскольку разные части каждой инструкции выполняются одновременно, возможно возникновение конфликтов, которые мешают правильному выполнению. Это так называемые опасности. Существует три типа опасностей: данные, структура и контроль.
Опасность данных возникает, когда инструкции читают и изменяют одни и те же данные одновременно или в неправильном порядке, что может привести к неверным результатам. Структурные риски возникают, когда нескольким инструкциям необходимо одновременно использовать определенную часть процессора. Опасности управления возникают, когда встречается инструкция условного перехода.
Эти опасности могут быть решены различными способами. Самое простое решение - просто остановить конвейер, временно приостановив выполнение одной или инструкций в конвейере для обеспечения правильных результатов. Этого по возможности избегают, поскольку это снижает производительность. В случае опасности данных используются такие методы, как переадресация операнда , чтобы уменьшить задержки. Опасности контроля обрабатываются с помощью прогнозирования ветвлений , который требует особого подхода и рассматривается в следующем разделе.
Прогноз ветвления используется для устранения опасностей, которые могут нарушить весь трубопровод.
Контрольные опасности, возникающие при возникновении условного перехода , особенно серьезны. Ветви предоставляют возможность продолжения выполнения в другом месте программы, а не просто следующей инструкции в потоке команд, в зависимости от того, является ли конкретное условие истинным или ложным.
Поскольку следующая команда для выполнения не может быть определена до тех пор, пока не будет оценено условие ветвления, невозможно вставить какие-либо инструкции в конвейер после ветвления в отсутствии. Поэтому трубопровод опорожняется (промывается), что может привести к потере почти столько же тактовых циклов, сколько этапов в трубопроводе. В программах часто возникают ветки, поэтому угрозы управления могут серьезно повлиять на производительность процессора.
Предсказание ветвлений решает эту проблему, угадывая, будет ли взята ветвь. Самый простой способ сделать это - просто предположить, что ветки всегда взяты или никогда не взяты. Однако современные процессоры используют гораздо более сложные методы для более высокой точности прогнозирования. По сути, процессор отслеживает предыдущие ветви и использует эту информацию любым из нескольких способов, чтобы предсказать следующую команду для выполнения. Затем конвейер может быть снабжен инструкциями из правильного местоположения на основе прогноза.
Конечно, если прогноз неверен, любые инструкции, которые были введены через конвейер после ветвления, должны быть отброшены, тем самым сбрасывая конвейер. В результате точность предсказателя ветвления становится все более критичной, так как конвейеры становятся все длиннее и длиннее. Конкретные методы прогнозирования ветвления выходят за рамки этого ответа.
Кэши используются для ускорения доступа к памяти.
Современные процессоры могут выполнять инструкции и обрабатывать данные гораздо быстрее, чем они могут быть доступны в основной памяти. Когда процессор должен получить доступ к ОЗУ, выполнение может приостановиться на длительные периоды времени, пока данные не станут доступны. Чтобы смягчить этот эффект, в процессор включены небольшие области высокоскоростной памяти, называемые кэшами .
Из-за ограниченного пространства, доступного на кристалле процессора, кэши имеют очень ограниченный размер. Чтобы максимально использовать эту ограниченную емкость, кэши хранят только самые последние или часто используемые данные (временная локальность). Поскольку доступ к памяти, как правило, кластеризован в определенных областях (пространственная локальность), блоки данных, близкие к тому, к которому недавно осуществлялся доступ, также сохраняются в кэше. Смотрите: Местонахождение ссылки
Кэши также организованы на нескольких уровнях различного размера для оптимизации производительности, поскольку большие кэши, как правило, медленнее, чем меньшие. Например, процессор может иметь кэш уровня 1 (L1), размер которого составляет всего 32 КБ, а размер кэша уровня 3 (L3) может составлять несколько мегабайт. Размер кеша, а также ассоциативность кеша, которые влияют на то, как процессор управляет заменой данных в полном кеше, существенно влияют на прирост производительности, который получается через кеш.
Внеочередное выполнение сокращает задержки из-за опасностей, позволяя первым выполнять независимые инструкции.
Не каждая инструкция в потоке команд зависит друг от друга. Например, хотя a + b = c
должно быть выполнено до того, как c + d = e
, a + b = c
и d + e = f
являются независимыми и могут выполняться одновременно.
Внеочередное выполнение использует этот факт, чтобы позволить другим независимым инструкциям выполняться, пока одна команда остановлена. Вместо того, чтобы требовать, чтобы инструкции выполнялись одна за другой в режиме блокировки, добавляется аппаратное планирование, позволяющее выполнять независимые инструкции в любом порядке. Инструкции отправляются в очередь инструкций и выдаются соответствующей части процессора, когда требуемые данные становятся доступными. Таким образом, инструкции, которые застряли в ожидании данных из более ранней инструкции, не связывают более поздние инструкции, которые являются независимыми.
Источник изображения
- Несколько новых и расширенных структур данных необходимы для выполнения не по порядку выполнения. Вышеупомянутая очередь команд, станция резервирования, используется для хранения команд до тех пор, пока не станут доступны данные, необходимые для выполнения. Буфер переупорядочения (ROB) используется для отслеживания состояния выполняемых команд в том порядке, в котором они были получены, чтобы инструкции выполнялись в правильном порядке. Файл регистров, который выходит за пределы числа регистров, предоставляемых самой архитектурой, необходим для переименования регистров, что помогает предотвратить зависимость независимых независимых команд из-за необходимости совместно использовать ограниченный набор регистров, предоставляемых архитектурой.
Суперскалярные архитектуры позволяют выполнять несколько команд в потоке команд одновременно.
Методы, описанные выше, только увеличивают производительность конвейера команд. Одни только эти методы не позволяют выполнять более одной инструкции за такт. Тем не менее, часто возможно выполнять отдельные инструкции в потоке команд параллельно, например, когда они не зависят друг от друга (как обсуждалось в разделе выполнения вне очереди) выше.
Суперскалярные архитектуры используют преимущества параллелизма на уровне команд, позволяя отправлять инструкции сразу нескольким функциональным блокам. Процессор может иметь несколько функциональных блоков определенного типа (таких как целочисленные 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, уменьшает ввод-вывод и задержку памяти. Это увеличивает пропускную способность за счет уменьшения задержек, вызванных задержками в доступе к данным с других устройств.