2015-12-03 2 views
6

До сих пор мне удалось выяснить, что:Какие версии Windows поддерживают/требуют, какие мультимедийные расширения процессора?

  • SSE и SSE2, являются обязательными для Windows 8, а затем (и, конечно, для любого 64-битной ОС)
  • AVX поддерживается только Windows 7 SP1 или позднее

Есть ли какие-либо оговорки относительно использования SSE3, SSSE3, SSE4.1, SSE 4.2, AVX2 и AVX-512 в Windows?

Некоторые пояснения: Мне нужно, чтобы определить, какие ОС будут работать на моей программе, если я буду использовать инструкции с одного из наборов SSE/AVX.

+0

@ downvoters: Это не плохой вопрос, по сравнению с большинством, даже если он не имеет очень интересного ответа. ОП не знал этого, или он не спросил бы. Это ясно, и похоже, что ОП пытался исследовать, но не знал, что искать (потому что он еще не знает ответа на вопрос: P) Я вижу, что закрываю его как вне темы для SO/migrate к SU, но не к downvotes. –

+0

Я не думаю, что это вопрос SU, я сомневаюсь, что кодирование в сборке - это то, что делают даже самые суперпользователи. Я передумаю вопрос, чтобы было более ясно, что я пытаюсь использовать коды операций в своих программах. – Alexey

+1

Я не вижу, как этот вопрос просто «об общем вычислительном программном обеспечении». Единственный факт, что он содержит «Windows», не означает, что здесь нет темы. Это вопрос о платформах с точки зрения программистов, и это явно важно для тех, кто кодирует SSE/AVX и т. Д. – stgatilov

ответ

8

Расширения, предлагающие новое архитектурное состояние, требуют специальной поддержки ОС, поскольку ОС должна сохранять/восстанавливать восстановление данных на коммутаторах контекста. Поэтому с точки зрения ОС нет ничего лишнего, что нужно сделать, чтобы код пользовательского пространства запускал инструкции SSSE3, если ОС поддерживает SSE.

SSE, AVX и AVX512 - это расширения, которые ввели новое архитектурное состояние.

  • ГСПА введены XMM регистров (и MXCSR для округления режимов и FP состояния исключения)
  • AVX введенного YMM (нижнюю половину из которых являются старые XMM регс).
  • AVX512 представил zmm (расширение ymm regs), а также удвоил количество векторных регистров в 64-битном режиме: zmm0-zmm31.

Вы проверяете для поддержки процессоров для SSE или AVX обычным способом, с инструкцией CPUID.

Чтобы предотвратить повреждение данных при использовании нового расширения на многозадачной ОС, которое не сохраняет/не восстанавливает новое состояние архитектуры при переключении контекста, инструкции SSE не работают как незаконные инструкции, если ОС не имеет set an OS-support bit in a control register. Таким образом, векторные расширения «не работают» на ОС, которые не знают о сохранении/восстановлении необходимого состояния для этого расширения.


Для SSE, там не может быть любой чистой ОС-независимый способ, чтобы обнаружить, что OS пообещал сохранить/восстановить SSE состояние на переключений контекста, установив CR4.OSFXSR, CR4.OSXMMEXCPT и т.д. биты, потому что even reading a control register is privileged , и нет бита CPUID, который отражает настройку. В Windows вы можете использовать GetEnabledXStateFeatures, чтобы проверить, что ОС знает, как сохранить/восстановить состояние векторного регистра. Я не уверен, что вам нужно в других ОС; Поддержка SSE настолько распространена, что вам придется использовать действительно старую версию (или доморощенную) ОС, чтобы это было проблемой.


Для AVX, нам не нужна поддержка ОС обнаружить, что AVX может использоваться (поддерживается аппаратно и включен в ОС): CPUID включает в себя функцию немного OSXSAVE, который будет установлен, когда операционная система имеет включен AVX.

От Intel's intro to AVX:

  • Убедитесь, что операционная система поддерживает XGETBV с использованием CPUID.1:ECX.OSXSAVE bit 27 = 1.
  • В то же время, убедитесь, что CPUID.1:ECX bit 28=1 (Intel AVX поддерживается) и/или бит 25 = 1 (AES поддерживается) ... (и другие биты для ФМА, AES и PCLMULQDQ)
  • выпуск XGETBV и убедитесь, что маска с поддержкой функции в битах 1 и 2 равна 11b (состояние XMM и состояние YMM, разрешенное операционной системой ).

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


То же самое верно и для AVX512: вы можете проверить бит функцию CPUID для набора команд, и проверьте, что OS пообещал управлять новым архитектурным состоянием на переключения контекста, позволяя правильные биты с XSETBV. (Поэтому вы должны проверить это с помощью XGETBV).

+0

Так что это означает, что я не могу использовать расширения AVX512 в своих программах под управлением ОС, выпущенных до 2013 года, так как это было объявлено. Вы знаете, какие версии Windows получат обновления, которые позволят им правильно обрабатывать регистры zmm? – Alexey

+3

Собственно, вы должны использовать 'IsProcessorFeaturePresent' и' GetEnabledXStateFeatures', потому что они говорят вам не только о том, существует ли функция ЦП, но также и о том, поддерживает ли ОС. Было бы плохо обнаружить (скажем) поддержку AVX в CPU, а затем использовать инструкции AVX, только чтобы найти, что ваше состояние AVX повреждено при каждом переключении контекста, потому что у ОС нет поддержки переключения контекста AVX. –

+0

@Alexey: для того, чтобы Intel продемонстрировала что-то, потребуется время для протестированной и достаточной доставки корабля. AVX512 по-прежнему отсутствует в каком-либо обычном процессоре, который продается только для многоядерных вещей Knight's Landing. Во всяком случае, я понятия не имею, какая будет поддержка Windows AVX512. Достаточно просто добавить поддержку ОС для сохранения/восстановления дополнительного состояния. Просто установите еще несколько битов функций для XSAVE/XRSTOR, а CPU сохранит дополнительное состояние. –

Смежные вопросы