gcc, simd встроенные функции и понятия fast-math - PullRequest
11 голосов
/ 11 февраля 2011

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

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

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

Когда я использую mfpmath , mssen и / или март , чтобы включить код 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, но, в частности, как?Другие стандартные функции используются?Какая-то другая библиотека связана?Или просто пара флагов где-то установлена, и стандартная библиотека ведет себя по-разному?

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

1 Ответ

6 голосов
/ 11 февраля 2011

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

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

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

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

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

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

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

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

...