Расширения, предлагающие новое архитектурное состояние, требуют специальной поддержки ОС, поскольку ОС должна сохранять/восстанавливать восстановление данных на коммутаторах контекста. Поэтому с точки зрения ОС нет ничего лишнего, что нужно сделать, чтобы код пользовательского пространства запускал инструкции 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).
@ downvoters: Это не плохой вопрос, по сравнению с большинством, даже если он не имеет очень интересного ответа. ОП не знал этого, или он не спросил бы. Это ясно, и похоже, что ОП пытался исследовать, но не знал, что искать (потому что он еще не знает ответа на вопрос: P) Я вижу, что закрываю его как вне темы для SO/migrate к SU, но не к downvotes. –
Я не думаю, что это вопрос SU, я сомневаюсь, что кодирование в сборке - это то, что делают даже самые суперпользователи. Я передумаю вопрос, чтобы было более ясно, что я пытаюсь использовать коды операций в своих программах. – Alexey
Я не вижу, как этот вопрос просто «об общем вычислительном программном обеспечении». Единственный факт, что он содержит «Windows», не означает, что здесь нет темы. Это вопрос о платформах с точки зрения программистов, и это явно важно для тех, кто кодирует SSE/AVX и т. Д. – stgatilov