g++ vs. optimization by hand for complex number multiplication
Compiling with the flag -ffast-math
results in fast performance.
N mult_jomega(musec) mult_jomega_smart(musec) speedup
10 0.00860809 0.00818644 1.05151
100 0.0706683 0.0693907 1.01841
500 0.29569 0.297323 0.994509
1000 0.582059 0.57622 1.01013
2000 1.30809 1.24758 1.0485
10000 7.37559 7.4854 0.98533
Edit: More specifically, it's the -funsafe-math-optimizations
compiler flag. According to the documentation, this flag is used to
allow optimizations for floating-point arithmetic that (a) assume that arguments and results are valid and (b) may violate IEEE or ANSI standards. When
Edit 2: Even more specifically, it is the -fno-signed-zeros
option, which:
Allows optimizations for floating-point arithmetic that ignore the signedness of zero. IEEE arithmetic specifies the behavior of distinct
+0.0
and-0.0
values, which then prohibits simplification of expressions such asx+0.0
or0.0*x
(even with-ffinite-math-only
). This option implies that the sign of a zero result isn’t significant.