SergeSerge3leo
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору GeorgeMame Цитата: Кстати, автор QD пишет, что надо быть осторожным при применении FMA, но почему, не говорит. | Как бы, FMA (Fused Multiply-Add), в частности, предназначен для повышения точности, типа, вычисление a*b ± c будет содержать только одну ошибку округления. Но... есть нюансы, например в деле sqrt(x**2 - y**2), где x .ge. y. Например: Код: implicit none common /unopt/ m1, m2 volatile m1, m2 real*8 m1, m2 data m1, m2 / 3.00000000000000044d0, 3.00000000000000044d0 / print *, (m1*m1) - (m2*m2) print *, m1*m1 - (m2*m2) print *, (m1*m1) - m2*m2 print *, m1*m1 - m2*m2 stop end | Для управления разрешением и запретом использования FMA в FORTRAN, как и в C++, нет стандартизованых методов. Так что, с этими ключами надо осторожно, результаты бывают неочевидны: Код: $ gfortran-mp-10 -Ofast -fprotect-parens -mavx2 -mfma check_fma.f && ./a.out 0.0000000000000000 -8.8817841970012504E-016 8.8817841970012504E-016 -8.8817841970012504E-016 | Честно говоря, я для gfortran не знаю intrinsic для использования FMA в явном виде, без необходимости в `-Ofast' и/или иных ключей компиляции. |