Похоже, мне нужно было внести два изменения:
Во-первых, рекомендуется включить x86intrin.h
, а не более конкретные включения.По-видимому, это зависит от компилятора и более подробно описано в:
Заголовочных файлах для встроенных функций x86 SIMD
Важно, что вы бы включили другое включение, если не используетеgcc.
Во-вторых, опции компилятора также должны быть включены.Для gcc это подробно описано в:
https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
Хотя документации по многим флагам не хватает.
Поскольку моя цель - распространить скомпилированный двоичный файл, я хотел попробоватьи избегайте -march=native
Большинство "других" внутренностей, которые меня интересуют, связаны с манипулированием битами.Ye Olde Википедия имеет приличную запись важных групп манипулирования битами, таких как bmi2: https://en.wikipedia.org/wiki/Bit_Manipulation_Instruction_Sets
Мне нужен bmi2 для BZHI
(инструкция) или _bzhi_u32
(c)
Таким образом, яможет получить то, что я хочу, с чем-то вроде:
-mavx2 -mbmi2
Использование -mbmi2
кажется достаточным для получения таких вещей, как bmi1 и abm (см. определения на связанных страницах Википедии)хотя я не вижу упоминаний об этом на связанной странице gcc, поэтому я могу ошибаться по этому поводу ... РЕДАКТИРОВАТЬ: Кажется, что добавление поддержки bmi2 не добавляет bmi1 и abm, яВозможно, я использовал вызов __builtin .... Позже мне нужно было явно добавить -mabm
и -mbmi
, чтобы получить нужные мне инструкции.Как предположил Питер Кордес, вероятно, лучше начать с Haswell -march=haswell
в качестве отправной точки, а затем при необходимости добавить дополнительные флаги.Haswell - первый процессор с AVX2 2013 года, поэтому, на мой взгляд, -march=haswell
в основном говорит: я ожидаю, что у вас есть компьютер 2013 года или новее.
Кроме того, на основании некоторого быстрого чтения звучит так, что использование __builtin разрешает необходимые флаги (будущий вопрос для SO), хотя между встроенными и встроенными функциями нет соответствия 1: 1.Точнее говоря, не все встроенные функции, по-видимому, включены в качестве встроенных, что означает, что подход к установке флагов, по-видимому, необходим, а не просто всегда использовать встроенные функции и не беспокоиться об установке флагов.Также полезно знать, какие встроенные функции используются в целях распространения, поскольку кажется, что bmi2 все еще может отсутствовать на значительной части компьютеров (например, нуждающихся в AMD с 2015+ - я думаю).
ЭтоМне все еще не ясно, почему просто использование указанного включения в документации Intel не работает, но эта информация дает мне 99% пути туда, где я хочу быть.