potential for GHC benchmarks w.r.t. optimisations being incorrect
Andreas Klebinger
klebinger.andreas at gmx.at
Sun May 6 14:41:06 UTC 2018
Joachim Breitner schrieb:
> This runs on a dedicated physical machine, and still the run-time
> numbers were varying too widely and gave us many false warnings (and
> probably reported many false improvements which we of course were happy
> to believe). I have since switched to measuring only dynamic
> instruction counts with valgrind. This means that we cannot detect
> improvement or regressions due to certain low-level stuff, but we gain
> the ability to reliably measure *something* that we expect to change
> when we improve (or accidentally worsen) the high-level
> transformations.
While this matches my experience with the default settings, I had good
results by tuning the number of measurements nofib does.
With a high number of NoFibRuns (30+) , disabling frequency scaling,
stopping background tasks and walking away from the computer
till it was done I got noise down to differences of about +/-0.2% for
subsequent runs.
This doesn't eliminate alignment bias and the like but at least it gives
fairly reproducible results.
Sven Panne schrieb:
> 4% is far from being "big", look e.g. at
> https://dendibakh.github.io/blog/2018/01/18/Code_alignment_issues
> <https://dendibakh.github.io/blog/2018/01/18/Code_alignment_issues>
> where changing just the alignment of the code lead to a 10%
> difference. :-/ The code itself or its layout wasn't changed at all.
> The "Producing Wrong Data Without Doing Anything Obviously Wrong!"
> paper gives more funny examples.
>
> I'm not saying that code layout has no impact, quite the opposite. The
> main point is: Do we really have a benchmarking machinery in place
> which can tell you if you've improved the real run time or made it
> worse? I doubt that, at least at the scale of a few percent. To reach
> just that simple yes/no conclusion, you would need quite a heavy
> machinery involving randomized linking order, varying environments (in
> the sense of "number and contents of environment variables"), various
> CPU models etc. If you do not do that, modern HW will leave you with a
> lot of "WTF?!" moments and wrong conclusions.
You raise good points. While the example in the blog seems a bit
constructed with the whole loop fitting in a cache line the principle is
a real concern though.
I've hit alignment issues and WTF moments plenty of times in the past
when looking at micro benchmarks.
However on the scale of nofib so far I haven't really seen this happen.
It's good to be aware of the chance for a whole suite to give
wrong results though.
I wonder if this effect is limited by GHC's tendency to use 8 byte
alignment for all code (at least with tables next to code)?
If we only consider 16byte (DSB Buffer) and 32 Byte (Cache Lines)
relevant this reduces the possibilities by a lot after all.
In the particular example I've hit however it's pretty obvious that
alignment is not the issue. (And I still verified that).
In the end how big the impact of a better layout would be in general is
hard to quantify. Hence the question if anyone has
pointers to good literature which looks into this.
Cheers
Andreas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20180506/cfc792e6/attachment.html>
More information about the ghc-devs
mailing list