Gcc, simd intrinsics и быстрые математические концепции

Привет всем:)
Я пытаюсь найти несколько концепций относительно плавающей запятой, SIMD/math intrinsics и быстрого математического флага для gcc. В частности, я использую MinGW с gcc v4.5.0 на процессоре x86.

Я искал вокруг какое-то время, и то, что я (думаю, я) понимаю на данный момент:

Когда я компилирую без флагов, любой fp-код будет стандартным x87, не будет работать с simd, а функции math.h будут связаны с msvcrt.dll.

Когда я использую mfpmath, mssen и/или марш, чтобы получить код mmx/sse/avx, gcc фактически использует команды simd только, если я также укажу некоторые флаги оптимизации, такие как On или ftree- векторизовать. В этом случае внутренности выбираются автоматически с помощью gcc, а некоторые математические функции (я все еще говорю о стандартных математических функциях на math.h) станут внутренними или оптимизированными встроенным кодом, некоторые другие будут по-прежнему поступать из msvcrt. длл. Если я не укажу флаги оптимизации, любое из этих изменений?

Когда я использую конкретные типы данных simd (доступные как gcc-расширения, такие как v4si или v8qi), у меня есть возможность напрямую вызвать встроенные функции или снова оставить автоматическое решение gcc. Gcc все еще может выбрать стандартный код x87, если я не разрешаю инструкции simd через соответствующие флаги. Опять же, если я не укажу флаги оптимизации, любое из этих изменений?

Plese исправьте меня, если какое-либо из моих утверждений неверно: p

Теперь вопросы:

  • Должен ли я включать x86intrin.h для использования встроенных функций?
  • Должен ли я когда-либо связывать libm?
  • Какая быстрая математика имеет отношение ко всему? Я понимаю, что он расслабляет стандарт IEEE, но, в частности, как? Используются другие стандартные функции? Некоторые другие библиотеки связаны? Или это всего лишь пара флагов, установленных где-то, а стандартный lib ведет себя по-другому?

Спасибо всем, кто собирается помочь: D

Ответ 1

Хорошо, я для тех, кто немного пытается понять эти понятия, как я.

Оптимизации с Ox работают над любым кодом, fpu или sse

fast-math, похоже, работает только с кодом x87. Кроме того, похоже, что это не изменяет управляющее слово fpu o_O

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

libm.a используется для некоторых вещей, которые не включены в glibc, но с mingw это просто фиктивный файл, поэтому на данный момент бесполезно ссылаться на него

Использование специальных векторных типов gcc представляется полезным только при непосредственном вызове intrinsics, иначе код все равно будет векторизован.

Любая коррекция приветствуется:)

Полезные ссылки:
fpu/sse control
gcc math
и руководство gcc на "Расширениях векторов", "Встроенные функции X86" и "Другие встроенные функции"