Почему инструкции SSE сохраняют верхние 128-битные регистры YMM?
Кажется, повторяющаяся проблема, что многие процессоры Intel (вплоть до Skylake, если я не ошибаюсь) демонстрируют низкую производительность при смешении инструкций AVX-256 с инструкциями SSE.
Согласно документации Intel, это вызвано тем, что инструкции SSE определены для сохранения старших 128 битов регистров YMM, поэтому, чтобы иметь возможность экономить энергию, не используя верхние 128 битов трактов данных AVX, ЦПУ хранит эти биты. отсутствует при выполнении кода SSE и перезагружает их при вводе кода AVX, хранение и загрузка обходятся дорого.
Однако я не могу найти очевидной причины или объяснения, почему инструкции SSE должны были сохранять эти старшие 128 бит. Соответствующие 128-битные инструкции VEX (использование которых позволяет избежать потери производительности) работают, всегда очищая верхние 128 битов регистров YMM вместо их сохранения. Мне кажется, что когда Intel определила архитектуру AVX, включая расширение регистров XMM до регистров YMM, они могли просто определить, что инструкции SSE также очистят старшие 128 бит. Очевидно, что поскольку регистры YMM были новыми, не могло быть устаревшего кода, который бы зависел от инструкций SSE, сохраняющих эти биты, и мне также кажется, что Intel могла легко предвидеть это.
Итак, какова причина, по которой Intel определила инструкции SSE для сохранения старших 128 битов регистров YMM? Это когда-нибудь полезно?
2 ответа
Чтобы переместить внешние ресурсы на сайт, я извлек соответствующие параграфы из Michael Petch.
Все кредиты идут к нему.
Ссылка указывает на очень похожий вопрос, заданный Агнером Фогом на форуме Intel.
[Туман в ответ на ответ Intel] Если я вас правильно понимаю, вы решили, что необходимо иметь две версии всех 128-битных инструкций, чтобы избежать разрушения верхней части регистров YMM в случае, если прерывание вызывает драйвер устройства. используя устаревшие инструкции XMM.
Intel была обеспокоена тем, что, выполняя устаревшие инструкции SSE, обнуляя верхнюю часть регистров XMM, ISR теперь неожиданно влияют на новые регистры YMM.
Без поддержки сохранения нового контекста YMM это сделало бы невозможным использование AVX ни при каких обстоятельствах.
Однако Фог не был полностью удовлетворен и указал, что простая перекомпиляция драйвера с AVX-совместимым компилятором (так что использовалась инструкция VEX) приведет к тому же результату.
Intel ответила, что их целью было избежать переписывания существующего программного обеспечения.
Мы не можем заставить индустрию переписать / исправить все существующие драйверы (например, использовать XSAVE), и нет способа гарантировать, что они сделали бы это успешно. Возьмем, к примеру, боль, которую индустрия все еще переживает при переходе с 32-х и 64-битных операционных систем! Отзывы, которые мы получили от поставщиков ОС, также не позволяли добавлять накладные расходы на обслуживание ISR, чтобы добавлять накладные расходы на управление состоянием при каждом прерывании. Мы не хотели навязывать ни одну из этих затрат тем частям отрасли, которые обычно не используют широкие векторы.
Имея две версии инструкций, поддержка AVX в драйверах может быть достигнута, как это было для FPU/SSE:
Приведенный пример аналогичен текущему сценарию, когда поставщик драйвера ring-0 (ISR) пытается использовать состояние с плавающей запятой или случайно связывает его с некоторой библиотекой в ОС, которые не управляют этим контекстом автоматически при Ring-0. Это хорошо известный источник ошибок, и я могу предложить только следующее:
На этих ОС разработчикам драйверов не рекомендуется использовать плавающую точку или AVX
Разработчикам драйверов следует рекомендовать отключать аппаратные функции во время проверки драйверов (т. Е. Состояние AVX может быть отключено драйверами от Ring-0 до XSETBV()
Предыстория: решение было принято заранее, чтобы KeSaveFloatingPointState ничего не делал в Windows x64 и разрешал использовать регистры XMM без дополнительных вызовов сохранения / восстановления даже в драйверах. Очевидно, что эти драйверы не будут знать о регистрах AVX или YMM.