Что такое спекулятивное исполнение?

Что такое спекулятивное исполнение?

Поскольку обсуждение ошибок Spectre и Meltdown доминирует в технологическом новостном цикле, неоднократно упоминалась специфическая особенность высокопроизводительных процессоров: спекулятивное выполнение. Это ключевая возможность для продуктов ARM более высокого уровня, стандартных ядер ARM от Apple, семейства POWER IBM и большинства процессоров x86 производства Intel и AMD. Вот что такое спекулятивное исполнение и как оно связано с другими ключевыми возможностями современных микропроцессоров и как недавняя ошибка Meltdown нацелена на процессоры Intel в частности.

Что такое спекулятивное исполнение?

Спекулятивное выполнение - это метод, который разработчики процессоров используют для повышения производительности процессора. Это один из трех компонентов исполнения вне порядка, также называемый динамическим исполнением. Наряду с прогнозированием нескольких ветвей (используется для прогнозирования команд, которые, скорее всего, понадобятся в ближайшем будущем) и анализа потока данных (используется для выравнивания инструкций для оптимального выполнения, в отличие от выполнения их в том порядке, в котором они вошли), спекулятивное выполнение резкое повышение производительности по сравнению с предыдущими процессорами Intel.

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

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

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

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

Причина, по которой его «спекулятивное» исполнение, конечно, связано с тем, что ЦП может быть ошибочным. Если это так, система загружает соответствующие данные и выполняет эти инструкции. Но отраслевые предсказатели не очень часто ошибаются; показатели точности обычно превышают 95 процентов.

Зачем использовать спекулятивное исполнение?

Десятилетия назад, до того, как было изобретено исполнение вне очереди, процессоры были тем, что мы сегодня называем «по порядку». Инструкции выполнялись в том порядке, в котором они были получены, без каких-либо попыток изменить порядок их выполнения или выполнить их более эффективно. Одной из основных проблем при исполнении заказа является то, что остановка конвейера останавливает весь процессор до тех пор, пока проблема не будет решена.

Другой проблемой, вызвавшей развитие спекулятивного исполнения, был разрыв между CPU и основными скоростями памяти. На приведенном ниже графике показан промежуток между часами процессора и памяти. По мере того как разрыв увеличился, количество времени, затрачиваемое ЦП на основную память для доставки информации, также увеличилось. Такие функции, как кэширование L1, L2 и L3 и спекулятивное выполнение, были сконструированы таким образом, чтобы поддерживать работу процессора и минимизировать время, затрачиваемое на холостом ходу.

Если память может соответствовать производительности CPU, не будет необходимости в кэшах.
Если память может соответствовать производительности CPU, не будет необходимости в кэшах.

Это сработало. Комбинация больших кэшей вне игры и исполнение вне порядка дали возможность Intel Pentium Pro и Pentium II растянуть ноги так, как предыдущие чипы не могли сравниться. Этот график из статьи Anandtech ясно показывает преимущество.

Что такое спекулятивное исполнение?

В конечном итоге именно Pentium II предоставил большинству потребителей преимущества нестандартного исполнения. Pentium II был быстрым микропроцессором по сравнению с системами Pentium, которые были кратковременными. AMD была абсолютно способным вариантом второго уровня - моим основным компьютером в колледже был AMD K6-233, который стал K6-2 400, который получил новую материнскую плату с поддержкой K6-2 + и стал разогнанным K6- 2+ 550. Но до тех пор, пока оригинальный Athlon не запустится, Intel может сделать очень честную заявку на всеобъемлющую корону производительности.

Pentium Pro и более поздний Pentium II были намного быстрее, чем предыдущие архитектуры Intel. Это не было гарантировано. Когда Intel спроектировала Pentium Pro (первый процессор использовал спекулятивное исполнение), он потратил значительное количество своего бюджета на мощность и мощность, чтобы вывести чип на рынок. Но ставка окупилась, большое время.

Существуют различия между тем, как Intel, AMD и ARM реализуют спекулятивное выполнение, и эти различия являются частью того, почему Intel выставлена ​​на Meltdown способами, которыми не являются другие поставщики. Но спекулятивное исполнение, как техника, просто слишком ценно, чтобы прекратить использовать. Сегодня каждая архитектура высокопроизводительного процессора - AMD, ARM, IBM, Intel, SPARC - использует исполнение вне порядка. И каждое из них использует спекулятивное исполнение, в то время как реализовано по-разному от компании к компании.

Почему Meltdown такая проблема для Intel?

Причина, по которой Meltdown вызывает такие уникальные головные боли для Intel, заключается в том, что Intel допускает спекулятивное выполнение для доступа к привилегированной памяти, приложение для пользовательского пространства никогда не будет позволено касаться. Вот как MarkCC of Goodmath.org описывает проблему:

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

Реализации спекулятивных предсказаний других поставщиков ЦП не позволяют приложениям пространства пользователя исследовать содержимое памяти пространства ядра в любой момент. Единственный способ смягчить Meltdown в программном обеспечении - заставить систему выполнять полный контекстный переключатель каждый раз, когда он переключается между ядром и памятью пользователя. Причина, по которой влияние производительности от Meltdown настолько разнообразна, объясняется тем, насколько сильно этот патч болит, зависит от того, как часто приложение переключается на контекст.

Решение этих проблем - это вызов некоторым людям

Мы сосредоточились на Meltdown здесь, потому что это недостаток, обернутый вокруг спекулятивного исполнения, но есть пятна для Windows, которые развертываются как для вариантов Spectre, так и для Meltdown - и поражение производительности, связанное с смягчением Spectre, похоже, что это сильно ударит по некоторым системам.

Согласно сообщению в блоге Microsoft, пользователи Windows 10 с Skylake, Kaby Lake или Coffee Lake должны видеть снижение производительности в одиночных цифрах. Пользователям с Haswell или более ранними процессорами, использующими Windows 10, не так повезло. MS сообщает, что «в некоторых тестах наблюдается более значительное замедление, и мы ожидаем, что некоторые пользователи заметят снижение производительности системы».

Если вы используете Windows 7 или Windows 8, вам больше удастся получить удар. Microsoft отмечает, что большинство пользователей испытывают снижение производительности. Пока неясно, пойдет ли Intel и AMD на снижение производительности Spectre (AMD по-прежнему не подвержена Meltdown). И мы знаем, что Meltdown не оказывает незначительного влияния на использование сервера и некоторые тесты в Linux.

Эта ситуация все еще развивается, но, надеюсь, мы выяснили хотя бы одну часть проблемы. Если вы используете систему Haswell или более раннюю версию и задаетесь вопросом, какую производительность вы попросите отказаться от нее, то, что она стоит, я тут же с вами. Внезапно мой процессор Ivy Bridge выглядит так, как будто это может потребоваться заменить, если ухудшение производительности будет достаточно плохим.

Ознакомьтесь с нашей серией wfoojjaec Explains для более глубокого освещения сегодняшних горячих тем.