Привет всем :)
Я пытаюсь понять несколько концепций, касающихся операций с плавающей запятой, встроенных функций 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
Теперь вопросы:
- Нужно ли мне когда-нибудь включать x86intrin.h для использования встроенных функций?
- Мне когда-нибудь нужно связывать libm?
- При чем тут быстрая математика? Я понимаю, что это ослабляет стандарт IEEE, но, в частности, как? Другие стандартные функции используются? Связана какая-то другая библиотека? Или где-то выставлена всего пара флагов и стандартная библиотека ведет себя иначе?
Спасибо всем, кто собирается помочь: D