Автоматическая векторизация на двойном и ffast-математике

Почему это обязательно для использования -ffast-math с g ++ для достижения векторизации использования циклов doubles? Мне не нравится -ffast-math потому что я не хочу терять точность.

6
задан phuclv 28 November 2016 в 11:44
поделиться

1 ответ

Очень вероятно, потому что векторизация означает, что у вас могут быть разные результаты, или может означать, что вы пропускаете сигналы / исключения с плавающей запятой.

Если вы компилируете для 32-разрядной x86, то gcc и g++ по умолчанию используют x87 для математики с плавающей запятой, на 64-разрядных они по умолчанию SSE, однако x87 может и будет выдавать разные значения для одного и того же вычисления, поэтому маловероятно, что g++ рассмотрит векторизацию, если не может гарантировать, что вы получите те же результаты, если вы не используете -ffast-math или некоторые из флагов, которые он включает.

В основном это сводится к тому, что среда с плавающей запятой для векторизованного кода может быть не такой же, как для невекторизованного кода, иногда способами, которые важны, если различия не имеют значения для вас, что-то вроде

-fno-math-errno -fno-trapping-math -fno-signaling-nans -fno-rounding-math

, но сначала посмотрите на эти варианты и убедитесь, что они не повлияют на правильность вашей программы. -ffinite-math-only также может помочь

2
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: