This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC 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]

Re: GCC beaten by ICC in stupid trig test!



On Mar 14, 2004, at 15:39, Scott Robert Ladd wrote:


Hello,

Consider the following program, compiled and run on a Pentium 4 (Northwood) system:

    #include <math.h>
    #include <stdio.h>

    double doit(double a)
    {
        double s = sin(a);
        double c = cos(a);

        // should always be 1
        return s * s + c * c;
    }

    int main(void)
    {
        double a = 1.0, r = 0.0;

        for (int i = 0; i < 100000000; ++i)
            r += doit(a);

        printf("r = %f\n",r);
        return 0;
    }


The point here if you know that it is 1.0 then just return 1.0 instead of trying to
play tricks with trig functions. Yes GCC should do better for trig functions
but in most cases, the developer was just doing something dumb like the above example
which by the way is not a good benchmark anyways because you know that the trig
functions can be reduced to just a load of a constant (as ICC does this transformation
while GCC does not but could).


Actually what is happening here is that the function doit is being inlined and the math in the inner loop is not being pulled out of the loop as it is constant just like a is.
So doing the following (aka forces GCC not to inline) will at least get GCC to be about
the same ball park (but still nowhere near) as ICC. The reason why still is that ICC will just unroll the loop to be "r = doit(a)*100000000.0" so that is the reasons why
ICC is better than GCC at doing this stupid trig test (note this is transformation
is only valid if fast-math is on as you loose precision).


Here is a much better benchmark to try, notice that we are doing more work now but the point is that ICC is going to be the transformation and it not going to see that doit
is constant so it will not pull it out of the loop and it cannot unroll the loop into
just being a constant.



#include <math.h> #include <stdio.h>

    double doit(double a)
    {
        double s = sin(a);
        double c = cos(a);

        return s * c;
    }

    int main(void)
    {
        double a = 1.0, r = 0.0;

        for (int i = 0; i < 100000000; ++i, a++)
            r += doit(a);

        printf("r = %f\n",r);
        return 0;
    }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]