[PATCH 3/3] winex11: Use TINN algorithm to speed up colour
lookups. (try 2)
richardvoigt at gmail.com
richardvoigt at gmail.com
Wed May 9 07:36:11 CDT 2007
> But I'm open to any ideas you may have as to how we could avoid using
> floats, yet not run into the overflow situations so easily. We could
> probably use division somewhere but I don't think that's actually any
> better performance-wise.
It is, when implemented via bit-shifts (very cheap). I know wine is
written in pure C, but with a little C++ template magic you should be
able to have fixed-point math that acts like floating, only having the
compiler take care of the binary point at compile-time using the type
system, and emitting only integer operations. Still wouldn't be as
efficient as hand-designed fixed-point pumped through the optimizing
compiler.
I'm pretty sure ints are still much better performance-wise. That
article you cited is not telling the whole story; no operation on a
modern CPU is executed in a single cycle.
The aggregate throughput when considering optimal pipelining may be
one float instruction per cycle... but integer operations routinely
achieve several (on a Core 2 I believe up to four instructions can be
started into the pipelines per cycle, per core). There's also
pipeline stalls and flushes to consider, where I believe further
investigation will again show much bigger performance hits on
floating-point. And no mention of SIMD was made whatsoever, which is
capable of the highest performance in every discussion I've seen.
Furthermore SIMD has built-in support for things like
integer-multiply-keeping-only-the-most-significant-half and
multiply-add, at least on x86 architecture, which if I'm not mistaken
is still a wine requirement for running x86 PE files.
And when you try to save space by using 32-bit float, you lose
everywhere. 32-bit floating-point store involves rounding and is
slow. As a result, compilers maintain high precision as long as
possible, which means you lose repeatability (integer expressions tend
to give the same results with or without optimizations, float -- do
not).
If you go to 64-bit floats, then you should compare against the range
of 64-bit integers, which modern CPUs also support at full speed for
basic operations.
More information about the wine-devel
mailing list