Hello,
This is a somewhat simplified version of the code, where I just used 1/real(i) to generate array elements and made the array S symmetric afterward. Then, if I divide S by tmp, the S becomes not symmetric. If I attach the -fp-model stric or -check all option (in addition to -O3), the S becomes symmetric again. The result also becomes symmetric if I multiply by tmp (rather than division).
program test
implicit none
integer :: i
real, parameter :: A(25) = [( 1 / real(i), i=1,25 )]
real :: S(5, 5), tmp
S = reshape(A, [5, 5])
S = ( S + transpose(S) ) / 2
print *, "S(before) = "
print *, S
print *, "symmetric? ", all(abs(S - transpose(S)) <= 0)
tmp = 10
S = S / tmp !! not symmetric (-O3), symmetric (-O3 -fp-model strict or -chek all)
!! S = S * tmp !! symmetric (-O3)
print *
print *, "S(after) = "
print *, S
print *, "symmetric? ", all(abs(S - transpose(S)) <= 0)
print *
print *, "error in symmetry"
print *, abs(S - transpose(S))
end program
I am not familiar with recent ifort options, but apart from the precision stuff, is it possibly related to some optimization that breaks the symmetry of S…?
(I tried it with Compiler explorer here. code + result )