This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: GCC beaten by ICC in stupid trig test!
- From: Andrew Pinski <pinskia at physics dot uc dot edu>
- To: Scott Robert Ladd <coyote at coyotegulch dot com>
- Cc: gcc at gcc dot gnu dot org, Andrew Pinski <pinskia at physics dot uc dot edu>
- Date: Sun, 14 Mar 2004 16:12:06 -0800
- Subject: Re: GCC beaten by ICC in stupid trig test!
- References: <4054ED19.8020009@coyotegulch.com>
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;
}