Доля рынка микроархитектуры x86 /SIMD
Где я могу найти данные о "доле рынка" микроархитектур x86? Какой процент пользователей процессоров семейства x86 имеет CPU, поддерживающие SSE4.2, AVX, AVX2 и т. Д.?
Я распространяю предварительно скомпилированные двоичные файлы для своей программы, и я хотел бы знать, какова лучшая цель оптимизации и какие расширения SIMD можно разумно использовать без проверок во время выполнения.
Я могу найти общие данные о доле рынка Intel и AMD, но не разбивку поколений процессоров Intel и AMD. В идеале я хотел бы разбить данные по каждой ОС и каждой стране, но даже общая глобальная статистика микроархитектур была бы лучше, чем ничего.
2 ответа
Все, что новее, чем 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 Hardware Surve для клиентов Steam (в настоящее время SSE3 показывается как ~100% установленной базы, но SSSE3 только на 97%), так что если вы поставляете игру для ПК, которая должна очень хорошо соотноситься с вашей целевой аудиторией. Тем не менее, некоторые записи немного странны. подобно fcmov
(x87lessless условное перемещение), как сообщается,снизилось до 97,5%, но у каждого P6-совместимого процессора есть. Вы не найдете процессор с SSE2, но без FCMOV. Возможно, новые версии Steam не тестируют его. И, возможно, старые версии Steam не тестируют CMPXCHG16B? Поэтому возьмите их с небольшим количеством соли, но они, вероятно, достаточно разумны для SSE2/3/SSSE3/SSE4.x и AVX.
Что касается сервера, вы можете легко установить минимум SSE4.2. Atom/Silvermont поддерживают его, как и архитектуры AMD и VIA с низким энергопотреблением, поэтому его могут использовать энергосберегающие серверы. Старые традиционные центральные процессоры обычно не используются для серверов вне личного домашнего сервера, потому что они часто работают медленнее, чем более дешевая современная машина, которая работает круче.
(Silvermont вряд ли скоро поддержит AVX, тем более AVX2 или FMA.)
Вам ненужно ограничивать себя одним двоичным файлом. Вы можете даже позволить пользователям выбирать при загрузке, или ваш установщик может выбрать во время установки.
Или у вас может быть оболочка во время выполнения, которая выбирает исполняемые и динамические библиотеки, так что вы эффективно получаете диспетчеризацию во время выполнения, все еще имея возможность компилировать сgcc -O3 -march=haswell
или что угодно, чтобы компилятор мог использовать новые наборы инструкций повсеместно (особенно полезно для BMI1/BMI2 для эффективных сдвигов с переменным числом операций в один шаг).
Другой вариант - динамические трюки с компоновщиком, либо на основе целой библиотеки, либо на основе функций, которые glibc использует для разрешенияmemcpy
в__memset_avx2_unaligned_erms
, Отчет perf показывает, что эта функция "__memset_avx2_unaligned_erms" имеет дополнительные издержки. это значит, что память не выровнена?
Все это (за исключением трюков с динамическими компоновщиками для каждой функции) проще, чем информирование вашего кода о расширениях набора команд во время выполнения, и приводит к снижению производительности. (Если вы не поместите материал в динамическую библиотеку, если у вас не было бы иначе, поэтому он не может быть встроенным.)
Простой способ решить эту проблему (выступая в качестве программиста для игр) - просто скомпилировать двоичные файлы для каждого уровня ЦП, который вы хотите поддерживать (например, SSE2, SSE4, AVX2). "Исполняемый файл" для игры - это просто проверка cpuid, которая затем запускает правильный exe в зависимости от того, какой процессор обнаружен.