Неявное определение не-simd intel intrinsic - PullRequest
0 голосов
/ 20 октября 2018

В следующей ссылке есть раздел для встроенных функций не-simd intel: https://software.intel.com/sites/landingpage/IntrinsicsGuide/

Сюда входят инструкции по сборке, такие как bsf и bsr.Для инструкций SIMD я могу скопировать функцию c и запустить ее после включения правильного заголовка.

Для функций не-simd, таких как _bit_scan_reverse (bsr), я получаю, что эта функция не определена для gcc (неявная)определение).GCC имеет аналогичные «встроенные функции», например, __builtin_ctz, но не _bit_scan_reverse или _mm_popcnt_u32.Почему эти встроенные функции недоступны?

#include <stdio.h>
#include <immintrin.h>

int main(void) {
  int x = 5;
  int y = _bit_scan_reverse (x);
  printf("%d\n",y);
  return 0;
}

1 Ответ

0 голосов
/ 20 октября 2018

Похоже, мне нужно было внести два изменения:

Во-первых, рекомендуется включить 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% пути туда, где я хочу быть.

...