This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
On Fri, Jul 10, 2015 at 05:09:16PM +0100, Wilco Dijkstra wrote:
> > OndÅej BÃlka wrote:
> > On Mon, Jul 06, 2015 at 03:50:11PM +0100, Wilco Dijkstra wrote:
> > >
> > >
> > > > OndÅej BÃlka wrote:
> > > > But with latency hiding by using argument first suddenly even isnan and
> > > > isnormal become regression.
> > > >
>
> That doesn't look correct - it looks like this didn't use the built-ins at all,
> did you forget to apply that patch?
>
No, from what you wrote I expected that patch already tests builtins
which doesn't. Applied patch and got different results. When I added
patch results are similar.
> Anyway I received a new machine so now GLIBC finally builds for x64. Since
> there appear large variations from run to run I repeat the same tests 4 times
> by copying the FOR_EACH_IMPL loop. The first 1 or 2 are bad, the last 2
> converge to useable results. So I suspect frequency scaling is an issue here.
>
> Without the sin(tmp) part I get:
>
> remainder_test2_t: 40786.9 192862
> remainder_test1_t: 43008.2 196311
> __fpclassify_test2_t: 2856.56 3020.12
> __fpclassify_test1_t: 3043.53 3135.89
> __fpclassify_t: 12500.6 10152.5
> fpclassify_t: 2972.54 3047.65
> __isnormal_inl2_t: 4619.55 14491.1
> __isnormal_inl_t: 12896.3 10306.7
> isnormal_t: 4254.42 3667.87
> __finite_inl_t: 3979.58 3991.6
> __finite_t: 7039.61 7039.37
> isfinite_t: 2992.65 2969.25
> __isinf_inl_t: 2852.1 3239.23
> __isinf_t: 8991.81 8813.44
> isinf_t: 3241.75 3241.54
> __isnan_inl_t: 4003.51 3977.73
> __isnan_t: 7054.54 7054.5
> isnan_t: 2819.66 2801.94
>
> And with the sin() addition:
>
> remainder_test2_t: 105093 214635
> remainder_test1_t: 106635 218012
> __fpclassify_test2_t: 64290.9 32116.6
> __fpclassify_test1_t: 64365.1 32310.2
> __fpclassify_t: 72006.1 41607
> fpclassify_t: 64190.3 33450.1
> __isnormal_inl2_t: 65959.1 33672
> __isnormal_inl_t: 71875.7 41727.3
> isnormal_t: 65676.1 32826.1
> __finite_inl_t: 69600.6 35293.3
> __finite_t: 67653.8 38627.2
> isfinite_t: 64435.9 34904.9
> __isinf_inl_t: 68556.6 33176
> __isinf_t: 69066.4 39562.7
> isinf_t: 64755.5 34244.6
> __isnan_inl_t: 69577.3 34776.2
> __isnan_t: 67538.8 38321.3
> isnan_t: 63963 33276.6
>
> The remainder test is basically math/w_remainder.c adapted to use __isinf_inl
> and __isnan_inl (test1) or the isinf/isnan built-ins (test2).
>
Which still doesn't have to mean anything, only if you test a
application that frequently uses these you will get result without
doubt.
Here a simple modification produces different results. One of many
objections is that by simply adding gcc will try to make branchless code
like converting that to res += 5 * (isnan(tmp)). So use more difficult
branch and and with following two I get __builtin_isinf lot slower.
{ double tmp = p[i] * 2.0; \
res += 3 * sin (tmp); if (func (tmp)) res += 3* sin (2 * tmp) ;} \
{ double tmp = p[i] * 2.0; \
if (func (tmp)) res += 3 * sin (2 * tmp) ;} \
__fpclassify_test2_t: 4645.32 34549.8
__fpclassify_test1_t: 4858.35 35682
__fpclassify_t: 12959.6 9402.96
fpclassify_t: 6163.18 3573.92
__isnormal_inl2_t: 72463.8 14535.8
__isnormal_inl_t: 78154.4 10665.7
isnormal_t: 72172.7 3978.68
__finite_inl_t: 69525.5 2048.91
__finite_t: 75383.9 10260.5
isfinite_t: 71913.3 3449.38
__isinf_inl_t: 2279.96 19166.1
__isinf_t: 10462.3 32308.5
isinf_t: 3706.35 22804.2
__isnan_inl_t: 2376.56 20769.1
__isnan_t: 9558.7 23683.9
isnan_t: 2025.91 19824.9
and
__fpclassify_test2_t: 69720.7 70690
__fpclassify_test1_t: 69575.2 57032
__fpclassify_t: 12839.1 9460.82
fpclassify_t: 6136.18 3355.79
__isnormal_inl2_t: 133754 34673.9
__isnormal_inl_t: 137851 41468.9
isnormal_t: 133421 37423.4
__finite_inl_t: 131153 34229.9
__finite_t: 135990 39609.5
isfinite_t: 132679 34604.8
__isinf_inl_t: 66901.3 44636.5
__isinf_t: 74330.2 53375.7
isinf_t: 68432.6 45350.5
__isnan_inl_t: 67125.3 43663.6
__isnan_t: 71864.2 49792.7
isnan_t: 67107.9 42478.3
> >From this it seems that __isinf_inl is slightly better than the builtin, but
> it does not show up as a regression when combined with sin or in the remainder
> test.
>
That doesn't hold generaly as remainder test it could be just caused by
isnan being slower than isinf.
> So I don't see any potential regression here on x64 - in fact it looks like
> inlining using the built-ins gives quite good speedups across the board. And
> besides inlining applications using GLIBC it also inlines a lot of callsites
> within GLIBC that weren't previously inlined.
>
That doesn't mean anything as this is still poor benchmark. It only uses
tight loop which doesn't measure cost of loading constants for example.
> > > Basically GCC does the array read and multiply twice just like you told it
> > > to (remember this is not using -ffast-math). Also avoid adding unnecessary
> > > FP operations and conversions (which may interact badly with timing the
> > > code we're trying to test).
> > >
> > And how do you know that most users don't use fp conversions in their
> > code just before isinf? These interactions make benchtests worthless as
> > in practice a different variant would be faster than one that you
> > measure.
>
> You always get such interactions, it's unavoidable. That's why I added some
> actual math code that uses isinf/isnan to see how it performs in real life.
>
> > > For me the fixed version still shows the expected answer: the built-ins are
> > > either faster or as fast as the inlines. So I don't think there is any
> > > regression here (remember also that previously there were no inlines at all
> > > except for a few inside GLIBC, so the real speedup is much larger).
> >
> > Thats arm only. So it looks that we need platform-specific headers and testing.
>
> Well I just confirmed the same gains apply to x64.
>
No, that doesn't confirm anything yet. You need to do more extensive
testing to get somewhat reliable answer and still you won't be sure.
I asked you to run on arm my benchmark to measure results of inlining.
I attached again version. You should run it to see how results will differ.
Attachment:
tf
Description: Text document
Attachment:
ft.c
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |