[vector] #20: Optimization strategy unclear (-Odph / -O2)
vector
vector at projects.haskell.org
Thu May 20 06:46:05 EDT 2010
#20: Optimization strategy unclear (-Odph / -O2)
----------------------------------------+-----------------------------------
Reporter: choener | Owner:
Type: defect | Status: new
Priority: major | Milestone: 0.7
Version: 0.6 | Resolution:
Keywords: documentation, optimization |
----------------------------------------+-----------------------------------
Comment (by rl):
Gosh, -Odph is really slow here. That can be fixed by manually eta-
expanding the functions. Change
{{{
mean = fini . U.foldl go (T 0 0)
}}}
to
{{{
mean xs = fini (U.foldl go (T 0 0) xs)
}}}
This is because -Odph turns on -finline-if-enough-args which prevents
functions from being inlined if they aren't applied to enough arguments.
This, in turn, leads (.) to not being inlined in this case which is rather
bad. I'm not sure why GHC doesn't eta-expand automatically here. As usual,
this works fine in 6.13.
You are quite right that no fusion will happen if the functions don't get
inlined and that it is thus desirable to give those functions an INLINE
pragma. With 6.12, you then have to make sure that GHC really does inline
them everywhere they are used. This is a bit hard to achieve sometimes, as
evidenced by this discussion. Unfortunately, there is nothing the library
can do about it - it's a compiler problem.
In this particular example, there is a way to keep the functions as they
are in your original program, including INLINE pragmas, by simply changing
{{{
main = defaultMain [ bench "mean 1e5" $ nf mean vec1e5
, bench "mean'1e5" $ nf mean' vec1e5
]
}}}
to
{{{
main = defaultMain [ bench "mean 1e5" $ nf (\xs -> mean xs) vec1e5
, bench "mean'1e5" $ nf (\xs -> mean' xs) vec1e5
]
}}}
Now both functions do get inlined and everything works as expected, both
with -O2 and with -Odph. I should have thought of this earlier.
--
Ticket URL: <http://trac.haskell.org/vector/ticket/20#comment:8>
vector <http://trac.haskell.org/vector>
Package vector
More information about the vector
mailing list