Почему это обязательно для использования -ffast-math
с g ++ для достижения векторизации использования циклов double
s? Мне не нравится -ffast-math
потому что я не хочу терять точность.
Очень вероятно, потому что векторизация означает, что у вас могут быть разные результаты, или может означать, что вы пропускаете сигналы / исключения с плавающей запятой.
Если вы компилируете для 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
также может помочь