Какие версии Windows поддерживают / требуют каких расширений мультимедийного процессора?

Пока мне удалось выяснить, что:

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

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

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

1 ответ

Решение

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

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

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

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

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


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


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

От вступления Intel к AVX:

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

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


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

Другие вопросы по тегам