2

У меня есть приложение, предназначенное для развертывания широкого семейства процессоров Intel от архаичных (Pentium, Pentium II) до современных (Haswell, Skylake). Он содержит специальные пути кода, предназначенные для различных расширений для набора команд x86 (SSE, AVX и т. Д.). Тем не менее, у меня есть доступ только к компьютерам, относящимся к Sandy Bridge, и не могу проверить, действительно ли приложение будет работать на старых поддерживаемых архитектурах. Хотя верно, что процессоры, которые старые вряд ли будут полезны для каких-либо целей, было бы хорошо с точки зрения качества кода знать, что функция с именем my_routine_sse2 не случайно использует инструкции из SSE3 или таких.Проверка совместимости с устаревшими процессорами Intel

Какие подходы люди обычно предпринимают, сталкиваясь с такой проблемой? Существуют ли автоматические инструменты, которые будут сканировать функции и гарантировать, что незаконных инструкций нет? Существуют ли службы (сети или другие), которые обеспечивают доступ к устаревшим компьютерным архитектурам для тестирования и отладки?

+1

http://bochs.sourceforge.net/ –

+0

Фактически, применение приложения под руководством Bochs, вероятно, будет слишком медленным для активного развития. Однако это может быть сделано для подтверждения выпуска. – 68ejxfcj5669

+1

Я полагаю, что запуск Boch на современном процессоре будет, по крайней мере, столь же быстрым, как работа на устаревшем встроенном CPU (для проверки, как вы упомянули). Не уверен, хотя. –

ответ

2

Проведите модульные тесты, которые могут работать под боч, чтобы проверить все ваши функции my_routine_sse2 и т. Д.

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

BTW, указатели функций очень хороши для диспетчеризации процессора. При запуске проверьте CPUID и установите некоторые указатели на функции. Более поздние функции вызывают функции указателей, чтобы получить любую версию функции, которую диспетчер выбрал для этого хоста. Тогда у вас нет дерева условных ветвей, где вы хотите использовать функцию с оптимизированными версиями. x264 (видеокодер с открытым кодом h.264) использует этот метод для своей обширной коллекции подпрограмм asm.


Вы правы, что ваши функции SSE2 не должны выходить за пределы SSE2, но если вы установите базовый уровень на SSE2, вы можете использовать его везде без проверки. Авто-векторизация иногда может делать приятные вещи. Если вы используете с плавающей запятой, вы можете получить gcc для использования другого ABI, где float/double передаются/возвращаются в регистры SSE вместо x87. (Или, может быть, все еще прошло в стеке, как и другие вещи в устаревшем 32-битном x86 ABI.)

Все процессоры в течение последних 10 лет могут запускать 64-битный код, хотя некоторые из них имеют 32-битную Windows на процессорах на более новых процессорах. К сожалению, по-прежнему обычно требуется 32-битная сборка для людей с устаревшими системами.

SSE2 может быть разумным выбором для базовой линии. Новейшими процессорами, которые вы исключали бы, являются процессоры AMD AthlonXP сразу перед первыми ядрами AMD64 k8.

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