O Fortran Gurus,
A model I work on (GEOS-5) has the standing policy that we should get zero-diff between processors (say, Haswell and Sandybridge). From about Intel 11 to Intel 15.0.2, this was accomplished with (roughly):
-O3 -qopt-report0 -ftz -align all -fno-alias -traceback -fpe0 -fp-model source
Obviously not all of those are important for this but I just copy-and-pasted. Probably -fp-model source is the magic sauce.
But, with Intel 16.0.0, some regression tests I run SLURM put a job on our SandyBridge instead of a Haswell and, hello, non-zero-diff! So I started adding/changing flags like -fp-source strict, -assume protect_parens, setenv MKL_CBWR (a hope since no BLAS or LAPACK is in it, but...), etc. Finally, I found that:
-fimf-arch-consistency=true
added to our FOPT got it working and zero-diff.
My question now is for my own benefit: does anyone know where a good release notes or something would be to figure out why the IMF behavior changed between Intel 15 and 16? I tried looking at the Release Notes for Intel 16 but I don't see anything about "math" or "imf" in it. (A simple nm on the libimf.a definitely shows a difference!)
Again, now that I have a solution, the practical part of me is done with this; it's the inquisitive part that is triggered now.