Все, что новее, чем SSE2 (базовый уровень для x86-64) без проверок во время выполнения, рискованно, если нет резервирования или обнаружения во время установки.
AVX и BMI1 / 2, к сожалению, очень далеки от базовых, потому что Intelвсе еще продает чипы Celeron / Pentium с отключенным декодированием префикса VEX (предположительно, чтобы использовать кремний с дефектами в 256-битных исполнительных блоках), но SSE4.2 становится ближе, и возможен SSSE3.См. Самый последний процессор без поддержки инструкций SSSE3? и Mac OSX minumum с поддержкой sse версии
Все ли 64-битные архитектуры Intel поддерживают SSSE3 / SSE4.Инструкции 1 / SSE4.2? имеет ссылку на Обследование оборудования Valve для клиентов Steam (в настоящее время SSE3 отображается как ~ 100% установленной базы, но SSSE3 только на 97%), так что если вы поставляете компьютерную игру, которая должна очень хорошо соотноситься с вашей целевой аудиторией.Тем не менее, некоторые записи выглядят немного странно.Как сообщается, fcmov
(условное перемещение без ветвления x87) сделало понижение до 97,5%, но это есть у каждого P6-совместимого процессора.Вы не найдете процессор с SSE2, но без FCMOV.Возможно, новые версии Steam не тестируют его.А, может быть, старые версии Steam не тестируют CMPXCHG16B?Поэтому возьмите их с собой, но они, вероятно, достаточно разумны для SSE2 / 3 / SSSE3 / SSE4.x и AVX.
Для серверного оборудования вы можете легко установить SSE4.Минимум 2Atom / Silvermont поддерживают его, как и архитектуры AMD и VIA с низким энергопотреблением, поэтому энергоэффективные серверы могут работать на нем.Старые традиционные центральные процессоры, как правило, не слишком часто используются серверами за пределами личного домашнего сервера, потому что они часто работают медленнее, чем более дешевая современная машина с кулером.
(Silvermont вряд ли будет поддерживатьAVX скоро, еще меньше AVX2 или FMA.)
У вас нет , чтобы ограничиться одним двоичным файлом. Вы могли бы даже позволить людям выбиратькогда они загружаются, или ваш установщик может выбрать во время установки.
Или у вас может быть оболочка во время выполнения, которая выбирает исполняемые и динамические библиотеки, так что вы эффективно получаете диспетчерскую диспетчеризацию, все еще имея возможность компилировать с gcc -O3 -march=haswell
или что угодно, чтобы компилятор мог использовать новые наборы команд повсеместно (особенно полезно для BMI1 / BMI2 для эффективных сдвигов с переменным числом операций за один раз).
Другим вариантом являются трюки с динамическим компоновщиком, либо надля всей библиотеки или для каждой функции, которую использует glibc для разрешения memcpy
в __memset_avx2_unaligned_erms
. отчет о перфекте показывает, что эта функция "__memset_avx2_unaligned_erms" содержит служебные данные.Означает ли это, что память не выровнена?
Все это (кроме трюков динамического компоновщика для каждой функции) проще, чем информирование вашего кода о расширениях набора команд во время выполнения, и приводит к нулевым издержкам производительности.(Если вы не поместите материал в динамическую библиотеку, если у вас не было бы другого, поэтому он не может быть встроенным.)