gcc, simd встроенные функции и понятия fast-math

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

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

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

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

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

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

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

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

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

1 ответ

Хорошо, я отвечаю за всех, кто изо всех сил пытается понять эти понятия, как я.

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

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

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

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

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

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

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

Другие вопросы по тегам