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

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

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

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

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

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

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

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

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

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

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

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

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

Если бы память могла соответствовать производительности ЦП, не было бы необходимости в кешах.
Если бы память могла соответствовать производительности ЦП, не было бы необходимости в кешах.

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

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

Благодаря сочетанию спекулятивного исполнения и больших кешей, Pentium II 166 значительно превосходит Pentium 250 MMX, несмотря на то, что последний имеет преимущество в тактовой скорости в 1,51 раза по сравнению с первым.

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

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

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

Почему крах Intel является такой проблемой для Intel?

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

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

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

На некоторые стратегии смягчения воздействий влияют

Одна из предложенных стратегий смягчения, особенно недавно, это отключение Hyper-Threading. Apple выпустила обновление, относящееся к MDS, уведомляя своих пользователей о том, что они могут отключить HT, если они хотят ограничить возможность утечки данных между несколькими потоками в одном и том же ядре ЦП. Они также заявили, что это может привести к снижению производительности до 40 процентов. Это крайний случай, потому что HT, как правило, не «стоит» такой высокой производительности для процессоров Intel - мы ожидаем, что типичное влияние будет в диапазоне 20–30 процентов, - но это все же значительный удар и гораздо большая производительность, чем у нас. обычно видно из новой версии процессора.

Существуют реальные разногласия между экспертами относительно степени, в которой люди должны это делать, чтобы защитить себя. Некоторые, например Тео де Раадт, который запускает проект FreeBSD, по умолчанию отключили HT. Другие ОС еще не сделали этого шага. Такие компании, как Apple, избегали указывать своим клиентам также делать это, написав: «Хотя на момент написания этой статьи не было никаких известных эксплойтов, затрагивающих клиентов, клиенты, которые считают, что их компьютер подвергается повышенному риску атаки». Некоторые из исправлений связанные с исправлением, Spectre и Meltdown также оказали влияние на производительность, хотя некоторые из этих воздействий были затем уменьшены последующими исправлениями, и степень замедления зависит от рабочей нагрузки и, в некоторой степени, от архитектуры процессора, в первую очередь, зависит.

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

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

Читать далее

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

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

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

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

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

Спекулятивное исполнение было в новостях в последнее время, как правило, при обсуждении ошибок Meltdown и Spectre. Мы объясняем эту тему.

Новые уязвимости в области спекулятивного исполнения
Новые уязвимости в области спекулятивного исполнения

Новый вектор атаки против процессоров Intel был обнаружен, опять же, на спекулятивном исполнении.