gcc, встроенные функции simd и концепции быстрой математики

Привет всем :)
Я пытаюсь понять несколько концепций, касающихся операций с плавающей запятой, встроенных функций SIMD / math и флага fast-math для 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. dll. Если я не укажу флаги оптимизации, изменится ли что-нибудь из этого?

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

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

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

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

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


person rocket441    schedule 11.02.2011    source источник
comment
3. найдите здесь пример: stackoverflow.com/questions/4956033/ оптимизация с умножением на 0   -  person Anycorn    schedule 11.02.2011


Ответы (1)


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

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

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

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

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

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

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

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

person rocket441    schedule 11.02.2011
comment
так как gcc теперь на v4.7, как я написал в конце, любые исправления по-прежнему приветствуются :) - person rocket441; 25.07.2012
comment
Для gcc на 32-битной платформе x86 вы должны использовать -msse2 или -march=whatever, чтобы разрешить использование математики SSE / SSE2. Затем, чтобы компилятор действительно использовал его, вы используете -mfpmath=sse. gcc на x86-64 уже использует SSE / SSE2 для float / double по умолчанию, потому что ABI передает и возвращает аргументы float и double в регистрах XMM, а не в стеке x87. - person Peter Cordes; 20.11.2016